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)
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index 4906695..102bbf0 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -951,6 +951,8 @@
         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 @@
 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();