diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h index 32b5b027f4233..5144457374251 100644 --- a/core/jni/android_media_AudioFormat.h +++ b/core/jni/android_media_AudioFormat.h @@ -27,6 +27,10 @@ #define ENCODING_E_AC3 6 #define ENCODING_DTS 7 #define ENCODING_DTS_HD 8 +#define ENCODING_MP3 9 +#define ENCODING_AAC_LC 10 +#define ENCODING_AAC_HE_V1 11 +#define ENCODING_AAC_HE_V2 12 #define ENCODING_INVALID 0 #define ENCODING_DEFAULT 1 @@ -52,6 +56,14 @@ static inline audio_format_t audioFormatToNative(int audioFormat) return AUDIO_FORMAT_DTS; case ENCODING_DTS_HD: return AUDIO_FORMAT_DTS_HD; + case ENCODING_MP3: + return AUDIO_FORMAT_MP3; + case ENCODING_AAC_LC: + return AUDIO_FORMAT_AAC_LC; + case ENCODING_AAC_HE_V1: + return AUDIO_FORMAT_AAC_HE_V1; + case ENCODING_AAC_HE_V2: + return AUDIO_FORMAT_AAC_HE_V2; case ENCODING_DEFAULT: return AUDIO_FORMAT_DEFAULT; default: @@ -76,6 +88,14 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat) return ENCODING_DTS; case AUDIO_FORMAT_DTS_HD: return ENCODING_DTS_HD; + case AUDIO_FORMAT_MP3: + return ENCODING_MP3; + case AUDIO_FORMAT_AAC_LC: + return ENCODING_AAC_LC; + case AUDIO_FORMAT_AAC_HE_V1: + return ENCODING_AAC_HE_V1; + case AUDIO_FORMAT_AAC_HE_V2: + return ENCODING_AAC_HE_V2; case AUDIO_FORMAT_DEFAULT: return ENCODING_DEFAULT; default: diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index 2099bd0375483..431d37efbb9c1 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -204,7 +204,7 @@ public final class AudioDeviceInfo { * @see AudioFormat */ public @NonNull int[] getEncodings() { - return mPort.formats(); + return AudioFormat.filterPublicFormats(mPort.formats()); } /** diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index a7e092fc04d46..c35f10f39c242 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; /** * The AudioFormat class is used to access a number of audio format and @@ -53,6 +54,22 @@ public class AudioFormat { public static final int ENCODING_DTS = 7; /** Audio data format: DTS HD compressed */ public static final int ENCODING_DTS_HD = 8; + /** Audio data format: MP3 compressed + * @hide + * */ + public static final int ENCODING_MP3 = 9; + /** Audio data format: AAC LC compressed + * @hide + * */ + public static final int ENCODING_AAC_LC = 10; + /** Audio data format: AAC HE V1 compressed + * @hide + * */ + public static final int ENCODING_AAC_HE_V1 = 11; + /** Audio data format: AAC HE V2 compressed + * @hide + * */ + public static final int ENCODING_AAC_HE_V2 = 12; /** Invalid audio channel configuration */ /** @deprecated Use {@link #CHANNEL_INVALID} instead. */ @@ -232,6 +249,27 @@ public class AudioFormat { /** @hide */ public static boolean isValidEncoding(int audioFormat) + { + switch (audioFormat) { + case ENCODING_PCM_8BIT: + case ENCODING_PCM_16BIT: + case ENCODING_PCM_FLOAT: + case ENCODING_AC3: + case ENCODING_E_AC3: + case ENCODING_DTS: + case ENCODING_DTS_HD: + case ENCODING_MP3: + case ENCODING_AAC_LC: + case ENCODING_AAC_HE_V1: + case ENCODING_AAC_HE_V2: + return true; + default: + return false; + } + } + + /** @hide */ + public static boolean isPublicEncoding(int audioFormat) { switch (audioFormat) { case ENCODING_PCM_8BIT: @@ -260,6 +298,10 @@ public class AudioFormat { case ENCODING_E_AC3: case ENCODING_DTS: case ENCODING_DTS_HD: + case ENCODING_MP3: + case ENCODING_AAC_LC: + case ENCODING_AAC_HE_V1: + case ENCODING_AAC_HE_V2: return false; case ENCODING_INVALID: default: @@ -267,6 +309,28 @@ public class AudioFormat { } } + /** + * Returns an array of public encoding values extracted from an array of + * encoding values. + * @hide + */ + public static int[] filterPublicFormats(int[] formats) { + if (formats == null) { + return null; + } + int[] myCopy = Arrays.copyOf(formats, formats.length); + int size = 0; + for (int i = 0; i < myCopy.length; i++) { + if (isPublicEncoding(myCopy[i])) { + if (size != i) { + myCopy[size] = myCopy[i]; + } + size++; + } + } + return Arrays.copyOf(myCopy, size); + } + /** @removed */ public AudioFormat() { diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 7697e27c3488f..6e71de6397b16 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -775,7 +775,7 @@ public class AudioTrack audioFormat = AudioFormat.ENCODING_PCM_16BIT; } - if (!AudioFormat.isValidEncoding(audioFormat)) { + if (!AudioFormat.isPublicEncoding(audioFormat)) { throw new IllegalArgumentException("Unsupported audio encoding."); } mAudioFormat = audioFormat; @@ -1119,7 +1119,7 @@ public class AudioTrack } } - if (!AudioFormat.isValidEncoding(audioFormat)) { + if (!AudioFormat.isPublicEncoding(audioFormat)) { loge("getMinBufferSize(): Invalid audio format."); return ERROR_BAD_VALUE; } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 9f35843ee0d35..352c499dba2c8 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4787,7 +4787,7 @@ public class AudioService extends IAudioService.Stub { if (devicePort.type() == AudioManager.DEVICE_OUT_HDMI || devicePort.type() == AudioManager.DEVICE_OUT_HDMI_ARC) { // format the list of supported encodings - int[] formats = devicePort.formats(); + int[] formats = AudioFormat.filterPublicFormats(devicePort.formats()); if (formats.length > 0) { ArrayList encodingList = new ArrayList(1); for (int format : formats) {