summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioFormat.java44
-rw-r--r--media/java/android/media/AudioTrack.java56
2 files changed, 87 insertions, 13 deletions
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 3a8678625b5a..0943595f31d9 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -434,6 +434,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);
@@ -463,6 +475,38 @@ 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_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 |
+ 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 2ea098408d50..b2b2f8e902bf 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -45,6 +45,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.Objects;
import java.util.concurrent.Executor;
@@ -1595,9 +1596,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
@@ -1748,6 +1764,26 @@ public class AudioTrack extends PlayerBase
mDataLoadMode = mode;
}
+ // General pair map
+ private static final HashMap<String, Integer> 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
@@ -1774,21 +1810,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<String, Integer> 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;
}