NuPlayer: handle audio output format change in a clean way.
Test: manually run mediaplayer test
Bug: 32659046
Change-Id: I5935ead79e3f3d2ccb47d9fe5c5ffe489755dcad
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index d2452af..3da5030 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -203,6 +203,18 @@
break;
}
+ case kWhatAudioOutputFormatChanged:
+ {
+ if (!isStaleReply(msg)) {
+ status_t err;
+ if (msg->findInt32("err", &err) && err != OK) {
+ ALOGE("Renderer reported 0x%x when changing audio output format", err);
+ handleError(err);
+ }
+ }
+ break;
+ }
+
case kWhatSetVideoSurface:
{
sp<AReplyToken> replyID;
@@ -711,15 +723,10 @@
flags = AUDIO_OUTPUT_FLAG_NONE;
}
- // TODO: This is a temporary fix to flush audio buffers in renderer. The real
- // fix should be to wait for all buffers rendered normally, then open a new
- // AudioSink.
- mRenderer->flush(true /* audio */, false /* notifyComplete */);
- status_t err = mRenderer->openAudioSink(
- format, false /* offloadOnly */, hasVideo, flags, NULL /* isOffloaed */);
- if (err != OK) {
- handleError(err);
- }
+ sp<AMessage> reply = new AMessage(kWhatAudioOutputFormatChanged, this);
+ reply->setInt32("generation", mBufferGeneration);
+ mRenderer->changeAudioFormat(
+ format, false /* offloadOnly */, hasVideo, flags, reply);
}
}