Loading core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -5379,12 +5379,14 @@ package android.media { method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void clearOnHeadToSoundstagePoseUpdatedListener(); method @NonNull @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public java.util.List<android.media.AudioDeviceAttributes> getCompatibleAudioDevices(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public int getDesiredHeadTrackingMode(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void getEffectParameter(int, @NonNull byte[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public int getHeadTrackingMode(); method @NonNull @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public java.util.List<java.lang.Integer> getSupportedHeadTrackingModes(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void recenterHeadTracker(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void removeCompatibleAudioDevice(@NonNull android.media.AudioDeviceAttributes); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void removeOnHeadTrackingModeChangedListener(@NonNull android.media.Spatializer.OnHeadTrackingModeChangedListener); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setDesiredHeadTrackingMode(int); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setEffectParameter(int, @NonNull byte[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setEnabled(boolean); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setGlobalTransform(@NonNull float[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setOnHeadToSoundstagePoseUpdatedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.Spatializer.OnHeadToSoundstagePoseUpdatedListener); media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -436,4 +436,8 @@ interface IAudioService { oneway void setSpatializerGlobalTransform(in float[] transform); oneway void recenterHeadTracker(); void setSpatializerParameter(int key, in byte[] value); void getSpatializerParameter(int key, inout byte[] value); } media/java/android/media/Spatializer.java +39 −0 Original line number Diff line number Diff line Loading @@ -792,6 +792,45 @@ public class Spatializer { } } /** * @hide * Sets a parameter on the platform spatializer effect implementation. * This is to be used for vendor-specific configurations of their effect, keys and values are * not reuseable across implementations. * @param key the parameter to change * @param value an array for the value of the parameter to change */ @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) @RequiresPermission(android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS) public void setEffectParameter(int key, @NonNull byte[] value) { Objects.requireNonNull(value); try { mAm.getService().setSpatializerParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error calling setEffectParameter", e); } } /** * @hide * Retrieves a parameter value from the platform spatializer effect implementation. * This is to be used for vendor-specific configurations of their effect, keys and values are * not reuseable across implementations. * @param key the parameter for which the value is queried * @param value a non-empty array to contain the return value. The caller is responsible for * passing an array of size matching the parameter. */ @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) @RequiresPermission(android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS) public void getEffectParameter(int key, @NonNull byte[] value) { Objects.requireNonNull(value); try { mAm.getService().getSpatializerParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error calling getEffectParameter", e); } } //----------------------------------------------------------------------------- // callback helper definitions Loading services/core/java/com/android/server/audio/AudioService.java +14 −0 Original line number Diff line number Diff line Loading @@ -8433,6 +8433,20 @@ public class AudioService extends IAudioService.Stub mSpatializerHelper.setDesiredHeadTrackingMode(mode); } /** @see Spatializer#setEffectParameter */ public void setSpatializerParameter(int key, @NonNull byte[] value) { enforceModifyDefaultAudioEffectsPermission(); Objects.requireNonNull(value); mSpatializerHelper.setEffectParameter(key, value); } /** @see Spatializer#getEffectParameter */ public void getSpatializerParameter(int key, @NonNull byte[] value) { enforceModifyDefaultAudioEffectsPermission(); Objects.requireNonNull(value); mSpatializerHelper.getEffectParameter(key, value); } //========================================================================================== private boolean readCameraSoundForced() { return SystemProperties.getBoolean("audio.camerasound.force", false) || Loading services/core/java/com/android/server/audio/SpatializerHelper.java +50 −0 Original line number Diff line number Diff line Loading @@ -728,4 +728,54 @@ public class SpatializerHelper { } mHeadPoseCallbacks.finishBroadcast(); } //------------------------------------------------------ // vendor parameters synchronized void setEffectParameter(int key, @NonNull byte[] value) { switch (mState) { case STATE_UNINITIALIZED: case STATE_NOT_SUPPORTED: throw (new IllegalStateException( "Can't set parameter key:" + key + " without a spatializer")); case STATE_ENABLED_UNAVAILABLE: case STATE_DISABLED_UNAVAILABLE: case STATE_DISABLED_AVAILABLE: case STATE_ENABLED_AVAILABLE: if (mSpat == null) { throw (new IllegalStateException( "null Spatializer for setParameter for key:" + key)); } break; } // mSpat != null try { mSpat.setParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error in setParameter for key:" + key, e); } } synchronized void getEffectParameter(int key, @NonNull byte[] value) { switch (mState) { case STATE_UNINITIALIZED: case STATE_NOT_SUPPORTED: throw (new IllegalStateException( "Can't get parameter key:" + key + " without a spatializer")); case STATE_ENABLED_UNAVAILABLE: case STATE_DISABLED_UNAVAILABLE: case STATE_DISABLED_AVAILABLE: case STATE_ENABLED_AVAILABLE: if (mSpat == null) { throw (new IllegalStateException( "null Spatializer for getParameter for key:" + key)); } break; } // mSpat != null try { mSpat.getParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error in getParameter for key:" + key, e); } } } Loading
core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -5379,12 +5379,14 @@ package android.media { method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void clearOnHeadToSoundstagePoseUpdatedListener(); method @NonNull @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public java.util.List<android.media.AudioDeviceAttributes> getCompatibleAudioDevices(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public int getDesiredHeadTrackingMode(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void getEffectParameter(int, @NonNull byte[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public int getHeadTrackingMode(); method @NonNull @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public java.util.List<java.lang.Integer> getSupportedHeadTrackingModes(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void recenterHeadTracker(); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void removeCompatibleAudioDevice(@NonNull android.media.AudioDeviceAttributes); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void removeOnHeadTrackingModeChangedListener(@NonNull android.media.Spatializer.OnHeadTrackingModeChangedListener); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setDesiredHeadTrackingMode(int); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setEffectParameter(int, @NonNull byte[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setEnabled(boolean); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setGlobalTransform(@NonNull float[]); method @RequiresPermission("android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS") public void setOnHeadToSoundstagePoseUpdatedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.Spatializer.OnHeadToSoundstagePoseUpdatedListener);
media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -436,4 +436,8 @@ interface IAudioService { oneway void setSpatializerGlobalTransform(in float[] transform); oneway void recenterHeadTracker(); void setSpatializerParameter(int key, in byte[] value); void getSpatializerParameter(int key, inout byte[] value); }
media/java/android/media/Spatializer.java +39 −0 Original line number Diff line number Diff line Loading @@ -792,6 +792,45 @@ public class Spatializer { } } /** * @hide * Sets a parameter on the platform spatializer effect implementation. * This is to be used for vendor-specific configurations of their effect, keys and values are * not reuseable across implementations. * @param key the parameter to change * @param value an array for the value of the parameter to change */ @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) @RequiresPermission(android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS) public void setEffectParameter(int key, @NonNull byte[] value) { Objects.requireNonNull(value); try { mAm.getService().setSpatializerParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error calling setEffectParameter", e); } } /** * @hide * Retrieves a parameter value from the platform spatializer effect implementation. * This is to be used for vendor-specific configurations of their effect, keys and values are * not reuseable across implementations. * @param key the parameter for which the value is queried * @param value a non-empty array to contain the return value. The caller is responsible for * passing an array of size matching the parameter. */ @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS) @RequiresPermission(android.Manifest.permission.MODIFY_DEFAULT_AUDIO_EFFECTS) public void getEffectParameter(int key, @NonNull byte[] value) { Objects.requireNonNull(value); try { mAm.getService().getSpatializerParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error calling getEffectParameter", e); } } //----------------------------------------------------------------------------- // callback helper definitions Loading
services/core/java/com/android/server/audio/AudioService.java +14 −0 Original line number Diff line number Diff line Loading @@ -8433,6 +8433,20 @@ public class AudioService extends IAudioService.Stub mSpatializerHelper.setDesiredHeadTrackingMode(mode); } /** @see Spatializer#setEffectParameter */ public void setSpatializerParameter(int key, @NonNull byte[] value) { enforceModifyDefaultAudioEffectsPermission(); Objects.requireNonNull(value); mSpatializerHelper.setEffectParameter(key, value); } /** @see Spatializer#getEffectParameter */ public void getSpatializerParameter(int key, @NonNull byte[] value) { enforceModifyDefaultAudioEffectsPermission(); Objects.requireNonNull(value); mSpatializerHelper.getEffectParameter(key, value); } //========================================================================================== private boolean readCameraSoundForced() { return SystemProperties.getBoolean("audio.camerasound.force", false) || Loading
services/core/java/com/android/server/audio/SpatializerHelper.java +50 −0 Original line number Diff line number Diff line Loading @@ -728,4 +728,54 @@ public class SpatializerHelper { } mHeadPoseCallbacks.finishBroadcast(); } //------------------------------------------------------ // vendor parameters synchronized void setEffectParameter(int key, @NonNull byte[] value) { switch (mState) { case STATE_UNINITIALIZED: case STATE_NOT_SUPPORTED: throw (new IllegalStateException( "Can't set parameter key:" + key + " without a spatializer")); case STATE_ENABLED_UNAVAILABLE: case STATE_DISABLED_UNAVAILABLE: case STATE_DISABLED_AVAILABLE: case STATE_ENABLED_AVAILABLE: if (mSpat == null) { throw (new IllegalStateException( "null Spatializer for setParameter for key:" + key)); } break; } // mSpat != null try { mSpat.setParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error in setParameter for key:" + key, e); } } synchronized void getEffectParameter(int key, @NonNull byte[] value) { switch (mState) { case STATE_UNINITIALIZED: case STATE_NOT_SUPPORTED: throw (new IllegalStateException( "Can't get parameter key:" + key + " without a spatializer")); case STATE_ENABLED_UNAVAILABLE: case STATE_DISABLED_UNAVAILABLE: case STATE_DISABLED_AVAILABLE: case STATE_ENABLED_AVAILABLE: if (mSpat == null) { throw (new IllegalStateException( "null Spatializer for getParameter for key:" + key)); } break; } // mSpat != null try { mSpat.getParameter(key, value); } catch (RemoteException e) { Log.e(TAG, "Error in getParameter for key:" + key, e); } } }