Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5334bcc0 authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioService: update getPreferredDevicesForStrategy

Use the cache stored in AudioDeviceInventory instead of
querying the AudioPolicyManager.
This avoids reflecting the preferred device due to setCommunicationDevice.

Bug: 417481226
Flag: com.android.media.audio.update_preferred_devices_for_strategy
Test: atest AudioManagerTest#testPreferredDevicesForStrategy
Test: atest NonDefaultDeviceForStrategyTest

Change-Id: I704c7c618e5ce306240c1292268d5bfcadba2bd2
parent 8bfe8a87
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -836,5 +836,14 @@ public final class AudioDeviceInfo {
                TYPE_ECHO_REFERENCE, AudioSystem.DEVICE_IN_ECHO_REFERENCE);

    }

    @Override
    public String toString() {
        return new String("AudioDeviceInfo:"
                + " type: " + (isSink() ? AudioSystem.getOutputDeviceName(getInternalType())
                : AudioSystem.getInputDeviceName(getInternalType()))
                + " addr: " + getAddress()
                + " id: " + getId());
    }

}
+4 −0
Original line number Diff line number Diff line
@@ -1366,6 +1366,10 @@ public class AudioDeviceBroker {
        return mDeviceInventory.setPreferredDevicesForStrategyAndSave(strategy, devices);
    }

    /*package*/ List<AudioDeviceAttributes> getPreferredDevicesForStrategy(int strategy) {
        return mDeviceInventory.getPreferredDevicesForStrategy(strategy);
    }

    /*package*/ int removePreferredDevicesForStrategySync(int strategy) {
        return mDeviceInventory.removePreferredDevicesForStrategyAndSave(strategy);
    }
+26 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static android.media.AudioSystem.isBluetoothScoOutDevice;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
import static com.android.media.audio.Flags.asDeviceConnectionFailure;
import static com.android.media.audio.Flags.updatePreferredDevicesForStrategy;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1377,6 +1378,31 @@ public class AudioDeviceInventory {
                    strategy, AudioSystem.DEVICE_ROLE_PREFERRED, true /*internal */);
    }

    /*package*/ List<AudioDeviceAttributes> getPreferredDevicesForStrategy(int strategy) {
        synchronized (mDevicesLock) {
            try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
                List<AudioDeviceAttributes> devices = new ArrayList<>();
                if (updatePreferredDevicesForStrategy()) {
                    Pair<Integer, Integer> key =
                            new Pair<>(strategy, AudioSystem.DEVICE_ROLE_PREFERRED);
                    devices = mAppliedStrategyRoles.get(key);
                    if (devices == null) {
                        return new ArrayList<AudioDeviceAttributes>();
                    }
                } else {
                    int status = AudioSystem.getDevicesForRoleAndStrategy(
                            strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
                    if (status != AudioSystem.SUCCESS) {
                        Log.e(TAG, String.format("Error %d in getPreferredDeviceForStrategy(%d)",
                                status, strategy));
                        return new ArrayList<AudioDeviceAttributes>();
                    }
                }
                return devices;
            }
        }
    }

    /*package*/ int setDeviceAsNonDefaultForStrategyAndSave(int strategy,
            @NonNull AudioDeviceAttributes device) {
        int status = AudioSystem.ERROR;
+7 −16
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ import static com.android.media.audio.Flags.optimizeBtDeviceSwitch;
import static com.android.media.audio.Flags.replaceStreamBtSco;
import static com.android.media.audio.Flags.ringMyCar;
import static com.android.media.audio.Flags.ringerModeAffectsAlarm;
import static com.android.media.audio.Flags.updatePreferredDevicesForStrategy;
import static com.android.media.flags.Flags.enableAudioInputDeviceRoutingAndVolumeControl;
import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE;
import static com.android.server.utils.EventLogger.Event.ALOGE;
@@ -3553,23 +3554,11 @@ public class AudioService extends IAudioService.Stub
    public List<AudioDeviceAttributes> getPreferredDevicesForStrategy(int strategy) {
        super.getPreferredDevicesForStrategy_enforcePermission();
        List<AudioDeviceAttributes> devices = new ArrayList<>();
        int status = AudioSystem.SUCCESS;
        final long identity = Binder.clearCallingIdentity();
        try {
            status = AudioSystem.getDevicesForRoleAndStrategy(
                    strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
        if (status != AudioSystem.SUCCESS) {
            Log.e(TAG, String.format("Error %d in getPreferredDeviceForStrategy(%d)",
                    status, strategy));
            return new ArrayList<AudioDeviceAttributes>();
        } else {
        List<AudioDeviceAttributes> devices =
                mDeviceBroker.getPreferredDevicesForStrategy(strategy);
        return anonymizeAudioDeviceAttributesList(devices);
    }
    }
    /**
     * @see AudioManager#setDeviceAsNonDefaultForStrategy(AudioProductStrategy,
@@ -5285,6 +5274,8 @@ public class AudioService extends IAudioService.Stub
                + unifyAbsoluteVolumeManagement());
        pw.println("\tandroid.media.audio.Flags.registerVolumeCallbackApiHardening:"
                + registerVolumeCallbackApiHardening());
        pw.println("\tcom.android.media.audio.Flags.updatePreferredDevicesForStrategy:"
                + updatePreferredDevicesForStrategy());
    }
    private void dumpAudioMode(PrintWriter pw) {