APM: make AudioPolicyMixCollection inherit from Vector
Modify AudioPolicyMixCollection to inherit from Vector instead
of KeyedVector so all so the collection of mixes stays in the same
order as the mixes were added.
Also make the mix selection take the deviceType into consideration,
not just the address to enable the same address to be associated to
different devices.
Bug: 131090322
Test: see bug for multi bus scenario
Test: atest AudioPlaybackCaptureTest
Change-Id: I4dc7f23bef19a7d47afc2998102da07dde41fbca
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 9025119..3ca7591 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -2868,13 +2868,16 @@
}
String8 address = mix.mDeviceAddress;
+ audio_devices_t deviceTypeToMakeAvailable;
if (mix.mMixType == MIX_TYPE_PLAYERS) {
- mix.mDeviceType = AUDIO_DEVICE_IN_REMOTE_SUBMIX;
- } else {
mix.mDeviceType = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
+ deviceTypeToMakeAvailable = AUDIO_DEVICE_IN_REMOTE_SUBMIX;
+ } else {
+ mix.mDeviceType = AUDIO_DEVICE_IN_REMOTE_SUBMIX;
+ deviceTypeToMakeAvailable = AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}
- if (mPolicyMixes.registerMix(address, mix, 0 /*output desc*/) != NO_ERROR) {
+ if (mPolicyMixes.registerMix(mix, 0 /*output desc*/) != NO_ERROR) {
ALOGE("Error registering mix %zu for address %s", i, address.string());
res = INVALID_OPERATION;
break;
@@ -2890,7 +2893,7 @@
rSubmixModule->addInputProfile(address, &inputConfig,
AUDIO_DEVICE_IN_REMOTE_SUBMIX, address);
- if ((res = setDeviceConnectionStateInt(mix.mDeviceType,
+ if ((res = setDeviceConnectionStateInt(deviceTypeToMakeAvailable,
AUDIO_POLICY_DEVICE_STATE_AVAILABLE,
address.string(), "remote-submix", AUDIO_FORMAT_DEFAULT)) != NO_ERROR) {
ALOGE("Failed to set remote submix device available, type %u, address %s",
@@ -2916,7 +2919,7 @@
sp<SwAudioOutputDescriptor> desc = mOutputs.valueAt(j);
if (desc->supportedDevices().contains(device)) {
- if (mPolicyMixes.registerMix(address, mix, desc) != NO_ERROR) {
+ if (mPolicyMixes.registerMix(mix, desc) != NO_ERROR) {
ALOGE("Could not register mix RENDER, dev=0x%X addr=%s", type,
address.string());
res = INVALID_OPERATION;
@@ -2966,7 +2969,7 @@
String8 address = mix.mDeviceAddress;
- if (mPolicyMixes.unregisterMix(address) != NO_ERROR) {
+ if (mPolicyMixes.unregisterMix(mix) != NO_ERROR) {
res = INVALID_OPERATION;
continue;
}
@@ -2987,7 +2990,7 @@
rSubmixModule->removeInputProfile(address);
} else if ((mix.mRouteFlags & MIX_ROUTE_FLAG_RENDER) == MIX_ROUTE_FLAG_RENDER) {
- if (mPolicyMixes.unregisterMix(mix.mDeviceAddress) != NO_ERROR) {
+ if (mPolicyMixes.unregisterMix(mix) != NO_ERROR) {
res = INVALID_OPERATION;
continue;
}
@@ -4653,7 +4656,8 @@
addOutput(output, desc);
if (device_distinguishes_on_address(deviceType) && address != "0") {
sp<AudioPolicyMix> policyMix;
- if (mPolicyMixes.getAudioPolicyMix(address, policyMix) == NO_ERROR) {
+ if (mPolicyMixes.getAudioPolicyMix(deviceType, address, policyMix)
+ == NO_ERROR) {
policyMix->setOutput(desc);
desc->mPolicyMix = policyMix;
} else {