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

Commit 2aceac75 authored by Shunkai Yao's avatar Shunkai Yao
Browse files

AudioService: AudioDeviceBroker: get codec in message handler

If we call mBtHelper.getA2dpCodec before msg handling, the codec could
be updated later by other msgs in queue.

Bug: 289681953
Test: make
Test: test on Pixel device with A2DP device connect/reconnect
Change-Id: Ia8d542a3a2ca9f86489e4370cca8f0eb16f26e17
parent fa9475de
Loading
Loading
Loading
Loading
+29 −25
Original line number Diff line number Diff line
@@ -772,7 +772,6 @@ public class AudioDeviceBroker {
        final int mVolume;
        final boolean mIsLeOutput;
        final @NonNull String mEventSource;
        final @AudioSystem.AudioFormatNativeEnumForBtCodec int mCodec;
        final int mAudioSystemDevice;
        final int mMusicDevice;

@@ -787,7 +786,6 @@ public class AudioDeviceBroker {
            mEventSource = d.mEventSource;
            mAudioSystemDevice = audioDevice;
            mMusicDevice = AudioSystem.DEVICE_NONE;
            mCodec = codec;
        }

        // constructor used by AudioDeviceBroker to search similar message
@@ -796,7 +794,6 @@ public class AudioDeviceBroker {
            mProfile = profile;
            mEventSource = "";
            mMusicDevice = AudioSystem.DEVICE_NONE;
            mCodec = AudioSystem.AUDIO_FORMAT_DEFAULT;
            mAudioSystemDevice = 0;
            mState = 0;
            mSupprNoisy = false;
@@ -811,7 +808,6 @@ public class AudioDeviceBroker {
            mProfile = profile;
            mEventSource = "";
            mMusicDevice = musicDevice;
            mCodec = AudioSystem.AUDIO_FORMAT_DEFAULT;
            mAudioSystemDevice = audioSystemDevice;
            mState = state;
            mSupprNoisy = false;
@@ -829,7 +825,6 @@ public class AudioDeviceBroker {
            mEventSource = src.mEventSource;
            mAudioSystemDevice = src.mAudioSystemDevice;
            mMusicDevice = src.mMusicDevice;
            mCodec = src.mCodec;
        }

        // redefine equality op so we can match messages intended for this device
@@ -847,6 +842,19 @@ public class AudioDeviceBroker {
            }
            return false;
        }

        @Override
        public String toString() {
            return "BtDeviceInfo: device=" + mDevice.toString()
                            + " state=" + mState
                            + " prof=" + mProfile
                            + " supprNoisy=" + mSupprNoisy
                            + " volume=" + mVolume
                            + " isLeOutput=" + mIsLeOutput
                            + " eventSource=" + mEventSource
                            + " audioSystemDevice=" + mAudioSystemDevice
                            + " musicDevice=" + mMusicDevice;
        }
    }

    BtDeviceInfo createBtDeviceInfo(@NonNull BtDeviceChangedData d, @NonNull BluetoothDevice device,
@@ -859,9 +867,6 @@ public class AudioDeviceBroker {
                break;
            case BluetoothProfile.A2DP:
                audioDevice = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
                synchronized (mDeviceStateLock) {
                    codec = mBtHelper.getA2dpCodec(device);
                }
                break;
            case BluetoothProfile.HEARING_AID:
                audioDevice = AudioSystem.DEVICE_OUT_HEARING_AID;
@@ -1696,8 +1701,11 @@ public class AudioDeviceBroker {
                case MSG_L_SET_BT_ACTIVE_DEVICE:
                    synchronized (mSetModeLock) {
                        synchronized (mDeviceStateLock) {
                            BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
                            mDeviceInventory.onSetBtActiveDevice(btInfo,
                            final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
                            @AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
                                    mBtHelper.getA2dpCodecWithFallbackToSBC(
                                            btInfo.mDevice, "MSG_L_SET_BT_ACTIVE_DEVICE");
                            mDeviceInventory.onSetBtActiveDevice(btInfo, codec,
                                    (btInfo.mProfile
                                            != BluetoothProfile.LE_AUDIO || btInfo.mIsLeOutput)
                                            ? mAudioService.getBluetoothContextualVolumeStream()
@@ -1730,12 +1738,16 @@ public class AudioDeviceBroker {
                                (String) msg.obj, msg.arg1);
                    }
                    break;
                case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE:
                case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE: {
                    final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
                    synchronized (mDeviceStateLock) {
                        @AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
                                mBtHelper.getA2dpCodecWithFallbackToSBC(
                                        btInfo.mDevice, "MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE");
                        mDeviceInventory.onBluetoothDeviceConfigChange(
                                (BtDeviceInfo) msg.obj, BtHelper.EVENT_DEVICE_CONFIG_CHANGE);
                                btInfo, codec, BtHelper.EVENT_DEVICE_CONFIG_CHANGE);
                    }
                    break;
                } break;
                case MSG_BROADCAST_AUDIO_BECOMING_NOISY:
                    onSendBecomingNoisyIntent();
                    break;
@@ -1831,20 +1843,12 @@ public class AudioDeviceBroker {
                    }
                    break;
                case MSG_L_BT_ACTIVE_DEVICE_CHANGE_EXT: {
                    final BtDeviceInfo info = (BtDeviceInfo) msg.obj;
                    if (info.mDevice == null) break;
                    final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
                    if (btInfo.mDevice == null) break;
                    AudioService.sDeviceLogger.enqueue((new EventLogger.StringEvent(
                            "msg: onBluetoothActiveDeviceChange "
                                    + " state=" + info.mState
                                    // only querying address as this is the only readily available
                                    // field on the device
                                    + " addr=" + info.mDevice.getAddress()
                                    + " prof=" + info.mProfile
                                    + " supprNoisy=" + info.mSupprNoisy
                                    + " src=" + info.mEventSource
                                    )).printLog(TAG));
                            "msg: onBluetoothActiveDeviceChange " + btInfo)).printLog(TAG));
                    synchronized (mDeviceStateLock) {
                        mDeviceInventory.setBluetoothActiveDevice(info);
                        mDeviceInventory.setBluetoothActiveDevice(btInfo);
                    }
                } break;
                case MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY: {
+31 −38
Original line number Diff line number Diff line
@@ -503,9 +503,11 @@ public class AudioDeviceInventory {
        }
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    void onSetBtActiveDevice(@NonNull AudioDeviceBroker.BtDeviceInfo btInfo, int streamType) {
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    void onSetBtActiveDevice(@NonNull AudioDeviceBroker.BtDeviceInfo btInfo,
                             @AudioSystem.AudioFormatNativeEnumForBtCodec int codec,
                             int streamType) {
        if (AudioService.DEBUG_DEVICES) {
            Log.d(TAG, "onSetBtActiveDevice"
                    + " btDevice=" + btInfo.mDevice
@@ -518,10 +520,7 @@ public class AudioDeviceInventory {
        }

        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent("BT connected:"
                        + " addr=" + address
                        + " profile=" + btInfo.mProfile
                        + " state=" + btInfo.mState
                        + " codec=" + AudioSystem.audioFormatToString(btInfo.mCodec)));
                        + btInfo + " codec=" + AudioSystem.audioFormatToString(codec)));

        new MediaMetrics.Item(mMetricsId + "onSetBtActiveDevice")
                .set(MediaMetrics.Property.STATUS, btInfo.mProfile)
@@ -529,7 +528,7 @@ public class AudioDeviceInventory {
                        AudioSystem.getDeviceName(btInfo.mAudioSystemDevice))
                .set(MediaMetrics.Property.ADDRESS, address)
                .set(MediaMetrics.Property.ENCODING,
                        AudioSystem.audioFormatToString(btInfo.mCodec))
                        AudioSystem.audioFormatToString(codec))
                .set(MediaMetrics.Property.EVENT, "onSetBtActiveDevice")
                .set(MediaMetrics.Property.STREAM_TYPE,
                        AudioSystem.streamToString(streamType))
@@ -568,7 +567,7 @@ public class AudioDeviceInventory {
                                    btInfo.mVolume * 10, btInfo.mAudioSystemDevice,
                                    "onSetBtActiveDevice");
                        }
                        makeA2dpDeviceAvailable(btInfo, "onSetBtActiveDevice");
                        makeA2dpDeviceAvailable(btInfo, codec, "onSetBtActiveDevice");
                    }
                    break;
                case BluetoothProfile.HEARING_AID:
@@ -594,9 +593,10 @@ public class AudioDeviceInventory {
    }


    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ void onBluetoothDeviceConfigChange(
            @NonNull AudioDeviceBroker.BtDeviceInfo btInfo, int event) {
            @NonNull AudioDeviceBroker.BtDeviceInfo btInfo,
            @AudioSystem.AudioFormatNativeEnumForBtCodec int codec, int event) {
        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId
                + "onBluetoothDeviceConfigChange")
                .set(MediaMetrics.Property.EVENT, BtHelper.deviceEventToString(event));
@@ -610,7 +610,6 @@ public class AudioDeviceInventory {
            Log.d(TAG, "onBluetoothDeviceConfigChange btDevice=" + btDevice);
        }
        int volume = btInfo.mVolume;
        @AudioSystem.AudioFormatNativeEnumForBtCodec final int audioCodec = btInfo.mCodec;

        String address = btDevice.getAddress();
        if (!BluetoothAdapter.checkBluetoothAddress(address)) {
@@ -639,8 +638,7 @@ public class AudioDeviceInventory {
            }

            mmi.set(MediaMetrics.Property.ADDRESS, address)
                    .set(MediaMetrics.Property.ENCODING,
                            AudioSystem.audioFormatToString(audioCodec))
                    .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(codec))
                    .set(MediaMetrics.Property.INDEX, volume)
                    .set(MediaMetrics.Property.NAME, di.mDeviceName);

@@ -648,20 +646,19 @@ public class AudioDeviceInventory {
            if (event == BtHelper.EVENT_DEVICE_CONFIG_CHANGE) {
                boolean a2dpCodecChange = false;
                if (btInfo.mProfile == BluetoothProfile.A2DP) {
                    if (di.mDeviceCodecFormat != audioCodec) {
                        di.mDeviceCodecFormat = audioCodec;
                    if (di.mDeviceCodecFormat != codec) {
                        di.mDeviceCodecFormat = codec;
                        mConnectedDevices.replace(key, di);
                        a2dpCodecChange = true;
                    }
                    final int res = mAudioSystem.handleDeviceConfigChange(
                            btInfo.mAudioSystemDevice, address,
                            BtHelper.getName(btDevice), audioCodec);
                            btInfo.mAudioSystemDevice, address, BtHelper.getName(btDevice), codec);

                    if (res != AudioSystem.AUDIO_STATUS_OK) {
                        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                                "APM handleDeviceConfigChange failed for A2DP device addr="
                                        + address + " codec="
                                        + AudioSystem.audioFormatToString(audioCodec))
                                        + AudioSystem.audioFormatToString(codec))
                                .printLog(TAG));

                        // force A2DP device disconnection in case of error so that AudioService
@@ -672,7 +669,7 @@ public class AudioDeviceInventory {
                        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                                "APM handleDeviceConfigChange success for A2DP device addr="
                                        + address
                                        + " codec=" + AudioSystem.audioFormatToString(audioCodec))
                                        + " codec=" + AudioSystem.audioFormatToString(codec))
                                .printLog(TAG));

                    }
@@ -1338,7 +1335,7 @@ public class AudioDeviceInventory {
     * @param device the device whose connection state is queried
     * @return true if connected
     */
    // called with AudioDeviceBroker.mDeviceStateLock lock held
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    public boolean isDeviceConnected(@NonNull AudioDeviceAttributes device) {
        final String key = DeviceInfo.makeDeviceListKey(device.getInternalType(),
                device.getAddress());
@@ -1489,7 +1486,7 @@ public class AudioDeviceInventory {
        }
    }

    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ void onBtProfileDisconnected(int profile) {
        switch (profile) {
            case BluetoothProfile.HEADSET:
@@ -1554,7 +1551,7 @@ public class AudioDeviceInventory {
        disconnectLeAudio(AudioSystem.DEVICE_OUT_BLE_BROADCAST);
    }

    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    private void disconnectHeadset() {
        boolean disconnect = false;
        synchronized (mDevicesLock) {
@@ -1594,9 +1591,10 @@ public class AudioDeviceInventory {
        return mCurAudioRoutes;
    }

    // only public for mocking/spying
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    @VisibleForTesting
    /**
     * Set a Bluetooth device to active.
     */
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    public int setBluetoothActiveDevice(@NonNull AudioDeviceBroker.BtDeviceInfo info) {
        int delay;
        synchronized (mDevicesLock) {
@@ -1617,12 +1615,7 @@ public class AudioDeviceInventory {
            }

            if (AudioService.DEBUG_DEVICES) {
                Log.i(TAG, "setBluetoothActiveDevice device: " + info.mDevice
                        + " profile: " + BluetoothProfile.getProfileName(info.mProfile)
                        + " state: " + BluetoothProfile.getConnectionStateName(info.mState)
                        + " delay(ms): " + delay
                        + " codec:" + Integer.toHexString(info.mCodec)
                        + " suppressNoisyIntent: " + info.mSupprNoisy);
                Log.i(TAG, "setBluetoothActiveDevice " + info.toString() + " delay(ms): " + delay);
            }
            mDeviceBroker.postBluetoothActiveDevice(info, delay);
            if (info.mProfile == BluetoothProfile.HEARING_AID
@@ -1658,10 +1651,10 @@ public class AudioDeviceInventory {

    @GuardedBy("mDevicesLock")
    private void makeA2dpDeviceAvailable(AudioDeviceBroker.BtDeviceInfo btInfo,
                                         @AudioSystem.AudioFormatNativeEnumForBtCodec int codec,
                                         String eventSource) {
        final String address = btInfo.mDevice.getAddress();
        final String name = BtHelper.getName(btInfo.mDevice);
        final int a2dpCodec = btInfo.mCodec;

        // enable A2DP before notifying A2DP connection to avoid unnecessary processing in
        // audio policy manager
@@ -1671,7 +1664,7 @@ public class AudioDeviceInventory {
        AudioDeviceAttributes ada = new AudioDeviceAttributes(
                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address, name);
        final int res = mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_AVAILABLE, a2dpCodec);
                AudioSystem.DEVICE_STATE_AVAILABLE, codec);

        // TODO: log in MediaMetrics once distinction between connection failure and
        // double connection is made.
@@ -1694,7 +1687,7 @@ public class AudioDeviceInventory {
        //   time_low = 0, time_mid = 0, time_hi = 0, clock_seq = 0, node = MAC Address
        UUID sensorUuid = UuidUtils.uuidFromAudioDeviceAttributes(ada);
        final DeviceInfo di = new DeviceInfo(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, name,
                address, a2dpCodec, sensorUuid);
                address, codec, sensorUuid);
        final String diKey = di.getKey();
        mConnectedDevices.put(diKey, di);
        // on a connection always overwrite the device seen by AudioPolicy, see comment above when
@@ -1910,9 +1903,9 @@ public class AudioDeviceInventory {
    }

    @GuardedBy("mDevicesLock")
    private void makeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {
    private void makeA2dpDeviceUnavailableNow(String address, int codec) {
        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "a2dp." + address)
                .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(a2dpCodec))
                .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(codec))
                .set(MediaMetrics.Property.EVENT, "makeA2dpDeviceUnavailableNow");

        if (address == null) {
@@ -1939,7 +1932,7 @@ public class AudioDeviceInventory {
        AudioDeviceAttributes ada = new AudioDeviceAttributes(
                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
        final int res = mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_UNAVAILABLE, a2dpCodec);
                AudioSystem.DEVICE_STATE_UNAVAILABLE, codec);

        if (res != AudioSystem.AUDIO_STATUS_OK) {
            AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
+34 −20
Original line number Diff line number Diff line
@@ -173,8 +173,8 @@ public class BtHelper {
    //----------------------------------------------------------------------
    // Interface for AudioDeviceBroker

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized void onSystemReady() {
        mScoConnectionState = android.media.AudioManager.SCO_AUDIO_STATE_ERROR;
        resetBluetoothSco();
@@ -263,8 +263,20 @@ public class BtHelper {
        return AudioSystem.bluetoothCodecToAudioFormat(btCodecConfig.getCodecType());
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec
            int getA2dpCodecWithFallbackToSBC(
                    @NonNull BluetoothDevice device, @NonNull String source) {
        @AudioSystem.AudioFormatNativeEnumForBtCodec int codec = getA2dpCodec(device);
        if (codec == AudioSystem.AUDIO_FORMAT_DEFAULT) {
            AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                    "getA2dpCodec DEFAULT from " + source + " fallback to SBC"));
            return AudioSystem.AUDIO_FORMAT_SBC;
        }
        return codec;
    }

    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized void onReceiveBtEvent(Intent intent) {
        final String action = intent.getAction();

@@ -283,8 +295,8 @@ public class BtHelper {
     * Exclusively called from AudioDeviceBroker when handling MSG_L_RECEIVED_BT_EVENT
     * as part of the serialization of the communication route selection
     */
    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    private void onScoAudioStateChanged(int state) {
        boolean broadcast = false;
        int scoAudioState = AudioManager.SCO_AUDIO_STATE_ERROR;
@@ -355,16 +367,16 @@ public class BtHelper {
                == BluetoothHeadset.STATE_AUDIO_CONNECTED;
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized boolean startBluetoothSco(int scoAudioMode,
                @NonNull String eventSource) {
        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(eventSource));
        return requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode);
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized boolean stopBluetoothSco(@NonNull String eventSource) {
        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(eventSource));
        return requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED, SCO_MODE_VIRTUAL_CALL);
@@ -435,8 +447,8 @@ public class BtHelper {
        mScoConnectionState = state;
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized void resetBluetoothSco() {
        mScoAudioState = SCO_STATE_INACTIVE;
        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
@@ -445,7 +457,8 @@ public class BtHelper {
        mDeviceBroker.setBluetoothScoOn(false, "resetBluetoothSco");
    }

    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized void onBtProfileDisconnected(int profile) {
        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                "BT profile " + BluetoothProfile.getProfileName(profile) + " disconnected"));
@@ -474,7 +487,8 @@ public class BtHelper {
        }
    }

    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package*/ synchronized void onBtProfileConnected(int profile, BluetoothProfile proxy) {
        AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                "BT profile " + BluetoothProfile.getProfileName(profile) + " connected to proxy "
@@ -522,8 +536,8 @@ public class BtHelper {
        }
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    private void onHeadsetProfileConnected(BluetoothHeadset headset) {
        // Discard timeout message
        mDeviceBroker.handleCancelFailureToConnectToBtHeadsetService();
@@ -642,8 +656,8 @@ public class BtHelper {
        return btDevice == null ? "(null)" : btDevice.getAnonymizedAddress();
    }

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    /*package */ synchronized void onSetBtScoActiveDevice(BluetoothDevice btDevice) {
        Log.i(TAG, "onSetBtScoActiveDevice: " + getAnonymizedAddress(mBluetoothHeadsetDevice)
                + " -> " + getAnonymizedAddress(btDevice));
@@ -712,8 +726,8 @@ public class BtHelper {

    //----------------------------------------------------------------------

    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
    // @GuardedBy("mDeviceBroker.mSetModeLock")
    // @GuardedBy("AudioDeviceBroker.this.mDeviceStateLock")
    @GuardedBy("BtHelper.this")
    private boolean requestScoState(int state, int scoAudioMode) {
        checkScoAudioState();
+2 −1
Original line number Diff line number Diff line
@@ -261,7 +261,8 @@ public class AudioDeviceBrokerTest {
        // Verify disconnection has been cancelled and we're seeing two connections attempts,
        // with the device connected at the end of the test
        verify(mSpyDevInventory, times(2)).onSetBtActiveDevice(
                any(AudioDeviceBroker.BtDeviceInfo.class), anyInt());
                any(AudioDeviceBroker.BtDeviceInfo.class), anyInt() /*codec*/,
                anyInt() /*streamType*/);
        Assert.assertTrue("Mock device not connected",
                mSpyDevInventory.isA2dpDeviceConnected(mFakeBtDevice));