From c3681aa19306c819547fee7bf76505d7a16c0834 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Mon, 17 Jan 2022 11:36:24 -0800 Subject: SpatializerHelper: head tracking init / dump When initializing the sensors, also set the headtracking mode to the desired mode, which defaults to RELATIVE_WORLD. When changing the desired tracking mode, compare against the current tracking mode instead of the previous desired mode. Dump state information from AudioService dump. Bug: 210803914 Test: atest SpatializerTest#testHeadTrackingListener Change-Id: I5144d3218223f241cf047d00f843c518c1e617b8 --- media/java/android/media/Spatializer.java | 23 +++++++++++++++++ .../com/android/server/audio/AudioService.java | 1 + .../android/server/audio/SpatializerHelper.java | 29 +++++++++++++++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/media/java/android/media/Spatializer.java b/media/java/android/media/Spatializer.java index f3f8bbe22637..030d212825ee 100644 --- a/media/java/android/media/Spatializer.java +++ b/media/java/android/media/Spatializer.java @@ -214,6 +214,29 @@ public class Spatializer { @RequiresPermission(android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS) public static final int HEAD_TRACKING_MODE_RELATIVE_DEVICE = 2; + /** + * @hide + * Head tracking mode to string conversion + * @param mode a valid head tracking mode + * @return a string containing the matching constant name + */ + public static final String headtrackingModeToString(int mode) { + switch(mode) { + case HEAD_TRACKING_MODE_UNSUPPORTED: + return "HEAD_TRACKING_MODE_UNSUPPORTED"; + case HEAD_TRACKING_MODE_DISABLED: + return "HEAD_TRACKING_MODE_DISABLED"; + case HEAD_TRACKING_MODE_OTHER: + return "HEAD_TRACKING_MODE_OTHER"; + case HEAD_TRACKING_MODE_RELATIVE_WORLD: + return "HEAD_TRACKING_MODE_RELATIVE_WORLD"; + case HEAD_TRACKING_MODE_RELATIVE_DEVICE: + return "HEAD_TRACKING_MODE_RELATIVE_DEVICE"; + default: + return "head tracking mode unknown " + mode; + } + } + /** * Return the level of support for the spatialization feature on this device. * This level of support is independent of whether the {@code Spatializer} is currently diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 346ae0fed2e1..57ae36ed906b 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -9408,6 +9408,7 @@ public class AudioService extends IAudioService.Stub pw.println("mHasSpatializerEffect:" + mHasSpatializerEffect); pw.println("isSpatializerEnabled:" + isSpatializerEnabled()); pw.println("isSpatialAudioEnabled:" + isSpatialAudioEnabled()); + mSpatializerHelper.dump(pw); mAudioSystem.dump(pw); } diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java index b47ea4f7a4b8..e6789d5e1d49 100644 --- a/services/core/java/com/android/server/audio/SpatializerHelper.java +++ b/services/core/java/com/android/server/audio/SpatializerHelper.java @@ -39,6 +39,7 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.util.Log; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -84,7 +85,7 @@ public class SpatializerHelper { private int mSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE; private int mCapableSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE; private int mActualHeadTrackingMode = Spatializer.HEAD_TRACKING_MODE_UNSUPPORTED; - private int mDesiredHeadTrackingMode = Spatializer.HEAD_TRACKING_MODE_UNSUPPORTED; + private int mDesiredHeadTrackingMode = Spatializer.HEAD_TRACKING_MODE_RELATIVE_WORLD; private int mSpatOutput = 0; private @Nullable ISpatializer mSpat; private @Nullable SpatializerCallback mSpatCallback; @@ -681,12 +682,13 @@ public class SpatializerHelper { return; } try { - if (mode != mDesiredHeadTrackingMode) { - mSpat.setDesiredHeadTrackingMode(spatializerIntToHeadTrackingModeType(mode)); + if (mDesiredHeadTrackingMode != mode) { mDesiredHeadTrackingMode = mode; dispatchDesiredHeadTrackingMode(mode); } - + if (mode != headTrackingModeTypeToSpatializerInt(mSpat.getActualHeadTrackingMode())) { + mSpat.setDesiredHeadTrackingMode(spatializerIntToHeadTrackingModeType(mode)); + } } catch (RemoteException e) { Log.e(TAG, "Error calling setDesiredHeadTrackingMode", e); } @@ -937,6 +939,7 @@ public class SpatializerHelper { } catch (Exception e) { Log.e(TAG, "Error calling setHeadSensor:" + headHandle, e); } + setDesiredHeadTrackingMode(mDesiredHeadTrackingMode); } //------------------------------------------------------ @@ -983,4 +986,22 @@ public class SpatializerHelper { throw(new IllegalArgumentException("Unexpected spatializer level:" + level)); } } + + void dump(PrintWriter pw) { + pw.println("SpatializerHelper:"); + pw.println("\tmState:" + mState); + pw.println("\tmSpatLevel:" + mSpatLevel); + pw.println("\tmCapableSpatLevel:" + mCapableSpatLevel); + pw.println("\tmActualHeadTrackingMode:" + + Spatializer.headtrackingModeToString(mActualHeadTrackingMode)); + pw.println("\tmDesiredHeadTrackingMode:" + + Spatializer.headtrackingModeToString(mDesiredHeadTrackingMode)); + String modesString = ""; + int[] modes = getSupportedHeadTrackingModes(); + for (int mode : modes) { + modesString += Spatializer.headtrackingModeToString(mode) + " "; + } + pw.println("\tsupported head tracking modes:" + modesString); + pw.println("\tmSpatOutput:" + mSpatOutput); + } } -- cgit v1.2.3-59-g8ed1b