summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jean-Michel Trivi <jmtrivi@google.com> 2024-11-29 19:45:44 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-11-29 19:45:44 +0000
commit3c7cd349a41d6643ee896d55acb92115d78e9f87 (patch)
treef559e7be85865aebf2a575e3a7af98de33e3a430
parent077e8b2f24f0d6526e5a66b62c8921da279fb154 (diff)
parent8a3bfcc914feb90c3e8d2bf6d14b8ed44d42cd9b (diff)
Merge "AudioService: SpatializerHelper queries spatialized masks" into main
-rw-r--r--media/java/android/media/AudioFormat.java89
-rw-r--r--services/core/java/com/android/server/audio/SpatializerHelper.java36
2 files changed, 109 insertions, 16 deletions
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 0da8371bc824..c72a74efcff8 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -714,7 +714,7 @@ public final class AudioFormat implements Parcelable {
/**
* @hide
* Return a channel mask ready to be used by native code
- * @param mask a combination of the CHANNEL_OUT_* definitions, but not CHANNEL_OUT_DEFAULT
+ * @param javaMask a combination of the CHANNEL_OUT_* definitions, but not CHANNEL_OUT_DEFAULT
* @return a native channel mask
*/
public static int convertChannelOutMaskToNativeMask(int javaMask) {
@@ -724,13 +724,98 @@ public final class AudioFormat implements Parcelable {
/**
* @hide
* Return a java output channel mask
- * @param mask a native channel mask
+ * @param nativeMask a native channel mask
* @return a combination of the CHANNEL_OUT_* definitions
*/
public static int convertNativeChannelMaskToOutMask(int nativeMask) {
return (nativeMask << 2);
}
+ /**
+ * @hide
+ * Return a human-readable string from a java channel mask
+ * @param javaMask a bit field of CHANNEL_OUT_* values
+ * @return a string in the "mono", "stereo", "5.1" style, or the hex version when not a standard
+ * mask.
+ */
+ public static String javaChannelOutMaskToString(int javaMask) {
+ // save haptics info for end of string
+ int haptics = javaMask & (CHANNEL_OUT_HAPTIC_A | CHANNEL_OUT_HAPTIC_B);
+ // continue without looking at haptic channels
+ javaMask &= ~(CHANNEL_OUT_HAPTIC_A | CHANNEL_OUT_HAPTIC_B);
+ StringBuilder result = new StringBuilder("");
+ switch (javaMask) {
+ case CHANNEL_OUT_MONO:
+ result.append("mono");
+ break;
+ case CHANNEL_OUT_STEREO:
+ result.append("stereo");
+ break;
+ case CHANNEL_OUT_QUAD:
+ result.append("quad");
+ break;
+ case CHANNEL_OUT_QUAD_SIDE:
+ result.append("quad side");
+ break;
+ case CHANNEL_OUT_SURROUND:
+ result.append("4.0");
+ break;
+ case CHANNEL_OUT_5POINT1:
+ result.append("5.1");
+ break;
+ case CHANNEL_OUT_6POINT1:
+ result.append("6.1");
+ break;
+ case CHANNEL_OUT_5POINT1_SIDE:
+ result.append("5.1 side");
+ break;
+ case CHANNEL_OUT_7POINT1:
+ result.append("7.1 (5 fronts)");
+ break;
+ case CHANNEL_OUT_7POINT1_SURROUND:
+ result.append("7.1");
+ break;
+ case CHANNEL_OUT_5POINT1POINT2:
+ result.append("5.1.2");
+ break;
+ case CHANNEL_OUT_5POINT1POINT4:
+ result.append("5.1.4");
+ break;
+ case CHANNEL_OUT_7POINT1POINT2:
+ result.append("7.1.2");
+ break;
+ case CHANNEL_OUT_7POINT1POINT4:
+ result.append("7.1.4");
+ break;
+ case CHANNEL_OUT_9POINT1POINT4:
+ result.append("9.1.4");
+ break;
+ case CHANNEL_OUT_9POINT1POINT6:
+ result.append("9.1.6");
+ break;
+ case CHANNEL_OUT_13POINT_360RA:
+ result.append("360RA 13ch");
+ break;
+ case CHANNEL_OUT_22POINT2:
+ result.append("22.2");
+ break;
+ default:
+ result.append("0x").append(Integer.toHexString(javaMask));
+ break;
+ }
+ if ((haptics & (CHANNEL_OUT_HAPTIC_A | CHANNEL_OUT_HAPTIC_B)) != 0) {
+ result.append("(+haptic ");
+ if ((haptics & CHANNEL_OUT_HAPTIC_A) == CHANNEL_OUT_HAPTIC_A) {
+ result.append("A");
+ }
+ if ((haptics & CHANNEL_OUT_HAPTIC_B) == CHANNEL_OUT_HAPTIC_B) {
+ result.append("B");
+ }
+ result.append(")");
+ }
+ return result.toString();
+ }
+
public static final int CHANNEL_IN_DEFAULT = 1;
// These directly match native
public static final int CHANNEL_IN_LEFT = 0x4;
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java
index afa90d5869e3..608edbb87861 100644
--- a/services/core/java/com/android/server/audio/SpatializerHelper.java
+++ b/services/core/java/com/android/server/audio/SpatializerHelper.java
@@ -129,6 +129,8 @@ public class SpatializerHelper {
/** current level as reported by native Spatializer in callback */
private int mSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE;
private int mCapableSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE;
+ /** cached version of Spatializer.getSpatializedChannelMasks */
+ private List<Integer> mSpatializedChannelMasks = Collections.emptyList();
private boolean mTransauralSupported = false;
private boolean mBinauralSupported = false;
@@ -1030,6 +1032,17 @@ public class SpatializerHelper {
return;
}
try {
+ final int[] nativeMasks = mSpat.getSpatializedChannelMasks();
+ for (int i = 0; i < nativeMasks.length; i++) {
+ nativeMasks[i] = AudioFormat.convertNativeChannelMaskToOutMask(nativeMasks[i]);
+ }
+ mSpatializedChannelMasks = Arrays.stream(nativeMasks).boxed().toList();
+
+ } catch (Exception e) { // just catch Exception in case nativeMasks is null
+ Log.e(TAG, "Error calling getSpatializedChannelMasks", e);
+ mSpatializedChannelMasks = Collections.emptyList();
+ }
+ try {
//TODO: register heatracking callback only when sensors are registered
if (mIsHeadTrackingSupported) {
mActualHeadTrackingMode =
@@ -1103,20 +1116,7 @@ public class SpatializerHelper {
}
synchronized @NonNull List<Integer> getSpatializedChannelMasks() {
- if (!checkSpatializer("getSpatializedChannelMasks")) {
- return Collections.emptyList();
- }
- try {
- final int[] nativeMasks = new int[0]; // FIXME mSpat query goes here
- for (int i = 0; i < nativeMasks.length; i++) {
- nativeMasks[i] = AudioFormat.convertNativeChannelMaskToOutMask(nativeMasks[i]);
- }
- final List<Integer> masks = Arrays.stream(nativeMasks).boxed().toList();
- return masks;
- } catch (Exception e) { // just catch Exception in case nativeMasks is null
- Log.e(TAG, "Error calling getSpatializedChannelMasks", e);
- return Collections.emptyList();
- }
+ return mSpatializedChannelMasks;
}
//------------------------------------------------------
@@ -1622,6 +1622,14 @@ public class SpatializerHelper {
pw.println("\tmState:" + mState);
pw.println("\tmSpatLevel:" + mSpatLevel);
pw.println("\tmCapableSpatLevel:" + mCapableSpatLevel);
+ List<Integer> speakerMasks = getSpatializedChannelMasks();
+ StringBuilder masks = speakerMasks.isEmpty()
+ ? new StringBuilder("none") : new StringBuilder("");
+ for (Integer mask : speakerMasks) {
+ masks.append(AudioFormat.javaChannelOutMaskToString(mask)).append(" ");
+ }
+ pw.println("\tspatialized speaker masks: " + masks);
+
pw.println("\tmIsHeadTrackingSupported:" + mIsHeadTrackingSupported);
StringBuilder modesString = new StringBuilder();
for (int mode : mSupportedHeadTrackingModes) {