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

Commit 356ed8cb authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "audio: toggle hdmitx/hdmiarc when switch surround mode" into main am:...

Merge "audio: toggle hdmitx/hdmiarc when switch surround mode" into main am: ff8c3e06 am: ce8d5153

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/3192271



Change-Id: Ife7ebcaefccb912ff4942fc95375629c1eb61a29
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 5e465c4b ce8d5153
Loading
Loading
Loading
Loading
+54 −20
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothProfile;
import android.content.Intent;
import android.media.AudioDescriptor;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioDevicePort;
@@ -47,6 +48,7 @@ import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioManager.AudioDeviceCategory;
import android.media.AudioPort;
import android.media.AudioProfile;
import android.media.AudioRoutesInfo;
import android.media.AudioSystem;
import android.media.IAudioRoutesObserver;
@@ -619,6 +621,8 @@ public class AudioDeviceInventory {
        final int mGroupId;
        @NonNull String mPeerDeviceAddress;
        @NonNull String mPeerIdentityDeviceAddress;
        @NonNull List<AudioProfile> mAudioProfiles;
        @NonNull List<AudioDescriptor> mAudioDescriptors;

        /** Disabled operating modes for this device. Use a negative logic so that by default
         * an empty list means all modes are allowed.
@@ -627,7 +631,8 @@ public class AudioDeviceInventory {

        DeviceInfo(int deviceType, String deviceName, String address,
                   String identityAddress, int codecFormat,
                   int groupId, String peerAddress, String peerIdentityAddress) {
                   int groupId, String peerAddress, String peerIdentityAddress,
                   List<AudioProfile> profiles, List<AudioDescriptor> descriptors) {
            mDeviceType = deviceType;
            mDeviceName = TextUtils.emptyIfNull(deviceName);
            mDeviceAddress = TextUtils.emptyIfNull(address);
@@ -639,6 +644,16 @@ public class AudioDeviceInventory {
            mGroupId = groupId;
            mPeerDeviceAddress = TextUtils.emptyIfNull(peerAddress);
            mPeerIdentityDeviceAddress = TextUtils.emptyIfNull(peerIdentityAddress);
            mAudioProfiles = profiles;
            mAudioDescriptors = descriptors;
        }

        DeviceInfo(int deviceType, String deviceName, String address,
                   String identityAddress, int codecFormat,
                   int groupId, String peerAddress, String peerIdentityAddress) {
            this(deviceType, deviceName, address, identityAddress, codecFormat,
                    groupId, peerAddress, peerIdentityAddress,
                    new ArrayList<>(), new ArrayList<>());
        }

        /** Constructor for all devices except A2DP sink and LE Audio */
@@ -646,6 +661,13 @@ public class AudioDeviceInventory {
            this(deviceType, deviceName, address, null, AudioSystem.AUDIO_FORMAT_DEFAULT);
        }

        /** Constructor for HDMI OUT, HDMI ARC/EARC sink devices */
        DeviceInfo(int deviceType, String deviceName, String address,
            List<AudioProfile> profiles, List<AudioDescriptor> descriptors) {
            this(deviceType, deviceName, address, null, AudioSystem.AUDIO_FORMAT_DEFAULT,
                BluetoothLeAudio.GROUP_ID_INVALID, null, null, profiles, descriptors);
        }

        /** Constructor for A2DP sink devices */
        DeviceInfo(int deviceType, String deviceName, String address,
                   String identityAddress, int codecFormat) {
@@ -1194,28 +1216,32 @@ public class AudioDeviceInventory {
    }

    /*package*/ void onToggleHdmi() {
        final int[] hdmiDevices = { AudioSystem.DEVICE_OUT_HDMI,
                AudioSystem.DEVICE_OUT_HDMI_ARC, AudioSystem.DEVICE_OUT_HDMI_EARC };

        synchronized (mDevicesLock) {
            for (DeviceInfo di : mConnectedDevices.values()) {
                boolean isHdmiDevice = Arrays.stream(hdmiDevices).anyMatch(device ->
                    device == di.mDeviceType);
                if (isHdmiDevice) {
                    MediaMetrics.Item mmi = new MediaMetrics.Item(mMetricsId + "onToggleHdmi")
                            .set(MediaMetrics.Property.DEVICE,
                        AudioSystem.getDeviceName(AudioSystem.DEVICE_OUT_HDMI));
        synchronized (mDevicesLock) {
            // Is HDMI connected?
            final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_HDMI, "");
            final DeviceInfo di = mConnectedDevices.get(key);
            if (di == null) {
                Log.e(TAG, "invalid null DeviceInfo in onToggleHdmi");
                mmi.set(MediaMetrics.Property.EARLY_RETURN, "invalid null DeviceInfo").record();
                return;
            }
                                    AudioSystem.getDeviceName(di.mDeviceType));
                    AudioDeviceAttributes ada = new AudioDeviceAttributes(
                            AudioDeviceAttributes.ROLE_OUTPUT,
                            AudioDeviceInfo.convertInternalDeviceToDeviceType(di.mDeviceType),
                            di.mDeviceAddress, di.mDeviceName, di.mAudioProfiles,
                            di.mAudioDescriptors);
                    // Toggle HDMI to retrigger broadcast with proper formats.
            setWiredDeviceConnectionState(
                    new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_HDMI, ""),
                    AudioSystem.DEVICE_STATE_UNAVAILABLE, "android"); // disconnect
            setWiredDeviceConnectionState(
                    new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_HDMI, ""),
                    AudioSystem.DEVICE_STATE_AVAILABLE, "android"); // reconnect
        }
                    setWiredDeviceConnectionState(ada,
                            AudioSystem.DEVICE_STATE_UNAVAILABLE, "onToggleHdmi"); // disconnect
                    setWiredDeviceConnectionState(ada,
                            AudioSystem.DEVICE_STATE_AVAILABLE, "onToggleHdmi"); // reconnect
                    mmi.record();
                }
            }
        }
    }

    @GuardedBy("mDevicesLock")
    private void saveSetPreferredDevices(int strategy,
@@ -1818,7 +1844,15 @@ public class AudioDeviceInventory {
                            .printSlog(EventLogger.Event.ALOGE, TAG));
                    return false;
                }

                if (device == AudioSystem.DEVICE_OUT_HDMI ||
                    device == AudioSystem.DEVICE_OUT_HDMI_ARC ||
                    device == AudioSystem.DEVICE_OUT_HDMI_EARC) {
                    mConnectedDevices.put(deviceKey, new DeviceInfo(device, deviceName,
                        address, attributes.getAudioProfiles(), attributes.getAudioDescriptors()));
                } else {
                    mConnectedDevices.put(deviceKey, new DeviceInfo(device, deviceName, address));
                }
                mDeviceBroker.postAccessoryPlugMediaUnmute(device);
                status = true;
            } else if (!connect && isConnected) {