summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorDave Sparks <davidsparks@android.com>2009-12-09 20:20:26 -0800
committerDave Sparks <davidsparks@android.com>2009-12-09 20:36:31 -0800
commit14f8940472217e8b0164d8f213679710d623d528 (patch)
tree64434e0d6949d3545490e90f0fb37bb0165971a3 /media/libmediaplayerservice
parentd3cfb1bd84affbf740256f5e9804c93ef7722b37 (diff)
downloadframeworks_base-14f8940472217e8b0164d8f213679710d623d528.zip
frameworks_base-14f8940472217e8b0164d8f213679710d623d528.tar.gz
frameworks_base-14f8940472217e8b0164d8f213679710d623d528.tar.bz2
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.
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0a6c365..df673a4 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<AudioCache*>(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();
}