AudioDeviceInventory: reapply preferred device roles when needed

Because a preferred device role requested via an AudioManager API can be
conflicting with a communication device request and is persisted, we need to
reapply any active device role request when the communication device request is
cleared.

Also add missing restoration of preferred capture preset.

Bug: 285773888
Test: repro steps in bug
Test: atest NonDefaultDeviceForStrategyTest
Test: atest AudioManagerTest#testPreferredDevicesForStrategy
Test: atest AudioManagerTest#testPreferredDeviceForCapturePreset
Change-Id: I5d83a3e7a2485a6ef685d0779951bfb7ef9c991e
This commit is contained in:
Eric Laurent
2023-06-06 19:48:50 +02:00
parent 69e0c71705
commit 91b5e6f398
2 changed files with 18 additions and 5 deletions

View File

@@ -2214,6 +2214,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
mDeviceInventory.removePreferredDevicesForStrategyInt(mAccessibilityStrategyId);
}
mDeviceInventory.applyConnectedDevicesRoles();
mDeviceInventory.reapplyExternalDevicesRoles();
} else {
mDeviceInventory.setPreferredDevicesForStrategyInt(
mCommunicationStrategyId, Arrays.asList(preferredCommunicationDevice));

View File

@@ -361,23 +361,34 @@ public class AudioDeviceInventory {
AudioSystem.DEVICE_STATE_AVAILABLE,
di.mDeviceCodecFormat);
}
mAppliedStrategyRoles.clear();
mAppliedStrategyRolesInt.clear();
mAppliedPresetRoles.clear();
mAppliedPresetRolesInt.clear();
applyConnectedDevicesRoles_l();
}
reapplyExternalDevicesRoles();
}
/*package*/ void reapplyExternalDevicesRoles() {
synchronized (mDevicesLock) {
mAppliedStrategyRoles.clear();
mAppliedPresetRoles.clear();
}
synchronized (mPreferredDevices) {
mPreferredDevices.forEach((strategy, devices) -> {
setPreferredDevicesForStrategy(strategy, devices); });
setPreferredDevicesForStrategy(strategy, devices);
});
}
synchronized (mNonDefaultDevices) {
mNonDefaultDevices.forEach((strategy, devices) -> {
addDevicesRoleForStrategy(strategy, AudioSystem.DEVICE_ROLE_DISABLED,
devices, false /* internal */); });
devices, false /* internal */);
});
}
synchronized (mPreferredDevicesForCapturePreset) {
// TODO: call audiosystem to restore
mPreferredDevicesForCapturePreset.forEach((capturePreset, devices) -> {
setDevicesRoleForCapturePreset(
capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
});
}
}
@@ -1163,6 +1174,7 @@ public class AudioDeviceInventory {
return mAudioSystem.removeDevicesRoleForStrategy(s, r, d); });
purgeRoles(mAppliedPresetRolesInt, (p, r, d) -> {
return mAudioSystem.removeDevicesRoleForCapturePreset(p, r, d); });
reapplyExternalDevicesRoles();
}
@GuardedBy("mDevicesLock")