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.
This commit is contained in:
Dave Sparks
2009-12-09 20:20:26 -08:00
parent d3cfb1bd84
commit 14f8940472

View File

@@ -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();
}