@ -4918,6 +4918,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
// 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 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
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 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
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 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
( 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- > mAudioTrackServerP roxy- > getSampleRate ( ) ;
uint32_t reqSampleRate = p roxy- > getSampleRate ( ) ;
if ( reqSampleRate = = 0 ) {
reqSampleRate = mSampleRate ;
} else if ( reqSampleRate > maxSampleRate ) {
@ -5033,7 +5034,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
AudioMixer : : SAMPLE_RATE ,
( void * ) ( uintptr_t ) reqSampleRate ) ;
AudioPlaybackRate playbackRate = track- > mAudioTrackServerP roxy- > getPlaybackRate ( ) ;
AudioPlaybackRate playbackRate = p roxy- > getPlaybackRate ( ) ;
mAudioMixer - > setParameter (
trackId ,
AudioMixer : : TIMESTRETCH ,
@ -5507,19 +5508,17 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr
{
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 ) ) ;