AudioManager: Bluetooth latency mode control
Add System APIs to discover support and control the use of latency mode control over Bluetooth link. Bug: 257922898 Test: make Change-Id: Ifca58e6b95abf95f98f5e202172b3e36021fcf6e
This commit is contained in:
@@ -6592,6 +6592,7 @@ package android.media {
|
|||||||
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
|
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 @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
|
||||||
method public boolean isAudioServerRunning();
|
method public boolean isAudioServerRunning();
|
||||||
|
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean isBluetoothVariableLatencyEnabled();
|
||||||
method public boolean isHdmiSystemAudioSupported();
|
method public boolean isHdmiSystemAudioSupported();
|
||||||
method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
|
method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
|
||||||
method @RequiresPermission(android.Manifest.permission.ACCESS_ULTRASOUND) public boolean isUltrasoundSupported();
|
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 void setActiveAssistantServiceUids(@NonNull int[]);
|
||||||
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
|
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 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 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 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);
|
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 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 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 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 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 unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy);
|
||||||
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterMuteAwaitConnectionCallback(@NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
|
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterMuteAwaitConnectionCallback(@NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
|
||||||
|
|||||||
@@ -3201,6 +3201,30 @@ static jint android_media_AudioSystem_clearPreferredMixerAttributes(JNIEnv *env,
|
|||||||
return nativeToJavaStatus(status);
|
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[] =
|
static const JNINativeMethod gMethods[] =
|
||||||
@@ -3364,7 +3388,13 @@ static const JNINativeMethod gMethods[] =
|
|||||||
{"getPreferredMixerAttributes", "(Landroid/media/AudioAttributes;ILjava/util/List;)I",
|
{"getPreferredMixerAttributes", "(Landroid/media/AudioAttributes;ILjava/util/List;)I",
|
||||||
(void *)android_media_AudioSystem_getPreferredMixerAttributes},
|
(void *)android_media_AudioSystem_getPreferredMixerAttributes},
|
||||||
{"clearPreferredMixerAttributes", "(Landroid/media/AudioAttributes;II)I",
|
{"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[] = {
|
static const JNINativeMethod gEventHandlerMethods[] = {
|
||||||
{"native_setup",
|
{"native_setup",
|
||||||
|
|||||||
@@ -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
|
// Mute await connection
|
||||||
|
|
||||||
|
|||||||
@@ -2476,4 +2476,30 @@ public class AudioSystem
|
|||||||
*/
|
*/
|
||||||
public static native int clearPreferredMixerAttributes(
|
public static native int clearPreferredMixerAttributes(
|
||||||
@NonNull AudioAttributes attributes, int portId, int uid);
|
@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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -587,4 +587,16 @@ interface IAudioService {
|
|||||||
IPreferredMixerAttributesDispatcher dispatcher);
|
IPreferredMixerAttributesDispatcher dispatcher);
|
||||||
oneway void unregisterPreferredMixerAttributesDispatcher(
|
oneway void unregisterPreferredMixerAttributesDispatcher(
|
||||||
IPreferredMixerAttributesDispatcher dispatcher);
|
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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,6 +131,8 @@ import android.media.audiopolicy.AudioPolicyConfig;
|
|||||||
import android.media.audiopolicy.AudioProductStrategy;
|
import android.media.audiopolicy.AudioProductStrategy;
|
||||||
import android.media.audiopolicy.AudioVolumeGroup;
|
import android.media.audiopolicy.AudioVolumeGroup;
|
||||||
import android.media.audiopolicy.IAudioPolicyCallback;
|
import android.media.audiopolicy.IAudioPolicyCallback;
|
||||||
|
import android.media.permission.ClearCallingIdentityContext;
|
||||||
|
import android.media.permission.SafeCloseable;
|
||||||
import android.media.projection.IMediaProjection;
|
import android.media.projection.IMediaProjection;
|
||||||
import android.media.projection.IMediaProjectionCallback;
|
import android.media.projection.IMediaProjectionCallback;
|
||||||
import android.media.projection.IMediaProjectionManager;
|
import android.media.projection.IMediaProjectionManager;
|
||||||
@@ -11219,6 +11221,34 @@ public class AudioService extends IAudioService.Stub
|
|||||||
mPrefMixerAttrDispatcher.finishBroadcast();
|
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 final Object mExtVolumeControllerLock = new Object();
|
||||||
private IAudioPolicyCallback mExtVolumeController;
|
private IAudioPolicyCallback mExtVolumeController;
|
||||||
private void setExtVolumeController(IAudioPolicyCallback apc) {
|
private void setExtVolumeController(IAudioPolicyCallback apc) {
|
||||||
|
|||||||
Reference in New Issue
Block a user