From f1588f26947f61f518911323c2f2137d664786b1 Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Tue, 10 Sep 2019 14:49:46 -0700 Subject: [PATCH] SoundPool: Do not sleep on stop for USAGE_GAME or on BUFFER_END Test: SoundPoolApplication, SoundPoolOggTest, Games Bug: 139787914 Bug: 139788416 Bug: 140579743 Bug: 140779732 Merged-In: I83b9b1d61b65dcc4a73d676e1f8be1e022c70302 Change-Id: I83b9b1d61b65dcc4a73d676e1f8be1e022c70302 (cherry picked from commit a527524356a9a6bc9597e4d06cee5c02cf936a68) --- media/jni/soundpool/SoundPool.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index 49066950a9fbe..102bbf0e59316 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -951,6 +951,8 @@ void SoundChannel::process(int event, void *info, unsigned long toggle) ALOGV("process %p channel %d event %s", this, mChannelID, (event == AudioTrack::EVENT_UNDERRUN) ? "UNDERRUN" : "BUFFER_END"); + // Only BUFFER_END should happen as we use static tracks. + setVolume_l(0.f, 0.f); // set volume to 0 to indicate no need to ramp volume down. mSoundPool->addToStopList(this); } else if (event == AudioTrack::EVENT_LOOP_END) { ALOGV("End loop %p channel %d", this, mChannelID); @@ -966,14 +968,18 @@ void SoundChannel::process(int event, void *info, unsigned long toggle) bool SoundChannel::doStop_l() { if (mState != IDLE) { - setVolume_l(0, 0); ALOGV("stop"); - // Since we're forcibly halting the previously playing content, - // we sleep here to ensure the volume is ramped down before we stop the track. - // Ideally the sleep time is the mixer period, or an approximation thereof - // (Fast vs Normal tracks are different). - // TODO: consider pausing instead of stop here. - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + if (mLeftVolume != 0.f || mRightVolume != 0.f) { + setVolume_l(0.f, 0.f); + if (mSoundPool->attributes()->usage != AUDIO_USAGE_GAME) { + // Since we're forcibly halting the previously playing content, + // we sleep here to ensure the volume is ramped down before we stop the track. + // Ideally the sleep time is the mixer period, or an approximation thereof + // (Fast vs Normal tracks are different). + ALOGV("sleeping: ChannelID:%d SampleID:%d", mChannelID, mSample->sampleID()); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } + } mAudioTrack->stop(); mPrevSampleID = mSample->sampleID(); mSample.clear();