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

Commit 383dc532 authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioService: restore A2DP/wired headset auto selection

Restore automatic routing behavior when wired headset or BT headset
is connected.
This behavior was changed by commit 0234587b
This change mostly reverts 0234587b but keeps public methods
setBluetoothA2dpOn() and isBluetoothA2dpOn() deprecated with
stub implementations.

Bug: 30963785
Bug: 31424965
Change-Id: I90ea04584df595a778993595ad0076fef809ed98
parent d28f5d5e
Loading
Loading
Loading
Loading
+41 −3
Original line number Diff line number Diff line
@@ -510,8 +510,11 @@ public class AudioService extends IAudioService.Stub {
    private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED;

    // Request to override default use of A2DP for media.
    // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore
    private boolean mBluetoothA2dpEnabled;
    // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore
    // state of bluetooth A2DP enable request sen by deprecated APIs setBluetoothA2dpOn() and
    // isBluettohA2dpOn()
    private boolean mBluetoothA2dpEnabledExternal;
    private final Object mBluetoothA2dpEnabledLock = new Object();

    // Monitoring of audio routes.  Protected by mCurAudioRoutes.
@@ -840,6 +843,12 @@ public class AudioService extends IAudioService.Stub {
            RotationHelper.updateOrientation();
        }

        synchronized (mBluetoothA2dpEnabledLock) {
            AudioSystem.setForceUse(AudioSystem.FOR_MEDIA,
                    mBluetoothA2dpEnabled ?
                            AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
        }

        synchronized (mSettingsLock) {
            AudioSystem.setForceUse(AudioSystem.FOR_DOCK,
                    mDockAudioMediaEnabled ?
@@ -2706,7 +2715,7 @@ public class AudioService extends IAudioService.Stub {
     * @deprecated
     * */
    public void setBluetoothA2dpOn(boolean on) {
        mBluetoothA2dpEnabled = on;
        mBluetoothA2dpEnabledExternal = on;
        Log.e(TAG, "setBluetoothA2dpOn() is deprecated, now a no-op",
                new Exception("Deprecated use of setBluetoothA2dpOn()"));
    }
@@ -2716,7 +2725,7 @@ public class AudioService extends IAudioService.Stub {
     * @deprecated
     * */
    public boolean isBluetoothA2dpOn() {
        return mBluetoothA2dpEnabled;
        return mBluetoothA2dpEnabledExternal;
    }

    /** @see AudioManager#startBluetoothSco() */
@@ -3787,6 +3796,11 @@ public class AudioService extends IAudioService.Stub {
                Slog.i(TAG, "setWiredDeviceConnectionState(" + state + " nm: " + name + " addr:"
                        + address + ")");
            }
            if ((state == 0) && ((type == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
                    (type == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
                    (type == AudioSystem.DEVICE_OUT_LINE))) {
                setBluetoothA2dpOnInt(true);
            }
            int delay = checkSendBecomingNoisyIntent(type, state);
            queueMsgUnderWakeLock(mAudioHandler,
                    MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
@@ -4767,6 +4781,7 @@ public class AudioService extends IAudioService.Stub {
        VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC];
        sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE,
                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, streamState, 0);
        setBluetoothA2dpOnInt(true);
        AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
                AudioSystem.DEVICE_STATE_AVAILABLE, address, name);
        // Reset A2DP suspend state each time a new sink is connected
@@ -5004,6 +5019,7 @@ public class AudioService extends IAudioService.Stub {
                    devices |= dev;
                }
            }

            if (devices == device) {
                sendMsg(mAudioHandler,
                        MSG_BROADCAST_AUDIO_BECOMING_NOISY,
@@ -5107,6 +5123,11 @@ public class AudioService extends IAudioService.Stub {
                return;
            }
            if (state != 0) {
                if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
                    (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
                    (device == AudioSystem.DEVICE_OUT_LINE)) {
                    setBluetoothA2dpOnInt(false);
                }
                if ((device & mSafeMediaVolumeDevices) != 0) {
                    sendMsg(mAudioHandler,
                            MSG_CHECK_MUSIC_ACTIVE,
@@ -5572,9 +5593,26 @@ public class AudioService extends IAudioService.Stub {
        }
    }

    // Handles request to override default use of A2DP for media.
    // Must be called synchronized on mConnectedDevices
    public void setBluetoothA2dpOnInt(boolean on) {
        synchronized (mBluetoothA2dpEnabledLock) {
            mBluetoothA2dpEnabled = on;
            setForceUseInt_SyncDevices(AudioSystem.FOR_MEDIA,
                    mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
        }
    }

    // Must be called synchronized on mConnectedDevices
    private void setForceUseInt_SyncDevices(int usage, int config) {
        switch (usage) {
            case AudioSystem.FOR_MEDIA:
                if (config == AudioSystem.FORCE_NO_BT_A2DP) {
                    mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ALL_A2DP;
                } else { // config == AudioSystem.FORCE_NONE
                    mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ALL_A2DP;
                }
                break;
            case AudioSystem.FOR_DOCK:
                if (config == AudioSystem.FORCE_ANALOG_DOCK) {
                    mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;