Add TV audio device management APIs.

Updates to AudioManager, AudioDeviceInfo, AudioTrack.

Test: make, boot sanity (functionality stubbed, no effect)
Bug: 133526565
Change-Id: Iba99871a5050a90887c4dd101ae227b1663fe149
This commit is contained in:
Andy Hung
2020-01-17 14:05:06 -08:00
parent 633c78b622
commit 97aa07f8fc
5 changed files with 137 additions and 0 deletions

View File

@@ -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

View File

@@ -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<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAddress> 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);

View File

@@ -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).
*/

View File

@@ -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.
*

View File

@@ -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