diff --git a/frameworks/asf_extractor/AsfExtractor.cpp b/frameworks/asf_extractor/AsfExtractor.cpp
index 9a10581..1bdf0a0 100644
--- a/frameworks/asf_extractor/AsfExtractor.cpp
+++ b/frameworks/asf_extractor/AsfExtractor.cpp
@@ -43,6 +43,17 @@
 
 namespace android {
 
+// The audio format tags that represent the input categories supported
+// by the Windows Media Audio decoder, don't change it
+enum WMAAudioFormats {
+    WAVE_FORMAT_MSAUDIO1         = 0x160,
+    WAVE_FORMAT_WMAUDIO2         = 0x161,
+    WAVE_FORMAT_WMAUDIO3X        = 0x162,
+    WAVE_FORMAT_WMAUDIO_LOSSLESS = 0x163,
+    WAVE_FORMAT_WMAVOICE9        = 0x000A,
+    WAVE_FORMAT_WMAVOICE10       = 0x000B,
+};
+
 class ASFSource : public MediaSource  {
 public:
     ASFSource(const sp<AsfExtractor> &extractor, int trackIndex)
@@ -173,9 +184,11 @@
         return BAD_VALUE;
     }
 
+    int64_t seekTimeUs;
+    MediaSource::ReadOptions::SeekMode mode;
     if (!mParser->hasVideo() || (mParser->hasVideo() && mHasIndexObject)) {
-        if (options != NULL) {
-            status_t err = seek_l(track, options);
+        if (options != NULL  && options->getSeekTo(&seekTimeUs, &mode)) {
+            status_t err = seek_l(track, seekTimeUs, mode);
             if (err != OK) {
                 return err;
             }
@@ -273,9 +286,13 @@
         }
     }
 
-    if (mParser->hasVideo() || mParser->hasAudio()) {
+    if (mParser->hasVideo()) {
         ALOGV("MEDIA_MIMETYPE_CONTAINER_ASF");
         mFileMetaData->setCString(kKeyMIMEType, MEDIA_MIMETYPE_CONTAINER_ASF);
+    } else if (mParser->hasAudio() && mParser->getAudioInfo()->codecID >= WAVE_FORMAT_MSAUDIO1 &&
+               mParser->getAudioInfo()->codecID <= WAVE_FORMAT_WMAUDIO_LOSSLESS) {
+        LOGV("MEDIA_MIMETYPE_AUDIO_WMA", mParser->getAudioInfo()->codecID);
+        mFileMetaData->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_WMA);
     } else {
         ALOGE("Content does not have neither audio nor video.");
         return ERROR_UNSUPPORTED;
@@ -354,20 +371,20 @@
 static const char* CodecID2MIME(uint32_t codecID) {
     switch (codecID) {
         // WMA version 1
-        case 0x0160:
+        case WAVE_FORMAT_MSAUDIO1:
         // WMA version 2 (7, 8, 9 series)
-        case 0x0161:
+        case WAVE_FORMAT_WMAUDIO2:
         // WMA 9/10 profressional (WMA version 3)
-        case 0x0162:
+        case WAVE_FORMAT_WMAUDIO3X:
             return MEDIA_MIMETYPE_AUDIO_WMA;
         // WMA 9 lossless
-        case 0x0163:
+        case WAVE_FORMAT_WMAUDIO_LOSSLESS:
             //return MEDIA_MIMETYPE_AUDIO_WMA_LOSSLESS;
             return MEDIA_MIMETYPE_AUDIO_WMA;
         // WMA voice 9
-        case 0x000A:
+        case WAVE_FORMAT_WMAVOICE9:
         // WMA voice 10
-        case 0x000B:
+        case WAVE_FORMAT_WMAVOICE10:
             ALOGW("WMA voice 9/10 is not supported.");
             return "audio/wma-voice";
         default:
@@ -378,8 +395,7 @@
 
 
 status_t AsfExtractor::setupTracks() {
-    ALOGW("Audio is temporarily disabled!!!!!!!!!!!!!!");
-    AsfAudioStreamInfo* audioInfo = NULL;//mParser->getAudioInfo();
+    AsfAudioStreamInfo* audioInfo = mParser->getAudioInfo();
     AsfVideoStreamInfo* videoInfo = mParser->getVideoInfo();
     Track* track;
     while (audioInfo || videoInfo) {
@@ -401,10 +417,22 @@
         track->bufferPool = new MediaBufferPool;
 
         if (audioInfo) {
+            LOGV("streamNumber = %d\n, encryptedContentFlag= %d\n, timeOffset = %lld\n,
+                  codecID = %d\n, numChannels=%d\n, sampleRate=%d\n, avgBitRate = %d\n,
+                  blockAlignment =%d\n, bitsPerSample=%d\n, codecDataSize=%d\n",
+                  audioInfo->streamNumber, audioInfo->encryptedContentFlag,
+                  audioInfo->timeOffset, audioInfo->codecID, audioInfo->numChannels,
+                  audioInfo->sampleRate, audioInfo->avgByteRate*8, audioInfo->blockAlignment,
+                  audioInfo->bitsPerSample, audioInfo->codecDataSize);
+
             track->streamNumber = audioInfo->streamNumber;
             track->encrypted = audioInfo->encryptedContentFlag;
             track->meta->setInt32(kKeyChannelCount, audioInfo->numChannels);
             track->meta->setInt32(kKeySampleRate, audioInfo->sampleRate);
+            track->meta->setInt32(kKeyWmaBlockAlign, audioInfo->blockAlignment);
+            track->meta->setInt32(kKeyBitPerSample, audioInfo->bitsPerSample);
+            track->meta->setInt32(kKeyBitRate, audioInfo->avgByteRate*8);
+            track->meta->setInt32(kKeyWmaFormatTag, audioInfo->codecID);
 
             if (audioInfo->codecDataSize) {
                 track->meta->setData(
@@ -452,7 +480,7 @@
     return OK;
 }
 
-status_t AsfExtractor::seek_l(Track* track, const MediaSource::ReadOptions *options) {
+status_t AsfExtractor::seek_l(Track* track, int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode) {
     Mutex::Autolock lockSeek(mReadLock);
 
     // It is expected seeking will happen on all the tracks with the same seeking options.
@@ -470,11 +498,6 @@
         track->seekCompleted = false;
         return OK;
     }
-    int64_t seekTimeUs;
-    MediaSource::ReadOptions::SeekMode mode;
-    if(!options->getSeekTo(&seekTimeUs,&mode)) {
-       return OK;
-    }
 
     uint64_t targetSampleTimeUs = 0;
 
diff --git a/frameworks/asf_extractor/AsfExtractor.h b/frameworks/asf_extractor/AsfExtractor.h
index adb8e9d..4e17083 100644
--- a/frameworks/asf_extractor/AsfExtractor.h
+++ b/frameworks/asf_extractor/AsfExtractor.h
@@ -105,7 +105,7 @@
     status_t setupTracks();
     inline Track* getTrackByTrackIndex(int index);
     inline Track* getTrackByStreamNumber(int stream);
-    status_t seek_l(Track* track, const MediaSource::ReadOptions *options);
+    status_t seek_l(Track* track, int64_t seekTimeUs, MediaSource::ReadOptions::SeekMode mode);
     status_t read_l(Track *track, MediaBuffer **buffer);
     status_t readPacket();
 };
diff --git a/frameworks/asf_extractor/MetaDataExt.h b/frameworks/asf_extractor/MetaDataExt.h
index 6476b9b..bee1431 100644
--- a/frameworks/asf_extractor/MetaDataExt.h
+++ b/frameworks/asf_extractor/MetaDataExt.h
@@ -22,7 +22,7 @@
 
 namespace android {
 
-#define MEDIA_MIMETYPE_AUDIO_WMA        "audio/wma"
+#define MEDIA_MIMETYPE_AUDIO_WMA        "audio/x-ms-wma"
 #define MEDIA_MIMETYPE_AUDIO_AC3        "audio/ac3"
 #define MEDIA_MIMETYPE_VIDEO_WMV        "video/wmv"
 #define MEDIA_MIMETYPE_CONTAINER_ASF    "video/x-ms-asf"
