diff --git a/api/current.txt b/api/current.txt index eb8ef8fa01906..7dea56eb73dd0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23828,6 +23828,8 @@ package android.media { method @NonNull public int[] getChannelCounts(); method @NonNull public int[] getChannelIndexMasks(); method @NonNull public int[] getChannelMasks(); + method @NonNull public int[] getEncapsulationMetadataTypes(); + method @NonNull public int[] getEncapsulationModes(); method @NonNull public int[] getEncodings(); method public int getId(); method public CharSequence getProductName(); @@ -24448,6 +24450,8 @@ package android.media { field public static final int DUAL_MONO_MODE_LR = 1; // 0x1 field public static final int DUAL_MONO_MODE_OFF = 0; // 0x0 field public static final int DUAL_MONO_MODE_RR = 3; // 0x3 + field public static final int ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR = 2; // 0x2 + field public static final int ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER = 1; // 0x1 field public static final int ENCAPSULATION_MODE_ELEMENTARY_STREAM = 1; // 0x1 field public static final int ENCAPSULATION_MODE_HANDLE = 2; // 0x2 field public static final int ENCAPSULATION_MODE_NONE = 0; // 0x0 diff --git a/api/system-current.txt b/api/system-current.txt index f032a7100fe22..53b71a7b5d91b 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4184,9 +4184,11 @@ package android.media { method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes); method public void clearAudioServerStateCallback(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); + method @IntRange(from=0) public int getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List getAudioProductStrategies(); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List getAudioVolumeGroups(); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List getDevicesForAttributes(@NonNull android.media.AudioAttributes); + method @IntRange(from=0) public int getMaxAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo); method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes); method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAddress getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy); @@ -4200,6 +4202,7 @@ package android.media { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException; method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException; method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int requestAudioFocus(@NonNull android.media.AudioFocusRequest, @Nullable android.media.audiopolicy.AudioPolicy); + method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) int); method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAddress); diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index cb132f5b11012..6e63d1704fcbb 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -422,6 +422,40 @@ public final class AudioDeviceInfo { return AudioFormat.filterPublicFormats(mPort.formats()); } + /** + * Returns an array of supported encapsulation modes for the device. + * + * The array can include any of + * {@link AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM}, + * {@link AudioTrack#ENCAPSULATION_MODE_HANDLE}. + * + * @return An array of supported encapsulation modes for the device. This + * may be an empty array if no encapsulation modes are supported. + */ + public @NonNull int[] getEncapsulationModes() { + // Implement a getter in r-dev or r-tv-dev as needed. + return new int[0]; // be careful of returning a copy of any internal data. + } + + /** + * Returns an array of supported encapsulation metadata types for the device. + * + * The metadata type returned should be allowed for all encapsulation modes supported + * by the device. Some metadata types may apply only to certain + * compressed stream formats, the returned list is the union of subsets. + * + * The array can include any of + * {@link AudioTrack#ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER}, + * {@link AudioTrack#ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR}. + * + * @return An array of supported encapsulation metadata types for the device. This + * may be an empty array if no metadata types are supported. + */ + public @NonNull int[] getEncapsulationMetadataTypes() { + // Implement a getter in r-dev or r-tv-dev as needed. + return new int[0]; // be careful of returning a copy of any internal data. + } + /** * @return The device type identifier of the audio device (i.e. TYPE_BUILTIN_SPEAKER). */ diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 8ad5c04a1f852..861b76d2b1531 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -4566,6 +4566,70 @@ public class AudioManager { } } + /** + * @hide + * Sets an additional audio output device delay in milliseconds. + * + * The additional output delay is a request to the output device to + * delay audio presentation (generally with respect to video presentation for better + * synchronization). + * It may not be supported by all output devices, + * and typically increases the audio latency by the amount of additional + * audio delay requested. + * + * If additional audio delay is supported by an audio output device, + * it is expected to be supported for all output streams (and configurations) + * opened on that device. + * + * @param device an instance of {@link AudioDeviceInfo} returned from {@link getDevices()}. + * @param delayMs delay in milliseconds desired. This should be in range of {@code 0} + * to the value returned by {@link #getMaxAdditionalOutputDeviceDelay()}. + * @return true if successful, false if the device does not support output device delay + * or the delay is not in range of {@link #getMaxAdditionalOutputDeviceDelay()}. + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public boolean setAdditionalOutputDeviceDelay( + @NonNull AudioDeviceInfo device, @IntRange(from = 0) int delayMs) { + Objects.requireNonNull(device); + // Implement the setter in r-dev or r-tv-dev as needed. + return false; + } + + /** + * @hide + * Returns the current additional audio output device delay in milliseconds. + * + * @param device an instance of {@link AudioDeviceInfo} returned from {@link getDevices()}. + * @return the additional output device delay. This is a non-negative number. + * {@code 0} is returned if unsupported. + */ + @SystemApi + @IntRange(from = 0) + public int getAdditionalOutputDeviceDelay(@NonNull AudioDeviceInfo device) { + Objects.requireNonNull(device); + // Implement the getter in r-dev or r-tv-dev as needed. + return 0; + } + + /** + * @hide + * Returns the maximum additional audio output device delay in milliseconds. + * + * @param device an instance of {@link AudioDeviceInfo} returned from {@link getDevices()}. + * @return the maximum output device delay in milliseconds that can be set. + * This is a non-negative number + * representing the additional audio delay supported for the device. + * {@code 0} is returned if unsupported. + */ + @SystemApi + @IntRange(from = 0) + public int getMaxAdditionalOutputDeviceDelay(@NonNull AudioDeviceInfo device) { + Objects.requireNonNull(device); + // Implement the getter in r-dev or r-tv-dev as needed. + return 0; + } + /** * Returns the estimated latency for the given stream type in milliseconds. * diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 1f6159104d589..81275f6891ab0 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -256,6 +256,38 @@ public class AudioTrack extends PlayerBase */ public static final int ENCAPSULATION_MODE_HANDLE = 2; + /* Enumeration of metadata types permitted for use by + * encapsulation mode audio streams. + */ + /** @hide */ + @IntDef(prefix = { "ENCAPSULATION_METADATA_TYPE_" }, value = { + ENCAPSULATION_METADATA_TYPE_NONE, /* reserved */ + ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER, + ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface EncapsulationMetadataType {} + + /** + * Reserved do not use. + * @hide + */ + public static final int ENCAPSULATION_METADATA_TYPE_NONE = 0; // reserved + + /** + * Encapsulation metadata type for framework tuner information. + * + * TODO(b/147778408) Link: Fill in Tuner API info. + */ + public static final int ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER = 1; + + /** + * Encapsulation metadata type for DVB AD descriptor. + * + * This metadata is formatted per ETSI TS 101 154 Table E.1: AD_descriptor. + */ + public static final int ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR = 2; + /* Dual Mono handling is used when a stereo audio stream * contains separate audio content on the left and right channels. * Such information about the content of the stream may be found, for example, in