From 5789bf94dd6506d430e0487e50c2d7602c71f6bf Mon Sep 17 00:00:00 2001 From: Jan Sebechlebsky Date: Tue, 13 Dec 2022 13:55:01 +0100 Subject: [PATCH] Add context-aware AudioTrack construction APIs. This cl also introduces new device policy type for audio. The POLICY_TYPE_AUDIO is used to specialize AudioManager behavior for device-specific context - if the context belongs to VirtualDevice instance with custom device policy for audio, it will try to extract the device specific session id for that device from VDM. The device specific session aid is used to aid virtual device audio routing. The context-aware constructor and builder will be extended in follow-up cls to extract AttributionSource from the Context and pass it to the native layer. The policy will be used to specialize AudioManager behavior for device-specific context. Bug: 261698699 Bug: 249777386 Test: atest VirtualDeviceParamsTest AudioTrackUnitTest AudioTrackTest Change-Id: I558b508f06e8098a8fbebaa0560557af06cdd0f7 --- core/api/current.txt | 1 + core/api/system-current.txt | 1 + .../virtual/VirtualDeviceManager.java | 38 +++++ .../virtual/VirtualDeviceParams.java | 17 +- media/java/android/media/AudioTrack.java | 79 ++++++++-- media/tests/MediaFrameworkTest/Android.bp | 9 +- .../MediaFrameworkTest/AndroidManifest.xml | 3 +- .../unit/AudioTrackUnitTest.java | 145 ++++++++++++++++++ .../virtual/VirtualDeviceParamsTest.java | 3 + 9 files changed, 281 insertions(+), 15 deletions(-) create mode 100644 media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/AudioTrackUnitTest.java diff --git a/core/api/current.txt b/core/api/current.txt index 39ac0d2ebad2c..ad2239bfa0579 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -21182,6 +21182,7 @@ package android.media { method @NonNull public android.media.AudioTrack.Builder setAudioAttributes(@NonNull android.media.AudioAttributes) throws java.lang.IllegalArgumentException; method @NonNull public android.media.AudioTrack.Builder setAudioFormat(@NonNull android.media.AudioFormat) throws java.lang.IllegalArgumentException; method @NonNull public android.media.AudioTrack.Builder setBufferSizeInBytes(@IntRange(from=0) int) throws java.lang.IllegalArgumentException; + method @NonNull public android.media.AudioTrack.Builder setContext(@NonNull android.content.Context); method @NonNull public android.media.AudioTrack.Builder setEncapsulationMode(int); method @NonNull public android.media.AudioTrack.Builder setOffloadedPlayback(boolean); method @NonNull public android.media.AudioTrack.Builder setPerformanceMode(int); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fb742607d9d25..e6e140cf1ae46 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3035,6 +3035,7 @@ package android.companion.virtual { field public static final int LOCK_STATE_DEFAULT = 0; // 0x0 field public static final int NAVIGATION_POLICY_DEFAULT_ALLOWED = 0; // 0x0 field public static final int NAVIGATION_POLICY_DEFAULT_BLOCKED = 1; // 0x1 + field public static final int POLICY_TYPE_AUDIO = 1; // 0x1 field public static final int POLICY_TYPE_SENSORS = 0; // 0x0 field public static final int RECENTS_POLICY_ALLOW_IN_HOST_DEVICE_RECENTS = 1; // 0x1 } diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index dba7c8e630c80..b0292613207f6 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -16,6 +16,8 @@ package android.companion.virtual; +import static android.media.AudioManager.AUDIO_SESSION_ID_GENERATE; + import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.IntRange; @@ -252,6 +254,42 @@ public final class VirtualDeviceManager { } } + /** + * Returns device-specific audio session id for audio playback. + * + * @param deviceId - id of the virtual audio device + * @return Device specific session id to be used for audio playback (see + * {@link android.media.AudioManager.generateAudioSessionId}) if virtual device has + * {@link VirtualDeviceParams.POLICY_TYPE_AUDIO} set to + * {@link VirtualDeviceParams.DEVICE_POLICY_CUSTOM} and Virtual Audio Device + * is configured in context-aware mode. + * Otherwise {@link AUDIO_SESSION_ID_GENERATE} constant is returned. + * @hide + */ + public int getAudioPlaybackSessionId(int deviceId) { + //TODO - Return session id rerouted to VirtualAudioDevice if the VirtualAudioDevice + //is configured to operate in context-aware mode. + return AUDIO_SESSION_ID_GENERATE; + } + + /** + * Returns device-specific audio session id for audio recording. + * + * @param deviceId - id of the virtual audio device + * @return Device specific session id to be used for audio recording (see + * {@link android.media.AudioManager.generateAudioSessionId}) if virtual device has + * {@link VirtualDeviceParams.POLICY_TYPE_AUDIO} set to + * {@link VirtualDeviceParams.DEVICE_POLICY_CUSTOM} and Virtual Audio Device + * is configured in context-aware mode. + * Otherwise {@link AUDIO_SESSION_ID_GENERATE} constant is returned. + * @hide + */ + public int getAudioRecordingSessionId(int deviceId) { + //TODO - Return session id corresponding to VirtualAudioDevice injection if the + // VirtualAudioDevice is configured to operate in context-aware mode. + return AUDIO_SESSION_ID_GENERATE; + } + /** * A virtual device has its own virtual display, audio output, microphone, and camera etc. The * creator of a virtual device can take the output from the virtual display and stream it over diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index be77f2b7e0f5e..f59a7a9b66683 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -129,7 +129,7 @@ public final class VirtualDeviceParams implements Parcelable { * a given policy type. * @hide */ - @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS}) + @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO}) @Retention(RetentionPolicy.SOURCE) @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) public @interface PolicyType {} @@ -147,6 +147,21 @@ public final class VirtualDeviceParams implements Parcelable { */ public static final int POLICY_TYPE_SENSORS = 0; + /** + * Tells the audio framework whether to configure the players ({@link android.media.AudioTrack}, + * {@link android.media.MediaPlayer}, {@link android.media.SoundPool} and recorders + * {@link android.media.AudioRecord}) to use specific session ids re-routed to + * VirtualAudioDevice. + * + *