summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt1
-rw-r--r--core/api/test-current.txt5
-rw-r--r--media/java/android/media/AudioDeviceInfo.java39
-rw-r--r--media/java/android/media/AudioManager.java11
-rw-r--r--media/java/android/media/AudioSystem.java13
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceInventory.java5
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
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;