Merge "AudioManager: Bluetooth latency mode control"
This commit is contained in:
@@ -6189,6 +6189,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();
|
||||
@@ -6207,6 +6208,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);
|
||||
@@ -6214,6 +6216,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);
|
||||
|
||||
@@ -2952,6 +2952,30 @@ static jint android_media_AudioSystem_getDirectProfilesForAttributes(JNIEnv *env
|
||||
return jStatus;
|
||||
}
|
||||
|
||||
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[] =
|
||||
@@ -3104,7 +3128,13 @@ static const JNINativeMethod gMethods[] =
|
||||
(void *)android_media_AudioSystem_getDirectPlaybackSupport},
|
||||
{"getDirectProfilesForAttributes",
|
||||
"(Landroid/media/AudioAttributes;Ljava/util/ArrayList;)I",
|
||||
(void *)android_media_AudioSystem_getDirectProfilesForAttributes}};
|
||||
(void *)android_media_AudioSystem_getDirectProfilesForAttributes},
|
||||
{"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",
|
||||
|
||||
@@ -8478,6 +8478,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();
|
||||
}
|
||||
}
|
||||
|
||||
private final Object mMuteAwaitConnectionListenerLock = new Object();
|
||||
|
||||
@GuardedBy("mMuteAwaitConnectionListenerLock")
|
||||
|
||||
@@ -2428,4 +2428,30 @@ public class AudioSystem
|
||||
* Keep in sync with core/jni/android_media_DeviceCallback.h.
|
||||
*/
|
||||
final static int NATIVE_EVENT_ROUTING_CHANGE = 1000;
|
||||
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
@@ -517,4 +517,16 @@ interface IAudioService {
|
||||
boolean handlesvolumeAdjustment);
|
||||
|
||||
AudioHalVersionInfo getHalVersion();
|
||||
|
||||
@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();
|
||||
}
|
||||
|
||||
@@ -124,6 +124,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;
|
||||
@@ -11047,6 +11049,33 @@ public class AudioService extends IAudioService.Stub
|
||||
}
|
||||
}
|
||||
|
||||
/** @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) {
|
||||
|
||||
Reference in New Issue
Block a user