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

Commit eaa7253d authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioDeviceInventory: improve BT device switch time

Add an argument to AudioSystem.setDeviceConnectionState()
to indicate that a device disconnection is part of a disconnect/connect
sequence corresponding to a switch betwen two devices of the same type
(same profile for Bluetooth devices).
This is currently only used for Bluetooth devices.
This tells the audio policy manager that some of the rerouting operations
that normally happen when a device is disconnected can be skipped.

Flag: com.android.media.audio.optimize_bt_device_switch
Bug: 373867402
Test: Bluetooth audio use cases regression
Change-Id: I7848fd541bf4baa529907426034c0dc10ced3773
parent 079754df
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -664,14 +664,16 @@ static void android_media_AudioSystem_vol_range_init_req_callback()

static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz,
                                                               jint state, jobject jParcel,
                                                               jint codec) {
                                                               jint codec, jboolean deviceSwitch) {
    int status;
    if (Parcel *parcel = parcelForJavaObject(env, jParcel); parcel != nullptr) {
        android::media::audio::common::AudioPort port{};
        if (status_t statusOfParcel = port.readFromParcel(parcel); statusOfParcel == OK) {
            status = check_AudioSystem_Command(
                AudioSystem::setDeviceConnectionState(static_cast<audio_policy_dev_state_t>(state),
                                                      port, static_cast<audio_format_t>(codec)));
                    AudioSystem::setDeviceConnectionState(static_cast<audio_policy_dev_state_t>(
                                                                  state),
                                                          port, static_cast<audio_format_t>(codec),
                                                          deviceSwitch));
        } else {
            ALOGE("Failed to read from parcel: %s", statusToString(statusOfParcel).c_str());
            status = kAudioStatusError;
@@ -3457,7 +3459,7 @@ static const JNINativeMethod gMethods[] = {
        MAKE_AUDIO_SYSTEM_METHOD(newAudioSessionId),
        MAKE_AUDIO_SYSTEM_METHOD(newAudioPlayerId),
        MAKE_AUDIO_SYSTEM_METHOD(newAudioRecorderId),
        MAKE_JNI_NATIVE_METHOD("setDeviceConnectionState", "(ILandroid/os/Parcel;I)I",
        MAKE_JNI_NATIVE_METHOD("setDeviceConnectionState", "(ILandroid/os/Parcel;IZ)I",
                               android_media_AudioSystem_setDeviceConnectionState),
        MAKE_AUDIO_SYSTEM_METHOD(getDeviceConnectionState),
        MAKE_AUDIO_SYSTEM_METHOD(handleDeviceConfigChange),
+13 −2
Original line number Diff line number Diff line
@@ -1754,13 +1754,21 @@ public class AudioSystem
    @UnsupportedAppUsage
    public static int setDeviceConnectionState(AudioDeviceAttributes attributes, int state,
            int codecFormat) {
        return setDeviceConnectionState(attributes, state, codecFormat, false /*deviceSwitch*/);
    }

    /**
     * @hide
     */
    public static int setDeviceConnectionState(AudioDeviceAttributes attributes, int state,
            int codecFormat, boolean deviceSwitch) {
        android.media.audio.common.AudioPort port =
                AidlConversion.api2aidl_AudioDeviceAttributes_AudioPort(attributes);
        Parcel parcel = Parcel.obtain();
        port.writeToParcel(parcel, 0);
        parcel.setDataPosition(0);
        try {
            return setDeviceConnectionState(state, parcel, codecFormat);
            return setDeviceConnectionState(state, parcel, codecFormat, deviceSwitch);
        } finally {
            parcel.recycle();
        }
@@ -1769,7 +1777,10 @@ public class AudioSystem
     * @hide
     */
    @UnsupportedAppUsage
    public static native int setDeviceConnectionState(int state, Parcel parcel, int codecFormat);
    public static native int setDeviceConnectionState(int state, Parcel parcel, int codecFormat,
                                                      boolean deviceSwitch);


    /** @hide */
    @UnsupportedAppUsage
    public static native int getDeviceConnectionState(int device, String device_address);
+18 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.audio;
import static android.media.audio.Flags.scoManagedByAudio;

import static com.android.media.audio.Flags.equalScoLeaVcIndexRange;
import static com.android.media.audio.Flags.optimizeBtDeviceSwitch;
import static com.android.server.audio.AudioService.BT_COMM_DEVICE_ACTIVE_BLE_HEADSET;
import static com.android.server.audio.AudioService.BT_COMM_DEVICE_ACTIVE_BLE_SPEAKER;
import static com.android.server.audio.AudioService.BT_COMM_DEVICE_ACTIVE_SCO;
@@ -290,8 +291,8 @@ public class AudioDeviceBroker {
    }

    @GuardedBy("mDeviceStateLock")
    /*package*/ void onSetBtScoActiveDevice(BluetoothDevice btDevice) {
        mBtHelper.onSetBtScoActiveDevice(btDevice);
    /*package*/ void onSetBtScoActiveDevice(BluetoothDevice btDevice, boolean deviceSwitch) {
        mBtHelper.onSetBtScoActiveDevice(btDevice, deviceSwitch);
    }

    /*package*/ void setBluetoothA2dpOn_Async(boolean on, String source) {
@@ -941,6 +942,7 @@ public class AudioDeviceBroker {
        final @NonNull String mEventSource;
        final int mAudioSystemDevice;
        final int mMusicDevice;
        final boolean mIsDeviceSwitch;

        BtDeviceInfo(@NonNull BtDeviceChangedData d, @NonNull BluetoothDevice device, int state,
                    int audioDevice, @AudioSystem.AudioFormatNativeEnumForBtCodec int codec) {
@@ -953,6 +955,8 @@ public class AudioDeviceBroker {
            mEventSource = d.mEventSource;
            mAudioSystemDevice = audioDevice;
            mMusicDevice = AudioSystem.DEVICE_NONE;
            mIsDeviceSwitch = optimizeBtDeviceSwitch()
                    && d.mNewDevice != null && d.mPreviousDevice != null;
        }

        // constructor used by AudioDeviceBroker to search similar message
@@ -966,6 +970,7 @@ public class AudioDeviceBroker {
            mSupprNoisy = false;
            mVolume = -1;
            mIsLeOutput = false;
            mIsDeviceSwitch = false;
        }

        // constructor used by AudioDeviceInventory when config change failed
@@ -980,6 +985,7 @@ public class AudioDeviceBroker {
            mSupprNoisy = false;
            mVolume = -1;
            mIsLeOutput = false;
            mIsDeviceSwitch = false;
        }

        BtDeviceInfo(@NonNull BtDeviceInfo src, int state) {
@@ -992,6 +998,7 @@ public class AudioDeviceBroker {
            mEventSource = src.mEventSource;
            mAudioSystemDevice = src.mAudioSystemDevice;
            mMusicDevice = src.mMusicDevice;
            mIsDeviceSwitch = false;
        }

        // redefine equality op so we can match messages intended for this device
@@ -1026,7 +1033,8 @@ public class AudioDeviceBroker {
                            + " isLeOutput=" + mIsLeOutput
                            + " eventSource=" + mEventSource
                            + " audioSystemDevice=" + mAudioSystemDevice
                            + " musicDevice=" + mMusicDevice;
                            + " musicDevice=" + mMusicDevice
                            + " isDeviceSwitch=" + mIsDeviceSwitch;
        }
    }

@@ -1708,10 +1716,11 @@ public class AudioDeviceBroker {
    }

    /*package*/ boolean handleDeviceConnection(@NonNull AudioDeviceAttributes attributes,
                                boolean connect, @Nullable BluetoothDevice btDevice) {
                                boolean connect, @Nullable BluetoothDevice btDevice,
                                boolean deviceSwitch) {
        synchronized (mDeviceStateLock) {
            return mDeviceInventory.handleDeviceConnection(
                    attributes, connect, false /*for test*/, btDevice);
                    attributes, connect, false /*for test*/, btDevice, deviceSwitch);
        }
    }

@@ -1958,10 +1967,12 @@ public class AudioDeviceBroker {
                                                || btInfo.mIsLeOutput)
                                            ? mAudioService.getBluetoothContextualVolumeStream()
                                            : AudioSystem.STREAM_DEFAULT);
                                if (btInfo.mProfile == BluetoothProfile.LE_AUDIO
                                if ((btInfo.mProfile == BluetoothProfile.LE_AUDIO
                                        || btInfo.mProfile == BluetoothProfile.HEARING_AID
                                        || (mScoManagedByAudio
                                            && btInfo.mProfile == BluetoothProfile.HEADSET)) {
                                            && btInfo.mProfile == BluetoothProfile.HEADSET))
                                        && (btInfo.mState == BluetoothProfile.STATE_CONNECTED
                                            || !btInfo.mIsDeviceSwitch)) {
                                    onUpdateCommunicationRouteClient(
                                            bluetoothScoRequestOwnerAttributionSource(),
                                            "setBluetoothActiveDevice");
+42 −31
Original line number Diff line number Diff line
@@ -799,7 +799,7 @@ public class AudioDeviceInventory {
                        di.mDeviceAddress,
                        di.mDeviceName),
                        AudioSystem.DEVICE_STATE_AVAILABLE,
                        di.mDeviceCodecFormat);
                        di.mDeviceCodecFormat, false /*deviceSwitch*/);
                if (asDeviceConnectionFailure() && res != AudioSystem.AUDIO_STATUS_OK) {
                    failedReconnectionDeviceList.add(di);
                }
@@ -811,7 +811,7 @@ public class AudioDeviceInventory {
                            EventLogger.Event.ALOGE, TAG);
                    mConnectedDevices.remove(di.getKey(), di);
                    if (AudioSystem.isBluetoothScoDevice(di.mDeviceType)) {
                        mDeviceBroker.onSetBtScoActiveDevice(null);
                        mDeviceBroker.onSetBtScoActiveDevice(null, false /*deviceSwitch*/);
                    }
                }
            }
@@ -851,7 +851,8 @@ public class AudioDeviceInventory {
            Log.d(TAG, "onSetBtActiveDevice"
                    + " btDevice=" + btInfo.mDevice
                    + " profile=" + BluetoothProfile.getProfileName(btInfo.mProfile)
                    + " state=" + BluetoothProfile.getConnectionStateName(btInfo.mState));
                    + " state=" + BluetoothProfile.getConnectionStateName(btInfo.mState)
                    + " isDeviceSwitch=" + btInfo.mIsDeviceSwitch);
        }
        String address = btInfo.mDevice.getAddress();
        if (!BluetoothAdapter.checkBluetoothAddress(address)) {
@@ -897,7 +898,8 @@ public class AudioDeviceInventory {
                    break;
                case BluetoothProfile.A2DP:
                    if (switchToUnavailable) {
                        makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat);
                        makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat,
                                                     btInfo.mIsDeviceSwitch);
                    } else if (switchToAvailable) {
                        // device is not already connected
                        if (btInfo.mVolume != -1) {
@@ -911,7 +913,7 @@ public class AudioDeviceInventory {
                    break;
                case BluetoothProfile.HEARING_AID:
                    if (switchToUnavailable) {
                        makeHearingAidDeviceUnavailable(address);
                        makeHearingAidDeviceUnavailable(address, btInfo.mIsDeviceSwitch);
                    } else if (switchToAvailable) {
                        makeHearingAidDeviceAvailable(address, BtHelper.getName(btInfo.mDevice),
                                streamType, "onSetBtActiveDevice");
@@ -921,7 +923,8 @@ public class AudioDeviceInventory {
                case BluetoothProfile.LE_AUDIO_BROADCAST:
                    if (switchToUnavailable) {
                        makeLeAudioDeviceUnavailableNow(address,
                                btInfo.mAudioSystemDevice, di.mDeviceCodecFormat);
                                btInfo.mAudioSystemDevice, di.mDeviceCodecFormat,
                                btInfo.mIsDeviceSwitch);
                    } else if (switchToAvailable) {
                        makeLeAudioDeviceAvailable(
                                btInfo, streamType, codec, "onSetBtActiveDevice");
@@ -930,9 +933,10 @@ public class AudioDeviceInventory {
                case BluetoothProfile.HEADSET:
                    if (mDeviceBroker.isScoManagedByAudio()) {
                        if (switchToUnavailable) {
                            mDeviceBroker.onSetBtScoActiveDevice(null);
                            mDeviceBroker.onSetBtScoActiveDevice(null, btInfo.mIsDeviceSwitch);
                        } else if (switchToAvailable) {
                            mDeviceBroker.onSetBtScoActiveDevice(btInfo.mDevice);
                            mDeviceBroker.onSetBtScoActiveDevice(
                                    btInfo.mDevice, false /*deviceSwitch*/);
                        }
                    }
                    break;
@@ -1052,19 +1056,19 @@ public class AudioDeviceInventory {

    /*package*/ void onMakeA2dpDeviceUnavailableNow(String address, int a2dpCodec) {
        synchronized (mDevicesLock) {
            makeA2dpDeviceUnavailableNow(address, a2dpCodec);
            makeA2dpDeviceUnavailableNow(address, a2dpCodec, false /*deviceSwitch*/);
        }
    }

    /*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device, int codec) {
        synchronized (mDevicesLock) {
            makeLeAudioDeviceUnavailableNow(address, device, codec);
            makeLeAudioDeviceUnavailableNow(address, device, codec, false /*deviceSwitch*/);
        }
    }

    /*package*/ void onMakeHearingAidDeviceUnavailableNow(String address) {
        synchronized (mDevicesLock) {
            makeHearingAidDeviceUnavailable(address);
            makeHearingAidDeviceUnavailable(address, false /*deviceSwitch*/);
        }
    }

@@ -1179,7 +1183,8 @@ public class AudioDeviceInventory {
            }

            if (!handleDeviceConnection(wdcs.mAttributes,
                    wdcs.mState == AudioService.CONNECTION_STATE_CONNECTED, wdcs.mForTest, null)) {
                    wdcs.mState == AudioService.CONNECTION_STATE_CONNECTED, wdcs.mForTest,
                    null, false /*deviceSwitch*/)) {
                // change of connection state failed, bailout
                mmi.set(MediaMetrics.Property.EARLY_RETURN, "change of connection state failed")
                        .record();
@@ -1787,14 +1792,15 @@ public class AudioDeviceInventory {
     */
    /*package*/ boolean handleDeviceConnection(@NonNull AudioDeviceAttributes attributes,
                                               boolean connect, boolean isForTesting,
                                               @Nullable BluetoothDevice btDevice) {
                                               @Nullable BluetoothDevice btDevice,
                                               boolean deviceSwitch) {
        int device = attributes.getInternalType();
        String address = attributes.getAddress();
        String deviceName = attributes.getName();
        if (AudioService.DEBUG_DEVICES) {
            Slog.i(TAG, "handleDeviceConnection(" + connect + " dev:"
                    + Integer.toHexString(device) + " address:" + address
                    + " name:" + deviceName + ")");
                    + " name:" + deviceName + ", deviceSwitch: " + deviceSwitch + ")");
        }
        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "handleDeviceConnection")
                .set(MediaMetrics.Property.ADDRESS, address)
@@ -1828,7 +1834,8 @@ public class AudioDeviceInventory {
                    res = AudioSystem.AUDIO_STATUS_OK;
                } else {
                    res = mAudioSystem.setDeviceConnectionState(attributes,
                            AudioSystem.DEVICE_STATE_AVAILABLE, AudioSystem.AUDIO_FORMAT_DEFAULT);
                            AudioSystem.DEVICE_STATE_AVAILABLE, AudioSystem.AUDIO_FORMAT_DEFAULT,
                            false /*deviceSwitch*/);
                }
                if (res != AudioSystem.AUDIO_STATUS_OK) {
                    final String reason = "not connecting device 0x" + Integer.toHexString(device)
@@ -1855,7 +1862,8 @@ public class AudioDeviceInventory {
                status = true;
            } else if (!connect && isConnected) {
                mAudioSystem.setDeviceConnectionState(attributes,
                        AudioSystem.DEVICE_STATE_UNAVAILABLE, AudioSystem.AUDIO_FORMAT_DEFAULT);
                        AudioSystem.DEVICE_STATE_UNAVAILABLE, AudioSystem.AUDIO_FORMAT_DEFAULT,
                        deviceSwitch);
                // always remove even if disconnection failed
                mConnectedDevices.remove(deviceKey);
                mDeviceBroker.postCheckCommunicationDeviceRemoval(attributes);
@@ -2029,7 +2037,7 @@ public class AudioDeviceInventory {
            }
        }
        if (disconnect) {
            mDeviceBroker.onSetBtScoActiveDevice(null);
            mDeviceBroker.onSetBtScoActiveDevice(null, false /*deviceSwitch*/);
        }
    }

@@ -2067,7 +2075,8 @@ public class AudioDeviceInventory {
                        || info.mProfile == BluetoothProfile.LE_AUDIO_BROADCAST)
                        && info.mIsLeOutput)
                        || info.mProfile == BluetoothProfile.HEARING_AID
                        || info.mProfile == BluetoothProfile.A2DP)) {
                        || info.mProfile == BluetoothProfile.A2DP)
                    && !info.mIsDeviceSwitch) {
                @AudioService.ConnectionState int asState =
                        (info.mState == BluetoothProfile.STATE_CONNECTED)
                                ? AudioService.CONNECTION_STATE_CONNECTED
@@ -2123,7 +2132,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, codec);
                AudioSystem.DEVICE_STATE_AVAILABLE, codec, false);

        // TODO: log in MediaMetrics once distinction between connection failure and
        // double connection is made.
@@ -2361,7 +2370,7 @@ public class AudioDeviceInventory {
    }

    @GuardedBy("mDevicesLock")
    private void makeA2dpDeviceUnavailableNow(String address, int codec) {
    private void makeA2dpDeviceUnavailableNow(String address, int codec, boolean deviceSwitch) {
        MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "a2dp." + address)
                .set(MediaMetrics.Property.ENCODING, AudioSystem.audioFormatToString(codec))
                .set(MediaMetrics.Property.EVENT, "makeA2dpDeviceUnavailableNow");
@@ -2392,7 +2401,7 @@ public class AudioDeviceInventory {
        AudioDeviceAttributes ada = new AudioDeviceAttributes(
                AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address);
        final int res = mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_UNAVAILABLE, codec);
                AudioSystem.DEVICE_STATE_UNAVAILABLE, codec, deviceSwitch);

        if (res != AudioSystem.AUDIO_STATUS_OK) {
            AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
@@ -2403,7 +2412,8 @@ public class AudioDeviceInventory {
        } else {
            AudioService.sDeviceLogger.enqueue((new EventLogger.StringEvent(
                    "A2DP device addr=" + Utils.anonymizeBluetoothAddress(address)
                            + " made unavailable")).printSlog(EventLogger.Event.ALOGI, TAG));
                            + " made unavailable, deviceSwitch" + deviceSwitch))
                    .printSlog(EventLogger.Event.ALOGI, TAG));
        }
        mApmConnectedDevices.remove(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);

@@ -2439,7 +2449,7 @@ public class AudioDeviceInventory {
        final int res = mAudioSystem.setDeviceConnectionState(new AudioDeviceAttributes(
                AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address),
                AudioSystem.DEVICE_STATE_AVAILABLE,
                AudioSystem.AUDIO_FORMAT_DEFAULT);
                AudioSystem.AUDIO_FORMAT_DEFAULT, false);
        if (res != AudioSystem.AUDIO_STATUS_OK) {
            AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                    "APM failed to make available A2DP source device addr="
@@ -2464,7 +2474,7 @@ public class AudioDeviceInventory {
                AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address);
        mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_UNAVAILABLE,
                AudioSystem.AUDIO_FORMAT_DEFAULT);
                AudioSystem.AUDIO_FORMAT_DEFAULT, false);
        // always remove regardless of the result
        mConnectedDevices.remove(
                DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, address));
@@ -2484,7 +2494,7 @@ public class AudioDeviceInventory {
                DEVICE_OUT_HEARING_AID, address, name);
        final int res = mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_AVAILABLE,
                AudioSystem.AUDIO_FORMAT_DEFAULT);
                AudioSystem.AUDIO_FORMAT_DEFAULT, false);
        if (asDeviceConnectionFailure() && res != AudioSystem.AUDIO_STATUS_OK) {
            AudioService.sDeviceLogger.enqueueAndSlog(
                    "APM failed to make available HearingAid addr=" + address
@@ -2514,12 +2524,12 @@ public class AudioDeviceInventory {
    }

    @GuardedBy("mDevicesLock")
    private void makeHearingAidDeviceUnavailable(String address) {
    private void makeHearingAidDeviceUnavailable(String address, boolean deviceSwitch) {
        AudioDeviceAttributes ada = new AudioDeviceAttributes(
                DEVICE_OUT_HEARING_AID, address);
        mAudioSystem.setDeviceConnectionState(ada,
                AudioSystem.DEVICE_STATE_UNAVAILABLE,
                AudioSystem.AUDIO_FORMAT_DEFAULT);
                AudioSystem.AUDIO_FORMAT_DEFAULT, deviceSwitch);
        // always remove regardless of return code
        mConnectedDevices.remove(
                DeviceInfo.makeDeviceListKey(DEVICE_OUT_HEARING_AID, address));
@@ -2621,7 +2631,7 @@ public class AudioDeviceInventory {

            AudioDeviceAttributes ada = new AudioDeviceAttributes(device, address, name);
            final int res = mAudioSystem.setDeviceConnectionState(ada,
                    AudioSystem.DEVICE_STATE_AVAILABLE, codec);
                    AudioSystem.DEVICE_STATE_AVAILABLE, codec, false /*deviceSwitch*/);
            if (res != AudioSystem.AUDIO_STATUS_OK) {
                AudioService.sDeviceLogger.enqueueAndSlog(
                        "APM failed to make available LE Audio device addr=" + address
@@ -2668,13 +2678,13 @@ public class AudioDeviceInventory {

    @GuardedBy("mDevicesLock")
    private void makeLeAudioDeviceUnavailableNow(String address, int device,
            @AudioSystem.AudioFormatNativeEnumForBtCodec int codec) {
            @AudioSystem.AudioFormatNativeEnumForBtCodec int codec,  boolean deviceSwitch) {
        AudioDeviceAttributes ada = null;
        if (device != AudioSystem.DEVICE_NONE) {
            ada = new AudioDeviceAttributes(device, address);
            final int res = mAudioSystem.setDeviceConnectionState(ada,
                    AudioSystem.DEVICE_STATE_UNAVAILABLE,
                    codec);
                    codec, deviceSwitch);

            if (res != AudioSystem.AUDIO_STATUS_OK) {
                AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
@@ -2684,7 +2694,8 @@ public class AudioDeviceInventory {
            } else {
                AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
                        "LE Audio device addr=" + Utils.anonymizeBluetoothAddress(address)
                                + " made unavailable").printSlog(EventLogger.Event.ALOGI, TAG));
                            + " made unavailable, deviceSwitch" + deviceSwitch)
                        .printSlog(EventLogger.Event.ALOGI, TAG));
            }
            mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address));
        }
+3 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ import static com.android.media.audio.Flags.audioserverPermissions;
import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume;
import static com.android.media.audio.Flags.deferWearPermissionUpdates;
import static com.android.media.audio.Flags.equalScoLeaVcIndexRange;
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;
@@ -4990,6 +4991,8 @@ public class AudioService extends IAudioService.Stub
                + cacheGetStreamMinMaxVolume());
        pw.println("\tandroid.media.audio.Flags.cacheGetStreamVolume:"
                + cacheGetStreamVolume());
        pw.println("\tcom.android.media.audio.optimizeBtDeviceSwitch:"
                + optimizeBtDeviceSwitch());
    }
    private void dumpAudioMode(PrintWriter pw) {
Loading