Merge "AudioManager: Bluetooth latency mode control"

This commit is contained in:
Eric Laurent
2022-12-21 08:15:20 +00:00
committed by Android (Google) Code Review
6 changed files with 151 additions and 1 deletions

View File

@@ -6592,6 +6592,7 @@ package android.media {
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
method public boolean isAudioServerRunning();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean isBluetoothVariableLatencyEnabled();
method public boolean isHdmiSystemAudioSupported();
method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
method @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public boolean isUltrasoundSupported();
@@ -6610,6 +6611,7 @@ package android.media {
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setActiveAssistantServiceUids(@NonNull int[]);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setBluetoothVariableLatencyEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes);
@@ -6617,6 +6619,7 @@ package android.media {
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull int[]);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean supportsBluetoothVariableLatency();
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy);
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterMuteAwaitConnectionCallback(@NonNull android.media.AudioManager.MuteAwaitConnectionCallback);

View File

@@ -3201,6 +3201,30 @@ static jint android_media_AudioSystem_clearPreferredMixerAttributes(JNIEnv *env,
return nativeToJavaStatus(status);
}
static jboolean android_media_AudioSystem_supportsBluetoothVariableLatency(JNIEnv *env,
jobject thiz) {
bool supports;
if (AudioSystem::supportsBluetoothVariableLatency(&supports) != NO_ERROR) {
supports = false;
}
return supports;
}
static int android_media_AudioSystem_setBluetoothVariableLatencyEnabled(JNIEnv *env, jobject thiz,
jboolean enabled) {
return (jint)check_AudioSystem_Command(
AudioSystem::setBluetoothVariableLatencyEnabled(enabled));
}
static jboolean android_media_AudioSystem_isBluetoothVariableLatencyEnabled(JNIEnv *env,
jobject thiz) {
bool enabled;
if (AudioSystem::isBluetoothVariableLatencyEnabled(&enabled) != NO_ERROR) {
enabled = false;
}
return enabled;
}
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] =
@@ -3364,7 +3388,13 @@ static const JNINativeMethod gMethods[] =
{"getPreferredMixerAttributes", "(Landroid/media/AudioAttributes;ILjava/util/List;)I",
(void *)android_media_AudioSystem_getPreferredMixerAttributes},
{"clearPreferredMixerAttributes", "(Landroid/media/AudioAttributes;II)I",
(void *)android_media_AudioSystem_clearPreferredMixerAttributes}};
(void *)android_media_AudioSystem_clearPreferredMixerAttributes},
{"supportsBluetoothVariableLatency", "()Z",
(void *)android_media_AudioSystem_supportsBluetoothVariableLatency},
{"setBluetoothVariableLatencyEnabled", "(Z)I",
(void *)android_media_AudioSystem_setBluetoothVariableLatencyEnabled},
{"isBluetoothVariableLatencyEnabled", "()Z",
(void *)android_media_AudioSystem_isBluetoothVariableLatencyEnabled}};
static const JNINativeMethod gEventHandlerMethods[] = {
{"native_setup",

View File

@@ -8773,6 +8773,55 @@ public class AudioManager {
}
}
/**
* Requests if the implementation supports controlling the latency modes
* over the Bluetooth A2DP or LE Audio links.
*
* @return true if supported, false otherwise
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public boolean supportsBluetoothVariableLatency() {
try {
return getService().supportsBluetoothVariableLatency();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Enables or disables the variable Bluetooth latency control mechanism in the
* audio framework and the audio HAL. This does not apply to the latency mode control
* on the spatializer output as this is a built-in feature.
*
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public void setBluetoothVariableLatencyEnabled(boolean enabled) {
try {
getService().setBluetoothVariableLatencyEnabled(enabled);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Indicates if the variable Bluetooth latency control mechanism is enabled or disabled.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public boolean isBluetoothVariableLatencyEnabled() {
try {
return getService().isBluetoothVariableLatencyEnabled();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
//====================================================================
// Mute await connection

View File

@@ -2476,4 +2476,30 @@ public class AudioSystem
*/
public static native int clearPreferredMixerAttributes(
@NonNull AudioAttributes attributes, int portId, int uid);
/**
* Requests if the implementation supports controlling the latency modes
* over the Bluetooth A2DP or LE Audio links.
*
* @return true if supported, false otherwise
*
* @hide
*/
public static native boolean supportsBluetoothVariableLatency();
/**
* Enables or disables the variable Bluetooth latency control mechanism in the
* audio framework and the audio HAL. This does not apply to the latency mode control
* on the spatializer output as this is a built-in feature.
*
* @hide
*/
public static native int setBluetoothVariableLatencyEnabled(boolean enabled);
/**
* Indicates if the variable Bluetooth latency control mechanism is enabled or disabled.
* @hide
*/
public static native boolean isBluetoothVariableLatencyEnabled();
}

View File

@@ -587,4 +587,16 @@ interface IAudioService {
IPreferredMixerAttributesDispatcher dispatcher);
oneway void unregisterPreferredMixerAttributesDispatcher(
IPreferredMixerAttributesDispatcher dispatcher);
@EnforcePermission("MODIFY_AUDIO_ROUTING")
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
boolean supportsBluetoothVariableLatency();
@EnforcePermission("MODIFY_AUDIO_ROUTING")
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
void setBluetoothVariableLatencyEnabled(boolean enabled);
@EnforcePermission("MODIFY_AUDIO_ROUTING")
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)")
boolean isBluetoothVariableLatencyEnabled();
}

View File

@@ -131,6 +131,8 @@ import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.AudioProductStrategy;
import android.media.audiopolicy.AudioVolumeGroup;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.media.permission.ClearCallingIdentityContext;
import android.media.permission.SafeCloseable;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionCallback;
import android.media.projection.IMediaProjectionManager;
@@ -11219,6 +11221,34 @@ public class AudioService extends IAudioService.Stub
mPrefMixerAttrDispatcher.finishBroadcast();
}
/** @see AudioManager#supportsBluetoothVariableLatency() */
@android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public boolean supportsBluetoothVariableLatency() {
super.supportsBluetoothVariableLatency_enforcePermission();
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
return AudioSystem.supportsBluetoothVariableLatency();
}
}
/** @see AudioManager#setBluetoothVariableLatencyEnabled(boolean) */
@android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public void setBluetoothVariableLatencyEnabled(boolean enabled) {
super.setBluetoothVariableLatencyEnabled_enforcePermission();
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
AudioSystem.setBluetoothVariableLatencyEnabled(enabled);
}
}
/** @see AudioManager#isBluetoothVariableLatencyEnabled(boolean) */
@android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public boolean isBluetoothVariableLatencyEnabled() {
super.isBluetoothVariableLatencyEnabled_enforcePermission();
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
return AudioSystem.isBluetoothVariableLatencyEnabled();
}
}
private final Object mExtVolumeControllerLock = new Object();
private IAudioPolicyCallback mExtVolumeController;
private void setExtVolumeController(IAudioPolicyCallback apc) {