diff options
| -rw-r--r-- | core/api/current.txt | 1 | ||||
| -rw-r--r-- | core/api/test-current.txt | 5 | ||||
| -rw-r--r-- | media/java/android/media/AudioDeviceInfo.java | 39 | ||||
| -rw-r--r-- | media/java/android/media/AudioManager.java | 11 | ||||
| -rw-r--r-- | media/java/android/media/AudioSystem.java | 13 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioDeviceInventory.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 4 |
7 files changed, 75 insertions, 3 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 88080f0e2518..2abb1129738c 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -20234,6 +20234,7 @@ package android.media { field public static final int TYPE_FM_TUNER = 16; // 0x10 field public static final int TYPE_HDMI = 9; // 0x9 field public static final int TYPE_HDMI_ARC = 10; // 0xa + field public static final int TYPE_HDMI_EARC = 29; // 0x1d field public static final int TYPE_HEARING_AID = 23; // 0x17 field public static final int TYPE_IP = 20; // 0x14 field public static final int TYPE_LINE_ANALOG = 5; // 0x5 diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 906524e387f7..b089e9cbae2c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1374,6 +1374,11 @@ package android.media { method public static int xsdStringToUsage(@NonNull String); } + public final class AudioDeviceInfo { + method public static void enforceValidAudioDeviceTypeIn(int); + method public static void enforceValidAudioDeviceTypeOut(int); + } + public final class AudioFocusRequest { method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener(); } diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index 9300f13e03cb..09b382ee46d0 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -20,6 +20,7 @@ import android.Manifest; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; +import android.annotation.TestApi; import android.util.SparseIntArray; import java.lang.annotation.Retention; @@ -172,6 +173,11 @@ public final class AudioDeviceInfo { @RequiresPermission(Manifest.permission.CAPTURE_AUDIO_OUTPUT) public static final int TYPE_ECHO_REFERENCE = 28; + /** + * A device type describing the Enhanced Audio Return Channel of an HDMI connection. + */ + public static final int TYPE_HDMI_EARC = 29; + /** @hide */ @IntDef(flag = false, prefix = "TYPE", value = { TYPE_BUILTIN_EARPIECE, @@ -188,6 +194,7 @@ public final class AudioDeviceInfo { TYPE_TELEPHONY, TYPE_LINE_ANALOG, TYPE_HDMI_ARC, + TYPE_HDMI_EARC, TYPE_LINE_DIGITAL, TYPE_FM, TYPE_AUX_LINE, @@ -197,6 +204,8 @@ public final class AudioDeviceInfo { TYPE_BUILTIN_MIC, TYPE_FM_TUNER, TYPE_TV_TUNER, + TYPE_BUILTIN_SPEAKER_SAFE, + TYPE_REMOTE_SUBMIX, TYPE_BLE_HEADSET, TYPE_BLE_SPEAKER, TYPE_ECHO_REFERENCE} @@ -222,7 +231,10 @@ public final class AudioDeviceInfo { TYPE_LINE_DIGITAL, TYPE_IP, TYPE_BUS, + TYPE_REMOTE_SUBMIX, TYPE_BLE_HEADSET, + TYPE_HDMI_ARC, + TYPE_HDMI_EARC, TYPE_ECHO_REFERENCE} ) @Retention(RetentionPolicy.SOURCE) @@ -244,12 +256,14 @@ public final class AudioDeviceInfo { TYPE_TELEPHONY, TYPE_LINE_ANALOG, TYPE_HDMI_ARC, + TYPE_HDMI_EARC, TYPE_LINE_DIGITAL, TYPE_FM, TYPE_AUX_LINE, TYPE_IP, TYPE_BUS, TYPE_HEARING_AID, + TYPE_BUILTIN_SPEAKER_SAFE, TYPE_BLE_HEADSET, TYPE_BLE_SPEAKER} ) @@ -273,6 +287,7 @@ public final class AudioDeviceInfo { case TYPE_TELEPHONY: case TYPE_LINE_ANALOG: case TYPE_HDMI_ARC: + case TYPE_HDMI_EARC: case TYPE_LINE_DIGITAL: case TYPE_FM: case TYPE_AUX_LINE: @@ -309,6 +324,8 @@ public final class AudioDeviceInfo { case TYPE_BUS: case TYPE_REMOTE_SUBMIX: case TYPE_BLE_HEADSET: + case TYPE_HDMI_ARC: + case TYPE_HDMI_EARC: case TYPE_ECHO_REFERENCE: return true; default: @@ -318,9 +335,15 @@ public final class AudioDeviceInfo { /** * @hide - * Throws IAE on an invalid output device type + * Enforces whether the audio device type is acceptable for output. + * + * A vendor implemented output type should modify isValidAudioDeviceTypeOut() + * appropriately to accept the new type. Do not remove already acceptable types. + * + * @throws IllegalArgumentException on an invalid output device type. * @param type */ + @TestApi public static void enforceValidAudioDeviceTypeOut(int type) { if (!isValidAudioDeviceTypeOut(type)) { throw new IllegalArgumentException("Illegal output device type " + type); @@ -329,9 +352,15 @@ public final class AudioDeviceInfo { /** * @hide - * Throws IAE on an invalid input device type + * Enforces whether the audio device type is acceptable for input. + * + * A vendor implemented input type should modify isValidAudioDeviceTypeIn() + * appropriately to accept the new type. Do not remove already acceptable types. + * + * @throws IllegalArgumentException on an invalid input device type. * @param type */ + @TestApi public static void enforceValidAudioDeviceTypeIn(int type) { if (!isValidAudioDeviceTypeIn(type)) { throw new IllegalArgumentException("Illegal input device type " + type); @@ -609,6 +638,7 @@ public final class AudioDeviceInfo { INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_TELEPHONY_TX, TYPE_TELEPHONY); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_LINE, TYPE_LINE_ANALOG); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI_ARC, TYPE_HDMI_ARC); + INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI_EARC, TYPE_HDMI_EARC); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_SPDIF, TYPE_LINE_DIGITAL); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_FM, TYPE_FM); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_AUX_LINE, TYPE_AUX_LINE); @@ -641,6 +671,8 @@ public final class AudioDeviceInfo { INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BUS, TYPE_BUS); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_REMOTE_SUBMIX, TYPE_REMOTE_SUBMIX); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BLE_HEADSET, TYPE_BLE_HEADSET); + INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_HDMI_ARC, TYPE_HDMI_ARC); + INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_HDMI_EARC, TYPE_HDMI_EARC); INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_ECHO_REFERENCE, TYPE_ECHO_REFERENCE); @@ -656,6 +688,7 @@ public final class AudioDeviceInfo { EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLUETOOTH_A2DP, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI, AudioSystem.DEVICE_OUT_HDMI); EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI_ARC, AudioSystem.DEVICE_OUT_HDMI_ARC); + EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI_EARC, AudioSystem.DEVICE_OUT_HDMI_EARC); EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_DEVICE, AudioSystem.DEVICE_OUT_USB_DEVICE); EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_HEADSET, AudioSystem.DEVICE_OUT_USB_HEADSET); EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_ACCESSORY, AudioSystem.DEVICE_OUT_USB_ACCESSORY); @@ -700,6 +733,8 @@ public final class AudioDeviceInfo { EXT_TO_INT_INPUT_DEVICE_MAPPING.put( TYPE_REMOTE_SUBMIX, AudioSystem.DEVICE_IN_REMOTE_SUBMIX); EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_BLE_HEADSET, AudioSystem.DEVICE_IN_BLE_HEADSET); + EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_HDMI_ARC, AudioSystem.DEVICE_IN_HDMI_ARC); + EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_HDMI_EARC, AudioSystem.DEVICE_IN_HDMI_EARC); EXT_TO_INT_INPUT_DEVICE_MAPPING.put( TYPE_ECHO_REFERENCE, AudioSystem.DEVICE_IN_ECHO_REFERENCE); diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index a717a90c1c37..d747da5e5a0c 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -5183,6 +5183,10 @@ public class AudioManager { */ public static final int DEVICE_OUT_HDMI_ARC = AudioSystem.DEVICE_OUT_HDMI_ARC; /** @hide + * The audio output device code for HDMI enhanced Audio Return Channel. + */ + public static final int DEVICE_OUT_HDMI_EARC = AudioSystem.DEVICE_OUT_HDMI_EARC; + /** @hide * The audio output device code for S/PDIF digital connection. */ public static final int DEVICE_OUT_SPDIF = AudioSystem.DEVICE_OUT_SPDIF; @@ -5235,6 +5239,12 @@ public class AudioManager { AudioSystem.DEVICE_IN_HDMI_ARC; /** @hide + * The audio input device code for HDMI EARC + */ + public static final int DEVICE_IN_HDMI_EARC = + AudioSystem.DEVICE_IN_HDMI_EARC; + + /** @hide * The audio input device code for telephony voice RX path */ public static final int DEVICE_IN_TELEPHONY_RX = @@ -5348,6 +5358,7 @@ public class AudioManager { * {@link #DEVICE_OUT_TELEPHONY_TX}. * {@link #DEVICE_OUT_LINE}. * {@link #DEVICE_OUT_HDMI_ARC}. + * {@link #DEVICE_OUT_HDMI_EARC}. * {@link #DEVICE_OUT_SPDIF}. * {@link #DEVICE_OUT_FM}. * {@link #DEVICE_OUT_DEFAULT} is not used here. diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 5f60fb63a334..363da248eb96 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -890,6 +890,8 @@ public class AudioSystem /** @hide */ public static final int DEVICE_OUT_HDMI_ARC = 0x40000; /** @hide */ + public static final int DEVICE_OUT_HDMI_EARC = 0x40001; + /** @hide */ public static final int DEVICE_OUT_SPDIF = 0x80000; /** @hide */ @UnsupportedAppUsage @@ -961,6 +963,7 @@ public class AudioSystem DEVICE_OUT_ALL_SET.add(DEVICE_OUT_TELEPHONY_TX); DEVICE_OUT_ALL_SET.add(DEVICE_OUT_LINE); DEVICE_OUT_ALL_SET.add(DEVICE_OUT_HDMI_ARC); + DEVICE_OUT_ALL_SET.add(DEVICE_OUT_HDMI_EARC); DEVICE_OUT_ALL_SET.add(DEVICE_OUT_SPDIF); DEVICE_OUT_ALL_SET.add(DEVICE_OUT_FM); DEVICE_OUT_ALL_SET.add(DEVICE_OUT_AUX_LINE); @@ -993,6 +996,7 @@ public class AudioSystem DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET = new HashSet<>(); DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_AUX_LINE); DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_HDMI_ARC); + DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_HDMI_EARC); DEVICE_OUT_ALL_HDMI_SYSTEM_AUDIO_SET.add(DEVICE_OUT_SPDIF); DEVICE_ALL_HDMI_SYSTEM_AUDIO_AND_SPEAKER_SET = new HashSet<>(); @@ -1074,6 +1078,8 @@ public class AudioSystem /** @hide */ public static final int DEVICE_IN_HDMI_ARC = DEVICE_BIT_IN | 0x8000000; /** @hide */ + public static final int DEVICE_IN_HDMI_EARC = DEVICE_BIT_IN | 0x8000001; + /** @hide */ public static final int DEVICE_IN_ECHO_REFERENCE = DEVICE_BIT_IN | 0x10000000; /** @hide */ public static final int DEVICE_IN_BLE_HEADSET = DEVICE_BIT_IN | 0x20000000; @@ -1114,6 +1120,7 @@ public class AudioSystem DEVICE_IN_ALL_SET.add(DEVICE_IN_USB_HEADSET); DEVICE_IN_ALL_SET.add(DEVICE_IN_BLUETOOTH_BLE); DEVICE_IN_ALL_SET.add(DEVICE_IN_HDMI_ARC); + DEVICE_IN_ALL_SET.add(DEVICE_IN_HDMI_EARC); DEVICE_IN_ALL_SET.add(DEVICE_IN_ECHO_REFERENCE); DEVICE_IN_ALL_SET.add(DEVICE_IN_BLE_HEADSET); DEVICE_IN_ALL_SET.add(DEVICE_IN_DEFAULT); @@ -1169,6 +1176,7 @@ public class AudioSystem /** @hide */ public static final String DEVICE_OUT_TELEPHONY_TX_NAME = "telephony_tx"; /** @hide */ public static final String DEVICE_OUT_LINE_NAME = "line"; /** @hide */ public static final String DEVICE_OUT_HDMI_ARC_NAME = "hmdi_arc"; + /** @hide */ public static final String DEVICE_OUT_HDMI_EARC_NAME = "hmdi_earc"; /** @hide */ public static final String DEVICE_OUT_SPDIF_NAME = "spdif"; /** @hide */ public static final String DEVICE_OUT_FM_NAME = "fm_transmitter"; /** @hide */ public static final String DEVICE_OUT_AUX_LINE_NAME = "aux_line"; @@ -1208,6 +1216,7 @@ public class AudioSystem /** @hide */ public static final String DEVICE_IN_BLUETOOTH_BLE_NAME = "bt_ble"; /** @hide */ public static final String DEVICE_IN_ECHO_REFERENCE_NAME = "echo_reference"; /** @hide */ public static final String DEVICE_IN_HDMI_ARC_NAME = "hdmi_arc"; + /** @hide */ public static final String DEVICE_IN_HDMI_EARC_NAME = "hdmi_earc"; /** @hide */ public static final String DEVICE_IN_BLE_HEADSET_NAME = "ble_headset"; /** @hide */ @@ -1253,6 +1262,8 @@ public class AudioSystem return DEVICE_OUT_LINE_NAME; case DEVICE_OUT_HDMI_ARC: return DEVICE_OUT_HDMI_ARC_NAME; + case DEVICE_OUT_HDMI_EARC: + return DEVICE_OUT_HDMI_EARC_NAME; case DEVICE_OUT_SPDIF: return DEVICE_OUT_SPDIF_NAME; case DEVICE_OUT_FM: @@ -1339,6 +1350,8 @@ public class AudioSystem return DEVICE_IN_ECHO_REFERENCE_NAME; case DEVICE_IN_HDMI_ARC: return DEVICE_IN_HDMI_ARC_NAME; + case DEVICE_IN_HDMI_EARC: + return DEVICE_IN_HDMI_EARC_NAME; case DEVICE_IN_BLE_HEADSET: return DEVICE_IN_BLE_HEADSET_NAME; case DEVICE_IN_DEFAULT: diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 9b88c9a7b1fb..18d04e94b36f 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -1257,6 +1257,7 @@ public class AudioDeviceInventory { break; case AudioSystem.DEVICE_OUT_HDMI: case AudioSystem.DEVICE_OUT_HDMI_ARC: + case AudioSystem.DEVICE_OUT_HDMI_EARC: configureHdmiPlugIntent(intent, state); break; } @@ -1292,6 +1293,7 @@ public class AudioDeviceInventory { break; case AudioSystem.DEVICE_OUT_HDMI: case AudioSystem.DEVICE_OUT_HDMI_ARC: + case AudioSystem.DEVICE_OUT_HDMI_EARC: connType = AudioRoutesInfo.MAIN_HDMI; break; case AudioSystem.DEVICE_OUT_USB_DEVICE: @@ -1336,7 +1338,8 @@ public class AudioDeviceInventory { } final AudioDevicePort devicePort = (AudioDevicePort) port; if (devicePort.type() != AudioManager.DEVICE_OUT_HDMI - && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_ARC) { + && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_ARC + && devicePort.type() != AudioManager.DEVICE_OUT_HDMI_EARC) { continue; } // found an HDMI port: format the list of supported encodings diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2de2fdf1f188..98095ee30759 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -562,6 +562,7 @@ public class AudioService extends IAudioService.Stub AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET, AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET, AudioSystem.DEVICE_OUT_HDMI_ARC, + AudioSystem.DEVICE_OUT_HDMI_EARC, AudioSystem.DEVICE_OUT_AUX_LINE)); // Devices for which the volume is always max, no volume panel Set<Integer> mFullVolumeDevices = new HashSet<>(); @@ -5841,6 +5842,9 @@ public class AudioService extends IAudioService.Stub if ((device & AudioSystem.DEVICE_OUT_SPEAKER) != 0) { device = AudioSystem.DEVICE_OUT_SPEAKER; } else if ((device & AudioSystem.DEVICE_OUT_HDMI_ARC) != 0) { + // FIXME(b/184944421): DEVICE_OUT_HDMI_EARC has two bits set, + // so it must be handled correctly as it aliases + // with DEVICE_OUT_HDMI_ARC | DEVICE_OUT_EARPIECE. device = AudioSystem.DEVICE_OUT_HDMI_ARC; } else if ((device & AudioSystem.DEVICE_OUT_SPDIF) != 0) { device = AudioSystem.DEVICE_OUT_SPDIF; |