audioflinger: only update mHalVolFloat on success

This will fix a regression with AAudio MMAP stream not getting
its initial volume set correctly.
Also initialize mHalVolFloat.

Bug: 74547253
Test: adb shell write_sine_callback -pl -s10 -m1
Test: should have the same initial volume as
Test: adb shell write_sine_callback -pl -s10 -m3
Change-Id: Ie0c1f9ba51e2059a888d2273f41588f101b09a5c
gugelfrei
Phil Burk 6 years ago
parent 553a1a42fc
commit 56ecf3e3ce

@ -8524,7 +8524,11 @@ AudioFlinger::MmapPlaybackThread::MmapPlaybackThread(
audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady)
: MmapThread(audioFlinger, id, hwDev, output->stream, outDevice, inDevice, systemReady),
mStreamType(AUDIO_STREAM_MUSIC),
mStreamVolume(1.0), mStreamMute(false), mOutput(output)
mStreamVolume(1.0),
mStreamMute(false),
mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later.
mNoCallbackWarningCount(0),
mOutput(output)
{
snprintf(mThreadName, kThreadNameLength, "AudioMmapOut_%X", id);
mChannelCount = audio_channel_count_from_out_mask(mChannelMask);
@ -8632,7 +8636,6 @@ void AudioFlinger::MmapPlaybackThread::processVolume_l()
}
if (volume != mHalVolFloat) {
mHalVolFloat = volume;
// Convert volumes from float to 8.24
uint32_t vol = (uint32_t)(volume * (1 << 24));
@ -8645,7 +8648,10 @@ void AudioFlinger::MmapPlaybackThread::processVolume_l()
volume = (float)vol / (1 << 24);
}
// Try to use HW volume control and fall back to SW control if not implemented
if (mOutput->stream->setVolume(volume, volume) != NO_ERROR) {
if (mOutput->stream->setVolume(volume, volume) == NO_ERROR) {
mHalVolFloat = volume; // HW volume control worked, so update value.
mNoCallbackWarningCount = 0;
} else {
sp<MmapStreamCallback> callback = mCallback.promote();
if (callback != 0) {
int channelCount;
@ -8659,8 +8665,13 @@ void AudioFlinger::MmapPlaybackThread::processVolume_l()
values.add(volume);
}
callback->onVolumeChanged(mChannelMask, values);
mHalVolFloat = volume; // SW volume control worked, so update value.
mNoCallbackWarningCount = 0;
} else {
ALOGW("Could not set MMAP stream volume: no volume callback!");
if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
ALOGW("Could not set MMAP stream volume: no volume callback!");
mNoCallbackWarningCount++;
}
}
}
}

@ -1666,6 +1666,8 @@ protected:
bool mMasterMute;
bool mStreamMute;
float mHalVolFloat;
int32_t mNoCallbackWarningCount;
static constexpr int32_t kMaxNoCallbackWarnings = 5;
AudioStreamOut* mOutput;
};

Loading…
Cancel
Save