audioflinger: fix mmap volume update
Make sure volume callback is sent at least each time a new
client stream is started.
Bug: 78122737
Test: repro steps in bug.
Change-Id: I5b5ac617d604ed23bf8528affa1877b6cc0b5494
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 1fa9e37..20de97c 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -7898,7 +7898,9 @@
mSessionId(AUDIO_SESSION_NONE),
mDeviceId(AUDIO_PORT_HANDLE_NONE), mPortId(AUDIO_PORT_HANDLE_NONE),
mHalStream(stream), mHalDevice(hwDev->hwDevice()), mAudioHwDev(hwDev),
- mActiveTracks(&this->mLocalLog), mNoCallbackWarningCount(0)
+ mActiveTracks(&this->mLocalLog),
+ mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later.
+ mNoCallbackWarningCount(0)
{
mStandby = true;
readHalParameters_l();
@@ -8065,7 +8067,10 @@
return PERMISSION_DENIED;
}
- if (!isOutput() && !silenced) {
+ if (isOutput()) {
+ // force volume update when a new track is added
+ mHalVolFloat = -1.0f;
+ } else if (!silenced) {
for (const sp<MmapTrack> &track : mActiveTracks) {
if (track->isSilenced_l() && track->uid() != client.clientUid)
track->invalidate();
@@ -8620,7 +8625,6 @@
mStreamType(AUDIO_STREAM_MUSIC),
mStreamVolume(1.0),
mStreamMute(false),
- mHalVolFloat(-1.0f), // Initialize to illegal value so it always gets set properly later.
mOutput(output)
{
snprintf(mThreadName, kThreadNameLength, "AudioMmapOut_%X", id);
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index bc4a534..28d4482 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -1641,6 +1641,7 @@
sp<DeviceHalInterface> mHalDevice;
AudioHwDevice* const mAudioHwDev;
ActiveTracks<MmapTrack> mActiveTracks;
+ float mHalVolFloat;
int32_t mNoCallbackWarningCount;
static constexpr int32_t kMaxNoCallbackWarnings = 5;
@@ -1692,7 +1693,6 @@
float mStreamVolume;
bool mMasterMute;
bool mStreamMute;
- float mHalVolFloat;
AudioStreamOut* mOutput;
};