From 8008740a46ad65b3e3fc52bdc8841df3ca8512eb Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Thu, 15 Apr 2021 23:05:24 -0700 Subject: AudioFormat: Add channel mask constants for immersive 3D audio Bug: 185842397 Test: atest AudioFormatTest Test: atest AudioTrackTest Change-Id: I1c85e30c65cf6681928861e7d0cc9d987e4648ce --- media/java/android/media/AudioFormat.java | 35 +++++++++++++++++++ media/java/android/media/AudioTrack.java | 56 ++++++++++++++++++++++++------- 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 1d06e2837841..262e8c67cd7f 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -378,6 +378,18 @@ public final class AudioFormat implements Parcelable { public static final int CHANNEL_OUT_TOP_BACK_CENTER = 0x40000; /** @hide */ public static final int CHANNEL_OUT_TOP_BACK_RIGHT = 0x80000; + /** @hide */ + public static final int CHANNEL_OUT_TOP_SIDE_LEFT = 0x100000; + /** @hide */ + public static final int CHANNEL_OUT_TOP_SIDE_RIGHT = 0x200000; + /** @hide */ + public static final int CHANNEL_OUT_BOTTOM_FRONT_LEFT = 0x400000; + /** @hide */ + public static final int CHANNEL_OUT_BOTTOM_FRONT_CENTER = 0x800000; + /** @hide */ + public static final int CHANNEL_OUT_BOTTOM_FRONT_RIGHT = 0x1000000; + /** @hide */ + public static final int CHANNEL_OUT_LOW_FREQUENCY_2 = 0x2000000; public static final int CHANNEL_OUT_MONO = CHANNEL_OUT_FRONT_LEFT; public static final int CHANNEL_OUT_STEREO = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT); @@ -407,6 +419,29 @@ public final class AudioFormat implements Parcelable { CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT | CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT | CHANNEL_OUT_LOW_FREQUENCY); + /** @hide */ + public static final int CHANNEL_OUT_5POINT1POINT2 = (CHANNEL_OUT_5POINT1 | + CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT); + /** @hide */ + public static final int CHANNEL_OUT_5POINT1POINT4 = (CHANNEL_OUT_5POINT1 | + CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT | + CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT); + /** @hide */ + public static final int CHANNEL_OUT_7POINT1POINT2 = (CHANNEL_OUT_7POINT1_SURROUND | + CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT); + /** @hide */ + public static final int CHANNEL_OUT_7POINT1POINT4 = (CHANNEL_OUT_7POINT1_SURROUND | + CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT | + CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT); + /** @hide */ + public static final int CHANNEL_OUT_22POINT2 = (CHANNEL_OUT_7POINT1POINT4 | + CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | + CHANNEL_OUT_BACK_CENTER | CHANNEL_OUT_TOP_CENTER | + CHANNEL_OUT_TOP_FRONT_CENTER | CHANNEL_OUT_TOP_BACK_CENTER | + CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT | + CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_RIGHT | + CHANNEL_OUT_BOTTOM_FRONT_CENTER | + CHANNEL_OUT_LOW_FREQUENCY_2); // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL /** Minimum value for sample rate, diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index b265ebfc02a0..67880a589b43 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -44,6 +44,7 @@ import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.NioUtils; +import java.util.HashMap; import java.util.LinkedList; import java.util.concurrent.Executor; @@ -1585,9 +1586,24 @@ public class AudioTrack extends PlayerBase AudioFormat.CHANNEL_OUT_LOW_FREQUENCY | AudioFormat.CHANNEL_OUT_BACK_LEFT | AudioFormat.CHANNEL_OUT_BACK_RIGHT | + AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER | + AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | AudioFormat.CHANNEL_OUT_BACK_CENTER | AudioFormat.CHANNEL_OUT_SIDE_LEFT | - AudioFormat.CHANNEL_OUT_SIDE_RIGHT; + AudioFormat.CHANNEL_OUT_SIDE_RIGHT | + AudioFormat.CHANNEL_OUT_TOP_CENTER | + AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT | + AudioFormat.CHANNEL_OUT_TOP_FRONT_CENTER | + AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT | + AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT | + AudioFormat.CHANNEL_OUT_TOP_BACK_CENTER | + AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT | + AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT | + AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT | + AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT | + AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_CENTER | + AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT | + AudioFormat.CHANNEL_OUT_LOW_FREQUENCY_2; // Returns a boolean whether the attributes, format, bufferSizeInBytes, mode allow // power saving to be automatically enabled for an AudioTrack. Returns false if @@ -1740,6 +1756,26 @@ public class AudioTrack extends PlayerBase mDataLoadMode = mode; } + // General pair map + private static final HashMap CHANNEL_PAIR_MAP = new HashMap<>() {{ + put("front", AudioFormat.CHANNEL_OUT_FRONT_LEFT + | AudioFormat.CHANNEL_OUT_FRONT_RIGHT); + put("back", AudioFormat.CHANNEL_OUT_BACK_LEFT + | AudioFormat.CHANNEL_OUT_BACK_RIGHT); + put("front of center", AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER + | AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER); + put("side", AudioFormat.CHANNEL_OUT_SIDE_LEFT + | AudioFormat.CHANNEL_OUT_SIDE_RIGHT); + put("top front", AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT + | AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT); + put("top back", AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT + | AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT); + put("top side", AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT + | AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT); + put("bottom front", AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT + | AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT); + }}; + /** * Convenience method to check that the channel configuration (a.k.a channel mask) is supported * @param channelConfig the mask to validate @@ -1766,21 +1802,15 @@ public class AudioTrack extends PlayerBase loge("Front channels must be present in multichannel configurations"); return false; } - final int backPair = - AudioFormat.CHANNEL_OUT_BACK_LEFT | AudioFormat.CHANNEL_OUT_BACK_RIGHT; - if ((channelConfig & backPair) != 0) { - if ((channelConfig & backPair) != backPair) { - loge("Rear channels can't be used independently"); + // Check all pairs to see that they are matched (front duplicated here). + for (HashMap.Entry e : CHANNEL_PAIR_MAP.entrySet()) { + final int positionPair = e.getValue(); + if ((channelConfig & positionPair) != 0 + && (channelConfig & positionPair) != positionPair) { + loge("Channel pair (" + e.getKey() + ") cannot be used independently"); return false; } } - final int sidePair = - AudioFormat.CHANNEL_OUT_SIDE_LEFT | AudioFormat.CHANNEL_OUT_SIDE_RIGHT; - if ((channelConfig & sidePair) != 0 - && (channelConfig & sidePair) != sidePair) { - loge("Side channels can't be used independently"); - return false; - } return true; } -- cgit v1.2.3-59-g8ed1b From 209bf897de147250fa3d77a8d90adb68c9f341c2 Mon Sep 17 00:00:00 2001 From: Kei Murayama Date: Mon, 15 Jun 2020 20:11:02 +0900 Subject: AudioFormat: Support 13ch audio layout for 360 Reality Audio - Add definitions for the front bottom channels. The name of the definitions are standardized in ITU-R BS.2051-1. - Add definition for 13ch mask which consists of surround 5 channels, top 5 channels and bottom 3ch channels. This channel mask is ideal speaker layout used by Sony 360 Reality Audio. Virtualizer can place individual sounds in a 360 spherical sound field from these channels on any headphones. Ignoring checkstyle warning, "'|' should be on a new line", to keep existing codestyle. Bug: 185100731 Test: atest AudioFormatTest Test: Play wav with 13ch mask after OUT_CHANNEL_COUNT_MAX to 24 Change-Id: I2b4deaac740a08ae3b1b8d8453650a876e2d6206 --- media/java/android/media/AudioFormat.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 262e8c67cd7f..090812e39c5f 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -434,6 +434,15 @@ public final class AudioFormat implements Parcelable { CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT | CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT); /** @hide */ + public static final int CHANNEL_OUT_13POINT_360RA = ( + CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_FRONT_RIGHT | + CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT | + CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_CENTER | + CHANNEL_OUT_TOP_FRONT_RIGHT | + CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT | + CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_CENTER | + CHANNEL_OUT_BOTTOM_FRONT_RIGHT); + /** @hide */ public static final int CHANNEL_OUT_22POINT2 = (CHANNEL_OUT_7POINT1POINT4 | CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | CHANNEL_OUT_BACK_CENTER | CHANNEL_OUT_TOP_CENTER | -- cgit v1.2.3-59-g8ed1b