diff options
| author | 2024-11-29 19:45:44 +0000 | |
|---|---|---|
| committer | 2024-11-29 19:45:44 +0000 | |
| commit | 3c7cd349a41d6643ee896d55acb92115d78e9f87 (patch) | |
| tree | f559e7be85865aebf2a575e3a7af98de33e3a430 | |
| parent | 077e8b2f24f0d6526e5a66b62c8921da279fb154 (diff) | |
| parent | 8a3bfcc914feb90c3e8d2bf6d14b8ed44d42cd9b (diff) | |
Merge "AudioService: SpatializerHelper queries spatialized masks" into main
| -rw-r--r-- | media/java/android/media/AudioFormat.java | 89 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/SpatializerHelper.java | 36 |
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) { |