Only apply volumes for active devices
When the currently active device is not an absolute volume device and
the contextual bt stream changes do not apply the new volumes.
Test: repro steps in bug
Bug: 379009970
Flag: EXEMPT bugfix
Change-Id: If0645ffd0271927b135b72fd36dc87ab0752bf44
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index a52ec64..b61d3ec 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -3582,23 +3582,30 @@
return BAD_VALUE;
}
- if (mAbsoluteVolumeDrivingStreams[deviceType] != attributesToDriveAbs) {
+ const auto attrIt = mAbsoluteVolumeDrivingStreams.find(deviceType);
+ if (attrIt == mAbsoluteVolumeDrivingStreams.end() ||
+ (attrIt->second.usage != attributesToDriveAbs.usage ||
+ attrIt->second.content_type != attributesToDriveAbs.content_type ||
+ attrIt->second.flags != attributesToDriveAbs.flags)) {
mAbsoluteVolumeDrivingStreams[deviceType] = attributesToDriveAbs;
changed = true;
}
} else {
- if (mAbsoluteVolumeDrivingStreams.find(deviceType) != mAbsoluteVolumeDrivingStreams.end()) {
- mAbsoluteVolumeDrivingStreams.erase(deviceType);
+ if (mAbsoluteVolumeDrivingStreams.erase(deviceType) != 0) {
changed = true;
}
}
- // if something changed, apply the stream volumes regarding the new absolute mode to all the
- // outputs without any delay
+ const DeviceVector devices = mEngine->getOutputDevicesForAttributes(
+ attributesToDriveAbs, nullptr /* preferredDevice */, true /* fromCache */);
+ changed &= devices.types().contains(deviceType);
+ // if something changed on the output device for the changed attributes, apply the stream
+ // volumes regarding the new absolute mode to all the outputs without any delay
if (changed) {
for (size_t i = 0; i < mOutputs.size(); i++) {
sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(i);
- ALOGV("%s: apply stream volumes for portId %d", __func__, desc->getId());
+ ALOGI("%s: apply stream volumes for portId %d and device type %d", __func__,
+ desc->getId(), deviceType);
applyStreamVolumes(desc, {deviceType});
}
}
@@ -8649,7 +8656,6 @@
const bool isHAUsed = isHearingAidUsedForComm();
if (com_android_media_audio_replace_stream_bt_sco()) {
- ALOGV("%s stream bt sco is replaced, no volume consistency check for calls", __func__);
isBtScoVolSrc = (volumeSource != VOLUME_SOURCE_NONE) && (callVolSrc == volumeSource) &&
(isScoRequested || isHAUsed);
return true;