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

Commit c9e0e46d authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "AudioDeviceInventory: improve BT device switch time" into main

parents 7e34b391 eaa7253d
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;
        }
    }

@@ -1680,10 +1688,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);
        }
    }

@@ -1930,10 +1939,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;
@@ -1053,19 +1057,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*/);
        }
    }

@@ -1180,7 +1184,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();
@@ -1788,14 +1793,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)
@@ -1829,7 +1835,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)
@@ -1856,7 +1863,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);
@@ -2030,7 +2038,7 @@ public class AudioDeviceInventory {
            }
        }
        if (disconnect) {
            mDeviceBroker.onSetBtScoActiveDevice(null);
            mDeviceBroker.onSetBtScoActiveDevice(null, false /*deviceSwitch*/);
        }
    }

@@ -2068,7 +2076,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
@@ -2124,7 +2133,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.
@@ -2362,7 +2371,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");
@@ -2393,7 +2402,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(
@@ -2404,7 +2413,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);

@@ -2440,7 +2450,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="
@@ -2465,7 +2475,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));
@@ -2485,7 +2495,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
@@ -2515,12 +2525,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));
@@ -2622,7 +2632,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
@@ -2669,13 +2679,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(
@@ -2685,7 +2695,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