AudioFlinger: fix tracks ready for mixing logic.
Commit fec279f5 broke the logic allowing to wait for an application
to provide frames for mixing in the case of several active tracks.
This was causing audio gaps when playing music and superposing a
sound Fx (keyboard clicks...).
Issue 6185007.
Change-Id: Id0fad150d0b615646d6b1387c0de8ca944d228f6
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 1c277ce..f7a2525 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1475,7 +1475,6 @@
mMasterVolume(audioFlinger->masterVolumeSW_l()),
mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
mMixerStatus(MIXER_IDLE),
- mPrevMixerStatus(MIXER_IDLE),
standbyDelay(AudioFlinger::mStandbyTimeInNsecs),
mFastTrackAvailMask(((1 << FastMixerState::kMaxFastTracks) - 1) & ~1),
mFastTrackNewMask(0)
@@ -2392,7 +2391,7 @@
ALOGV("%s waking up", myName.string());
acquireWakeLock_l();
- mPrevMixerStatus = MIXER_IDLE;
+ mMixerStatus = MIXER_IDLE;
checkSilentMode_l();
@@ -2406,11 +2405,7 @@
}
}
- mixer_state newMixerStatus = prepareTracks_l(&tracksToRemove);
- // Shift in the new status; this could be a queue if it's
- // useful to filter the mixer status over several cycles.
- mPrevMixerStatus = mMixerStatus;
- mMixerStatus = newMixerStatus;
+ mMixerStatus = prepareTracks_l(&tracksToRemove);
// prevent any changes in effect chain list and in each effect chain
// during mixing and effect process as the audio buffers could be deleted
@@ -2794,11 +2789,11 @@
// make sure that we have enough frames to mix one full buffer.
// enforce this condition only once to enable draining the buffer in case the client
// app does not call stop() and relies on underrun to stop:
- // hence the test on (mPrevMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
+ // hence the test on (mMixerStatus == MIXER_TRACKS_READY) meaning the track was mixed
// during last round
uint32_t minFrames = 1;
if (!track->isStopped() && !track->isPausing() &&
- (mPrevMixerStatus == MIXER_TRACKS_READY)) {
+ (mMixerStatus == MIXER_TRACKS_READY)) {
if (t->sampleRate() == (int)mSampleRate) {
minFrames = mNormalFrameCount;
} else {
@@ -2947,7 +2942,7 @@
// If one track is ready, set the mixer ready if:
// - the mixer was not ready during previous round OR
// - no other track is not ready
- if (mPrevMixerStatus != MIXER_TRACKS_READY ||
+ if (mMixerStatus != MIXER_TRACKS_READY ||
mixerStatus != MIXER_TRACKS_ENABLED) {
mixerStatus = MIXER_TRACKS_READY;
}
@@ -2979,7 +2974,7 @@
// If one track is not ready, mark the mixer also not ready if:
// - the mixer was ready during previous round OR
// - no other track is ready
- } else if (mPrevMixerStatus == MIXER_TRACKS_READY ||
+ } else if (mMixerStatus == MIXER_TRACKS_READY ||
mixerStatus != MIXER_TRACKS_READY) {
mixerStatus = MIXER_TRACKS_ENABLED;
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 23fc74d..2a85115 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -1052,8 +1052,8 @@
uint32_t sleepTime;
// mixer status returned by prepareTracks_l()
- mixer_state mMixerStatus; // current cycle
- mixer_state mPrevMixerStatus; // previous cycle
+ mixer_state mMixerStatus; // current cycle
+ // previous cycle when in prepareTracks_l()
// FIXME move these declarations into the specific sub-class that needs them
// MIXER only