Merge "VolumeShaper: Ensure consistent observable state when muted" into qt-dev am: 2616bbf488 am: 19bf3a5a51
am: eb7056abb3
Change-Id: I394325bd763912c70a923e44ca2688eb0dc23cd4
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 31ef15d..28ad9dd 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -4918,6 +4918,10 @@
// read original volumes with volume control
float typeVolume = mStreamTypes[track->streamType()].volume;
float v = masterVolume * typeVolume;
+ // Always fetch volumeshaper volume to ensure state is updated.
+ const sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
+ const float vh = track->getVolumeHandler()->getVolume(
+ track->mAudioTrackServerProxy->framesReleased()).first;
if (track->isPausing() || mStreamTypes[track->streamType()].mute
|| track->isPlaybackRestricted()) {
@@ -4927,7 +4931,6 @@
track->setPaused();
}
} else {
- sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
gain_minifloat_packed_t vlr = proxy->getVolumeLR();
vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
vrf = float_from_gain(gain_minifloat_unpack_right(vlr));
@@ -4940,8 +4943,6 @@
ALOGV("Track right volume out of range: %.3g", vrf);
vrf = GAIN_FLOAT_UNITY;
}
- const float vh = track->getVolumeHandler()->getVolume(
- track->mAudioTrackServerProxy->framesReleased()).first;
// now apply the master volume and stream type volume and shaper volume
vlf *= v * vh;
vrf *= v * vh;
@@ -5021,7 +5022,7 @@
(void *)(uintptr_t)(mChannelMask | mHapticChannelMask));
// limit track sample rate to 2 x output sample rate, which changes at re-configuration
uint32_t maxSampleRate = mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX;
- uint32_t reqSampleRate = track->mAudioTrackServerProxy->getSampleRate();
+ uint32_t reqSampleRate = proxy->getSampleRate();
if (reqSampleRate == 0) {
reqSampleRate = mSampleRate;
} else if (reqSampleRate > maxSampleRate) {
@@ -5033,7 +5034,7 @@
AudioMixer::SAMPLE_RATE,
(void *)(uintptr_t)reqSampleRate);
- AudioPlaybackRate playbackRate = track->mAudioTrackServerProxy->getPlaybackRate();
+ AudioPlaybackRate playbackRate = proxy->getPlaybackRate();
mAudioMixer->setParameter(
trackId,
AudioMixer::TIMESTRETCH,
@@ -5507,19 +5508,17 @@
{
float left, right;
+ // Ensure volumeshaper state always advances even when muted.
+ const sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
+ const auto [shaperVolume, shaperActive] = track->getVolumeHandler()->getVolume(
+ proxy->framesReleased());
+ mVolumeShaperActive = shaperActive;
+
if (mMasterMute || mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) {
left = right = 0;
} else {
float typeVolume = mStreamTypes[track->streamType()].volume;
- float v = mMasterVolume * typeVolume;
- sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
-
- // Get volumeshaper scaling
- std::pair<float /* volume */, bool /* active */>
- vh = track->getVolumeHandler()->getVolume(
- track->mAudioTrackServerProxy->framesReleased());
- v *= vh.first;
- mVolumeShaperActive = vh.second;
+ const float v = mMasterVolume * typeVolume * shaperVolume;
gain_minifloat_packed_t vlr = proxy->getVolumeLR();
left = float_from_gain(gain_minifloat_unpack_left(vlr));