Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03da42ec authored by Dorin Drimus's avatar Dorin Drimus Committed by Android (Google) Code Review
Browse files

Merge "Expose getAudioDevicesForAttributes"

parents 69c6dd78 daeb6a94
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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();
+38 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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();
+10 −0
Original line number Diff line number Diff line
@@ -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.