diff options
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 16 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 3 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 28 |
3 files changed, 41 insertions, 6 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 0ecfb1e..abbbc20 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -45,6 +45,7 @@ #include <utils/Timers.h> #include <utils/Vector.h> +#include <media/AudioPolicyHelper.h> #include <media/IMediaHTTPService.h> #include <media/IRemoteDisplay.h> #include <media/IRemoteDisplayClient.h> @@ -1351,6 +1352,10 @@ MediaPlayerService::AudioOutput::AudioOutput(int sessionId, int uid, int pid, mFlags(AUDIO_OUTPUT_FLAG_NONE) { ALOGV("AudioOutput(%d)", sessionId); + if (attr != NULL) { + mStreamType = audio_attributes_to_stream_type(attr); + } + setMinBufferCount(); } @@ -1464,6 +1469,17 @@ String8 MediaPlayerService::AudioOutput::getParameters(const String8& keys) void MediaPlayerService::AudioOutput::setAudioAttributes(const audio_attributes_t * attributes) { Mutex::Autolock lock(mLock); mAttributes = attributes; + if (attributes != NULL) { + mStreamType = audio_attributes_to_stream_type(attributes); + } +} + +void MediaPlayerService::AudioOutput::setAudioStreamType(audio_stream_type_t streamType) +{ + // do not allow direct stream type modification if attributes have been set + if (mAttributes == NULL) { + mStreamType = streamType; + } } void MediaPlayerService::AudioOutput::deleteRecycledTrack_l() diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 9e6ca52..1c32597 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -107,8 +107,7 @@ class MediaPlayerService : public BnMediaPlayerService virtual void flush(); virtual void pause(); virtual void close(); - void setAudioStreamType(audio_stream_type_t streamType) { - mStreamType = streamType; } + void setAudioStreamType(audio_stream_type_t streamType); virtual audio_stream_type_t getAudioStreamType() const { return mStreamType; } void setAudioAttributes(const audio_attributes_t * attributes); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 3e0ee08..2fdc196 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -1071,6 +1071,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { CHECK(msg->findInt32("audio", &audio)); ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); + if (audio && (mFlushingAudio == NONE || mFlushingAudio == FLUSHED + || mFlushingAudio == SHUT_DOWN)) { + // Flush has been handled by tear down. + break; + } handleFlushComplete(audio, false /* isDecoder */); finishFlushIfPossible(); } else if (what == Renderer::kWhatVideoRenderingStart) { @@ -1079,14 +1084,27 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { ALOGV("media rendering started"); notifyListener(MEDIA_STARTED, 0, 0); } else if (what == Renderer::kWhatAudioTearDown) { - int64_t positionUs; - CHECK(msg->findInt64("positionUs", &positionUs)); int32_t reason; CHECK(msg->findInt32("reason", &reason)); ALOGV("Tear down audio with reason %d.", reason); - closeAudioSink(); mAudioDecoder.clear(); ++mAudioDecoderGeneration; + bool needsToCreateAudioDecoder = true; + if (mFlushingAudio == FLUSHING_DECODER) { + mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; + mFlushingAudio = FLUSHED; + finishFlushIfPossible(); + } else if (mFlushingAudio == FLUSHING_DECODER_SHUTDOWN + || mFlushingAudio == SHUTTING_DOWN_DECODER) { + mFlushComplete[1 /* audio */][1 /* isDecoder */] = true; + mFlushingAudio = SHUT_DOWN; + finishFlushIfPossible(); + needsToCreateAudioDecoder = false; + } + if (mRenderer == NULL) { + break; + } + closeAudioSink(); mRenderer->flush( true /* audio */, false /* notifyComplete */); if (mVideoDecoder != NULL) { @@ -1094,9 +1112,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { false /* audio */, false /* notifyComplete */); } + int64_t positionUs; + CHECK(msg->findInt64("positionUs", &positionUs)); performSeek(positionUs); - if (reason == Renderer::kDueToError) { + if (reason == Renderer::kDueToError && needsToCreateAudioDecoder) { instantiateDecoder(true /* audio */, &mAudioDecoder); } } |