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 | |
| 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
| -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; } |
