Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08d3d1d0 authored by Eric Laurent's avatar Eric Laurent
Browse files

fix issue 2096657: Sholes: residue shutter sound heard ONCE while taking a...

fix issue 2096657: Sholes: residue shutter sound heard ONCE while taking a picture AFTER the volume is turned off.

Do not ramp volume if the first frame of a track is processed after the track was stopped.
In the case of very short sounds, the track stop request can be received by AudioFlinger just after the start request before the first frame is mixed by AudioMixer. In this case, the track is already in stopped state and initial volume is applied with a ramp for the first frame processed which should not be the case: initial volume change is always applied immediatelly.
parent 2dcf5dae
Loading
Loading
Loading
Loading
+7 −6
Original line number Original line Diff line number Diff line
@@ -1319,19 +1319,20 @@ size_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track>
            mAudioMixer->setBufferProvider(track);
            mAudioMixer->setBufferProvider(track);
            mAudioMixer->enable(AudioMixer::MIXING);
            mAudioMixer->enable(AudioMixer::MIXING);


            int param;
            int param = AudioMixer::VOLUME;
            if (track->mFillingUpStatus == Track::FS_FILLED) {
            if (track->mFillingUpStatus == Track::FS_FILLED) {
                // no ramp for the first volume setting
                // no ramp for the first volume setting
                track->mFillingUpStatus = Track::FS_ACTIVE;
                track->mFillingUpStatus = Track::FS_ACTIVE;
                if (track->mState == TrackBase::RESUMING) {
                if (track->mState == TrackBase::RESUMING) {
                    track->mState = TrackBase::ACTIVE;
                    track->mState = TrackBase::ACTIVE;
                    param = AudioMixer::RAMP_VOLUME;
                    param = AudioMixer::RAMP_VOLUME;
                } else {
                    param = AudioMixer::VOLUME;
                }
                }
            } else {
            } else if (cblk->server != 0) {
                // If the track is stopped before the first frame was mixed,
                // do not apply ramp
                param = AudioMixer::RAMP_VOLUME;
                param = AudioMixer::RAMP_VOLUME;
            }
            }

            mAudioMixer->setParameter(param, AudioMixer::VOLUME0, left);
            mAudioMixer->setParameter(param, AudioMixer::VOLUME0, left);
            mAudioMixer->setParameter(param, AudioMixer::VOLUME1, right);
            mAudioMixer->setParameter(param, AudioMixer::VOLUME1, right);
            mAudioMixer->setParameter(
            mAudioMixer->setParameter(
@@ -1365,7 +1366,7 @@ size_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track>
                    LOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
                    LOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
                    tracksToRemove->add(track);
                    tracksToRemove->add(track);
                }
                }
                // For tracks using static shared memry buffer, make sure that we have
                // For tracks using static shared memory buffer, make sure that we have
                // written enough data to audio hardware before disabling the track
                // written enough data to audio hardware before disabling the track
                // NOTE: this condition with arrive before track->mRetryCount <= 0 so we
                // NOTE: this condition with arrive before track->mRetryCount <= 0 so we
                // don't care about code removing track from active list above.
                // don't care about code removing track from active list above.