Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -20996,6 +20996,7 @@ package android.media { method @NonNull public java.util.List<android.media.AudioPlaybackConfiguration> getActivePlaybackConfigurations(); method @NonNull public java.util.List<android.media.AudioRecordingConfiguration> getActiveRecordingConfigurations(); method public int getAllowedCapturePolicy(); method @NonNull public java.util.List<android.media.AudioDeviceInfo> getAudioDevicesForAttributes(@NonNull android.media.AudioAttributes); method public int getAudioHwSyncForSession(int); method @NonNull public java.util.List<android.media.AudioDeviceInfo> getAvailableCommunicationDevices(); method @Nullable public android.media.AudioDeviceInfo getCommunicationDevice(); media/java/android/media/AudioManager.java +38 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -5647,6 +5648,43 @@ public class AudioManager { } } /** * Get the audio devices that would be used for the routing of the given audio attributes. * These are the devices anticipated to play sound from an {@link AudioTrack} created with * the specified {@link AudioAttributes}. * The audio routing can change if audio devices are physically connected or disconnected or * concurrently through {@link AudioRouting} or {@link MediaRouter}. * @param attributes the {@link AudioAttributes} for which the routing is being queried * @return an empty list if there was an issue with the request, a list of * {@link AudioDeviceInfo} otherwise (typically one device, except for duplicated paths). */ public @NonNull List<AudioDeviceInfo> getAudioDevicesForAttributes( @NonNull AudioAttributes attributes) { final List<AudioDeviceAttributes> devicesForAttributes; try { Objects.requireNonNull(attributes); final IAudioService service = getService(); devicesForAttributes = service.getDevicesForAttributesUnprotected(attributes); } catch (Exception e) { Log.i(TAG, "No audio devices available for specified attributes."); return Collections.emptyList(); } // Map from AudioDeviceAttributes to AudioDeviceInfo AudioDeviceInfo[] outputDeviceInfos = getDevicesStatic(GET_DEVICES_OUTPUTS); List<AudioDeviceInfo> deviceInfosForAttributes = new ArrayList<>(); for (AudioDeviceAttributes deviceForAttributes : devicesForAttributes) { for (AudioDeviceInfo deviceInfo : outputDeviceInfos) { if (deviceForAttributes.getType() == deviceInfo.getType() && TextUtils.equals(deviceForAttributes.getAddress(), deviceInfo.getAddress())) { deviceInfosForAttributes.add(deviceInfo); } } } return Collections.unmodifiableList(deviceInfosForAttributes); } /** * @hide * Volume behavior for an audio device that has no particular volume behavior set. Invalid as Loading media/java/android/media/IAudioService.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -308,6 +308,8 @@ interface IAudioService { List<AudioDeviceAttributes> getDevicesForAttributes(in AudioAttributes attributes); List<AudioDeviceAttributes> getDevicesForAttributesUnprotected(in AudioAttributes attributes); int setAllowedCapturePolicy(in int capturePolicy); int getAllowedCapturePolicy(); Loading services/core/java/com/android/server/audio/AudioService.java +10 −0 Original line number Diff line number Diff line Loading @@ -2611,6 +2611,16 @@ public class AudioService extends IAudioService.Stub return getDevicesForAttributesInt(attributes); } /** @see AudioManager#getAudioDevicesForAttributes(AudioAttributes) * This method is similar with AudioService#getDevicesForAttributes, * only it doesn't enforce permissions because it is used by an unprivileged public API * instead of the system API. */ public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesUnprotected( @NonNull AudioAttributes attributes) { return getDevicesForAttributesInt(attributes); } /** * @see AudioManager#isMusicActive() * @param remotely true if query is for remote playback (cast), false for local playback. Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -20996,6 +20996,7 @@ package android.media { method @NonNull public java.util.List<android.media.AudioPlaybackConfiguration> getActivePlaybackConfigurations(); method @NonNull public java.util.List<android.media.AudioRecordingConfiguration> getActiveRecordingConfigurations(); method public int getAllowedCapturePolicy(); method @NonNull public java.util.List<android.media.AudioDeviceInfo> getAudioDevicesForAttributes(@NonNull android.media.AudioAttributes); method public int getAudioHwSyncForSession(int); method @NonNull public java.util.List<android.media.AudioDeviceInfo> getAvailableCommunicationDevices(); method @Nullable public android.media.AudioDeviceInfo getCommunicationDevice();
media/java/android/media/AudioManager.java +38 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -5647,6 +5648,43 @@ public class AudioManager { } } /** * Get the audio devices that would be used for the routing of the given audio attributes. * These are the devices anticipated to play sound from an {@link AudioTrack} created with * the specified {@link AudioAttributes}. * The audio routing can change if audio devices are physically connected or disconnected or * concurrently through {@link AudioRouting} or {@link MediaRouter}. * @param attributes the {@link AudioAttributes} for which the routing is being queried * @return an empty list if there was an issue with the request, a list of * {@link AudioDeviceInfo} otherwise (typically one device, except for duplicated paths). */ public @NonNull List<AudioDeviceInfo> getAudioDevicesForAttributes( @NonNull AudioAttributes attributes) { final List<AudioDeviceAttributes> devicesForAttributes; try { Objects.requireNonNull(attributes); final IAudioService service = getService(); devicesForAttributes = service.getDevicesForAttributesUnprotected(attributes); } catch (Exception e) { Log.i(TAG, "No audio devices available for specified attributes."); return Collections.emptyList(); } // Map from AudioDeviceAttributes to AudioDeviceInfo AudioDeviceInfo[] outputDeviceInfos = getDevicesStatic(GET_DEVICES_OUTPUTS); List<AudioDeviceInfo> deviceInfosForAttributes = new ArrayList<>(); for (AudioDeviceAttributes deviceForAttributes : devicesForAttributes) { for (AudioDeviceInfo deviceInfo : outputDeviceInfos) { if (deviceForAttributes.getType() == deviceInfo.getType() && TextUtils.equals(deviceForAttributes.getAddress(), deviceInfo.getAddress())) { deviceInfosForAttributes.add(deviceInfo); } } } return Collections.unmodifiableList(deviceInfosForAttributes); } /** * @hide * Volume behavior for an audio device that has no particular volume behavior set. Invalid as Loading
media/java/android/media/IAudioService.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -308,6 +308,8 @@ interface IAudioService { List<AudioDeviceAttributes> getDevicesForAttributes(in AudioAttributes attributes); List<AudioDeviceAttributes> getDevicesForAttributesUnprotected(in AudioAttributes attributes); int setAllowedCapturePolicy(in int capturePolicy); int getAllowedCapturePolicy(); Loading
services/core/java/com/android/server/audio/AudioService.java +10 −0 Original line number Diff line number Diff line Loading @@ -2611,6 +2611,16 @@ public class AudioService extends IAudioService.Stub return getDevicesForAttributesInt(attributes); } /** @see AudioManager#getAudioDevicesForAttributes(AudioAttributes) * This method is similar with AudioService#getDevicesForAttributes, * only it doesn't enforce permissions because it is used by an unprivileged public API * instead of the system API. */ public @NonNull ArrayList<AudioDeviceAttributes> getDevicesForAttributesUnprotected( @NonNull AudioAttributes attributes) { return getDevicesForAttributesInt(attributes); } /** * @see AudioManager#isMusicActive() * @param remotely true if query is for remote playback (cast), false for local playback. Loading