From 14f8940472217e8b0164d8f213679710d623d528 Mon Sep 17 00:00:00 2001 From: Dave Sparks Date: Wed, 9 Dec 2009 20:20:26 -0800 Subject: [PATCH] Fix media player decode function. Bug 2317821. There was a recent change to OpenCORE that broke the MediaPlayer::decode() function for all OpenCORE supported formats (MP3, AAC, and AMR-NB/WB). The affect is that SoundPool is unreliable for all of these formats. This patch changes the logic in the AudioCache object that processes messages from the media player. The old logic was fragile. This change should make it more robust against changes. --- .../MediaPlayerService.cpp | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 0a6c365df5ada..df673a4dbb852 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1573,12 +1573,14 @@ status_t MediaPlayerService::AudioCache::open( uint32_t sampleRate, int channelCount, int format, int bufferCount, AudioCallback cb, void *cookie) { + LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); if (cb != NULL) { return UNKNOWN_ERROR; // TODO: implement this. } + if (mHeap->getHeapID() < 0) { + return NO_INIT; + } - LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); - if (mHeap->getHeapID() < 0) return NO_INIT; mSampleRate = sampleRate; mChannelCount = (uint16_t)channelCount; mFormat = (uint16_t)format; @@ -1627,16 +1629,24 @@ void MediaPlayerService::AudioCache::notify(void* cookie, int msg, int ext1, int AudioCache* p = static_cast(cookie); // ignore buffering messages - if (msg == MEDIA_BUFFERING_UPDATE) return; - - // set error condition - if (msg == MEDIA_ERROR) { + switch (msg) + { + case MEDIA_ERROR: LOGE("Error %d, %d occurred", ext1, ext2); p->mError = ext1; + break; + case MEDIA_PREPARED: + LOGV("prepared"); + break; + case MEDIA_PLAYBACK_COMPLETE: + LOGV("playback complete"); + break; + default: + LOGV("ignored"); + return; } // wake up thread - LOGV("wakeup thread"); p->mCommandComplete = true; p->mSignal.signal(); }