diff options
author | Andy Hung <hunga@google.com> | 2014-12-19 17:55:56 -0800 |
---|---|---|
committer | Andy Hung <hunga@google.com> | 2014-12-19 18:15:33 -0800 |
commit | f0e83644637bd05852c244df481f21a0d435ff66 (patch) | |
tree | 1906a30a9d09e3def397d39fba5d64deadc78ae5 /media | |
parent | e48cf5b8f823c30af93577c1e380d752ac69b871 (diff) | |
download | frameworks_av-f0e83644637bd05852c244df481f21a0d435ff66.zip frameworks_av-f0e83644637bd05852c244df481f21a0d435ff66.tar.gz frameworks_av-f0e83644637bd05852c244df481f21a0d435ff66.tar.bz2 |
NuPlayer: Do not recreate AudioTrack if not needed
On output format change from the decoder, check if a new audio
track is really needed. This prevents excessive track
creation/destruction during seeks.
Bug: 18817027
Change-Id: I4290dcb90cb35bc1303b025e162f6b813d49a05b
Diffstat (limited to 'media')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 29 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h | 10 |
2 files changed, 39 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 21b74ee..73f9c15 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -39,6 +39,15 @@ namespace android { static const int64_t kOffloadPauseMaxUs = 10000000ll; // static +const NuPlayer::Renderer::PcmInfo NuPlayer::Renderer::AUDIO_PCMINFO_INITIALIZER = { + AUDIO_CHANNEL_NONE, + AUDIO_OUTPUT_FLAG_NONE, + AUDIO_FORMAT_INVALID, + 0, // mNumChannels + 0 // mSampleRate +}; + +// static const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll; NuPlayer::Renderer::Renderer( @@ -75,6 +84,7 @@ NuPlayer::Renderer::Renderer( mAudioOffloadPauseTimeoutGeneration(0), mAudioOffloadTornDown(false), mCurrentOffloadInfo(AUDIO_INFO_INITIALIZER), + mCurrentPcmInfo(AUDIO_PCMINFO_INITIALIZER), mTotalBuffersQueued(0), mLastAudioBufferDrained(0) { } @@ -1395,6 +1405,8 @@ status_t NuPlayer::Renderer::onOpenAudioSink( // no change from previous configuration, everything ok. return OK; } + mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER; + ALOGV("openAudioSink: try to open AudioSink in offload mode"); uint32_t offloadFlags = flags; offloadFlags |= AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD; @@ -1436,6 +1448,20 @@ status_t NuPlayer::Renderer::onOpenAudioSink( ALOGV("openAudioSink: open AudioSink in NON-offload mode"); uint32_t pcmFlags = flags; pcmFlags &= ~AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD; + + const PcmInfo info = { + (audio_channel_mask_t)channelMask, + (audio_output_flags_t)pcmFlags, + AUDIO_FORMAT_PCM_16_BIT, // TODO: change to audioFormat + numChannels, + sampleRate + }; + if (memcmp(&mCurrentPcmInfo, &info, sizeof(info)) == 0) { + ALOGV("openAudioSink: no change in pcm mode"); + // no change from previous configuration, everything ok. + return OK; + } + audioSinkChanged = true; mAudioSink->close(); mCurrentOffloadInfo = AUDIO_INFO_INITIALIZER; @@ -1450,8 +1476,10 @@ status_t NuPlayer::Renderer::onOpenAudioSink( (audio_output_flags_t)pcmFlags); if (err != OK) { ALOGW("openAudioSink: non offloaded open failed status: %d", err); + mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER; return err; } + mCurrentPcmInfo = info; mAudioSink->start(); } if (audioSinkChanged) { @@ -1466,6 +1494,7 @@ status_t NuPlayer::Renderer::onOpenAudioSink( void NuPlayer::Renderer::onCloseAudioSink() { mAudioSink->close(); mCurrentOffloadInfo = AUDIO_INFO_INITIALIZER; + mCurrentPcmInfo = AUDIO_PCMINFO_INITIALIZER; } } // namespace android diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h index 406c64c..caa2bb3 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h @@ -180,6 +180,16 @@ private: bool mAudioOffloadTornDown; audio_offload_info_t mCurrentOffloadInfo; + struct PcmInfo { + audio_channel_mask_t mChannelMask; + audio_output_flags_t mFlags; + audio_format_t mFormat; + int32_t mNumChannels; + int32_t mSampleRate; + }; + PcmInfo mCurrentPcmInfo; + static const PcmInfo AUDIO_PCMINFO_INITIALIZER; + int32_t mTotalBuffersQueued; int32_t mLastAudioBufferDrained; |