Merge "Spatializer: support for effect parameters" into sc-v2-dev

This commit is contained in:
Jean-Michel Trivi
2021-09-21 14:44:51 +00:00
committed by Android (Google) Code Review
5 changed files with 109 additions and 0 deletions

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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) ||

View File

@@ -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);
}
}
}