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

Commit 09f0cc86 authored by Yan Han's avatar Yan Han
Browse files

On TV, use default SAD for ARC when none was given by the Amplifier.

Bug: 306316058
Test: Manual, using setup described in b/297946051
Change-Id: I8c2d323ef09d9772a6bff5b5d96c49e1047de170
parent 4e42ebe6
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ import android.hardware.usb.UsbManager;
import android.hidl.manager.V1_0.IServiceManager;
import android.media.AudioAttributes;
import android.media.AudioAttributes.AttributeSystemUsage;
import android.media.AudioDescriptor;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioDeviceVolumeManager;
@@ -104,6 +105,7 @@ import android.media.AudioManager.AudioDeviceCategory;
import android.media.AudioManagerInternal;
import android.media.AudioMixerAttributes;
import android.media.AudioPlaybackConfiguration;
import android.media.AudioProfile;
import android.media.AudioRecordingConfiguration;
import android.media.AudioRoutesInfo;
import android.media.AudioSystem;
@@ -230,6 +232,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -7600,6 +7603,13 @@ public class AudioService extends IAudioService.Stub
    @Retention(RetentionPolicy.SOURCE)
    public @interface ConnectionState {}
    /**
     * Default SAD for a TV using ARC, used when the Amplifier didn't report any SADs.
     * Represents 2-channel LPCM including all defined sample rates and bit depths.
     * For the format definition, see Table 34 in the CEA standard CEA-861-D.
     */
    private static final byte[] DEFAULT_ARC_AUDIO_DESCRIPTOR = new byte[]{0x09, 0x7f, 0x07};
    @android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    /**
     * see AudioManager.setWiredDeviceConnectionState()
@@ -7611,6 +7621,27 @@ public class AudioService extends IAudioService.Stub
        attributes = retrieveBluetoothAddress(attributes);
        // When using ARC, a TV should use default 2 channel LPCM if the Amplifier didn't
        // report any SADs. See section 13.15.3 of the HDMI-CEC spec version 1.4b.
        if (attributes.getType() == AudioDeviceInfo.TYPE_HDMI_ARC
                && attributes.getRole() == AudioDeviceAttributes.ROLE_OUTPUT
                && attributes.getAudioDescriptors().isEmpty()) {
            attributes = new AudioDeviceAttributes(
                    attributes.getRole(),
                    attributes.getType(),
                    attributes.getAddress(),
                    attributes.getName(),
                    attributes.getAudioProfiles(),
                    new ArrayList<AudioDescriptor>(Collections.singletonList(
                            new AudioDescriptor(
                                    AudioDescriptor.STANDARD_EDID,
                                    AudioProfile.AUDIO_ENCAPSULATION_TYPE_NONE,
                                    DEFAULT_ARC_AUDIO_DESCRIPTOR
                            )
                    ))
            );
        }
        if (state != CONNECTION_STATE_CONNECTED
                && state != CONNECTION_STATE_DISCONNECTED) {
            throw new IllegalArgumentException("Invalid state " + state);