diff options
author | Mohan Kumar <mkumard@nvidia.com> | 2014-12-12 15:16:46 +0530 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2016-03-22 17:14:35 -0700 |
commit | 27ee071a98549919b92c195d51455c62a83ddd1b (patch) | |
tree | 18435b1e5d29cf6bd3b863ec3d5d2a02bf425df7 /services | |
parent | 536fd16fa6d56008ba3d6f46275fd52dac25fd8c (diff) | |
download | frameworks_av-27ee071a98549919b92c195d51455c62a83ddd1b.zip frameworks_av-27ee071a98549919b92c195d51455c62a83ddd1b.tar.gz frameworks_av-27ee071a98549919b92c195d51455c62a83ddd1b.tar.bz2 |
audioflinger: clear mMixerBuffer if frame is not ready
Clear the mMixerBuffer if frame is not ready before the FastMixer
starts processing. Otherwise it might result in large glitches on
output device due to junk data present in the mixbuffer.
Change-Id: I9f025234d4ac100f85d2ec67c06a8df4195bea98
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/FastMixer.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/services/audioflinger/FastMixer.cpp b/services/audioflinger/FastMixer.cpp index 45c68b5..2bc8066 100644 --- a/services/audioflinger/FastMixer.cpp +++ b/services/audioflinger/FastMixer.cpp @@ -334,6 +334,11 @@ void FastMixer::onWork() if ((command & FastMixerState::MIX) && (mMixer != NULL) && mIsWarm) { ALOG_ASSERT(mMixerBuffer != NULL); + + // AudioMixer::mState.enabledTracks is undefined if mState.hook == process__validate, + // so we keep a side copy of enabledTracks + bool anyEnabledTracks = false; + // for each track, update volume and check for underrun unsigned currentTrackMask = current->mTrackMask; while (currentTrackMask != 0) { @@ -392,11 +397,13 @@ void FastMixer::onWork() underruns.mBitFields.mPartial++; underruns.mBitFields.mMostRecent = UNDERRUN_PARTIAL; mMixer->enable(name); + anyEnabledTracks = true; } } else { underruns.mBitFields.mFull++; underruns.mBitFields.mMostRecent = UNDERRUN_FULL; mMixer->enable(name); + anyEnabledTracks = true; } ftDump->mUnderruns = underruns; ftDump->mFramesReady = framesReady; @@ -407,9 +414,14 @@ void FastMixer::onWork() pts = AudioBufferProvider::kInvalidPTS; } - // process() is CPU-bound - mMixer->process(pts); - mMixerBufferState = MIXED; + if (anyEnabledTracks) { + // process() is CPU-bound + mMixer->process(pts); + mMixerBufferState = MIXED; + } else if (mMixerBufferState != ZEROED) { + mMixerBufferState = UNDEFINED; + } + } else if (mMixerBufferState == MIXED) { mMixerBufferState = UNDEFINED; } |