summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohan Kumar <mkumard@nvidia.com>2014-12-12 15:16:46 +0530
committerSteve Kondik <steve@cyngn.com>2016-03-22 17:14:35 -0700
commit27ee071a98549919b92c195d51455c62a83ddd1b (patch)
tree18435b1e5d29cf6bd3b863ec3d5d2a02bf425df7
parent536fd16fa6d56008ba3d6f46275fd52dac25fd8c (diff)
downloadframeworks_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.cpp18
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;
}