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;