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

Commit 55787399 authored by Paul McLean's avatar Paul McLean Committed by Android (Google) Code Review
Browse files

Merge "Audio Devices Enumeration/Notification API"

parents 500c1b81 a33be211
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -7661,6 +7661,7 @@ package android.content {
    field public static final java.lang.String ALARM_SERVICE = "alarm";
    field public static final java.lang.String APPWIDGET_SERVICE = "appwidget";
    field public static final java.lang.String APP_OPS_SERVICE = "appops";
    field public static final java.lang.String AUDIO_DEVICES_SERVICE = "audio_devices_manager";
    field public static final java.lang.String AUDIO_SERVICE = "audio";
    field public static final java.lang.String BATTERY_SERVICE = "batterymanager";
    field public static final int BIND_ABOVE_CLIENT = 8; // 0x8
@@ -14567,6 +14568,47 @@ package android.media {
    method public android.media.AudioAttributes.Builder setUsage(int);
  }
  public class AudioDeviceInfo {
    method public java.lang.String getAddress();
    method public int[] getChannelCounts();
    method public int[] getChannelMasks();
    method public int[] getFormats();
    method public java.lang.String getName();
    method public int[] getSampleRates();
    method public int getType();
    method public boolean isSink();
    method public boolean isSource();
    field public static final int TYPE_AUX_LINE = 19; // 0x13
    field public static final int TYPE_BLUETOOTH_A2DP = 8; // 0x8
    field public static final int TYPE_BLUETOOTH_SCO = 7; // 0x7
    field public static final int TYPE_BUILTIN_EARPIECE = 1; // 0x1
    field public static final int TYPE_BUILTIN_MIC = 15; // 0xf
    field public static final int TYPE_BUILTIN_SPEAKER = 2; // 0x2
    field public static final int TYPE_DOCK = 13; // 0xd
    field public static final int TYPE_FM = 14; // 0xe
    field public static final int TYPE_FM_TUNER = 16; // 0x10
    field public static final int TYPE_HDMI = 9; // 0x9
    field public static final int TYPE_HDMI_ARC = 10; // 0xa
    field public static final int TYPE_LINE_ANALOG = 5; // 0x5
    field public static final int TYPE_LINE_DIGITAL = 6; // 0x6
    field public static final int TYPE_TELEPHONY = 18; // 0x12
    field public static final int TYPE_TV_TUNER = 17; // 0x11
    field public static final int TYPE_UNKNOWN = 0; // 0x0
    field public static final int TYPE_USB_ACCESSORY = 12; // 0xc
    field public static final int TYPE_USB_DEVICE = 11; // 0xb
    field public static final int TYPE_WIRED_HEADPHONES = 4; // 0x4
    field public static final int TYPE_WIRED_HEADSET = 3; // 0x3
  }
  public class AudioDevicesManager {
    method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler);
    method public android.media.AudioDeviceInfo[] listDevices(int);
    method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener);
    field public static final int LIST_DEVICES_ALL = 3; // 0x3
    field public static final int LIST_DEVICES_INPUTS = 1; // 0x1
    field public static final int LIST_DEVICES_OUTPUTS = 2; // 0x2
  }
  public class AudioFormat {
    method public int getChannelCount();
    method public int getChannelIndexMask();
@@ -16209,6 +16251,10 @@ package android.media {
    ctor public NotProvisionedException(java.lang.String);
  }
  public abstract interface OnAudioDeviceConnectionListener {
    method public abstract void onAudioDeviceConnection();
  }
  public final class Rating implements android.os.Parcelable {
    method public int describeContents();
    method public float getPercentRating();
+46 −0
Original line number Diff line number Diff line
@@ -7876,6 +7876,7 @@ package android.content {
    field public static final java.lang.String ALARM_SERVICE = "alarm";
    field public static final java.lang.String APPWIDGET_SERVICE = "appwidget";
    field public static final java.lang.String APP_OPS_SERVICE = "appops";
    field public static final java.lang.String AUDIO_DEVICES_SERVICE = "audio_devices_manager";
    field public static final java.lang.String AUDIO_SERVICE = "audio";
    field public static final java.lang.String BACKUP_SERVICE = "backup";
    field public static final java.lang.String BATTERY_SERVICE = "batterymanager";
@@ -15755,6 +15756,47 @@ package android.media {
    method public android.media.AudioAttributes.Builder setUsage(int);
  }
  public class AudioDeviceInfo {
    method public java.lang.String getAddress();
    method public int[] getChannelCounts();
    method public int[] getChannelMasks();
    method public int[] getFormats();
    method public java.lang.String getName();
    method public int[] getSampleRates();
    method public int getType();
    method public boolean isSink();
    method public boolean isSource();
    field public static final int TYPE_AUX_LINE = 19; // 0x13
    field public static final int TYPE_BLUETOOTH_A2DP = 8; // 0x8
    field public static final int TYPE_BLUETOOTH_SCO = 7; // 0x7
    field public static final int TYPE_BUILTIN_EARPIECE = 1; // 0x1
    field public static final int TYPE_BUILTIN_MIC = 15; // 0xf
    field public static final int TYPE_BUILTIN_SPEAKER = 2; // 0x2
    field public static final int TYPE_DOCK = 13; // 0xd
    field public static final int TYPE_FM = 14; // 0xe
    field public static final int TYPE_FM_TUNER = 16; // 0x10
    field public static final int TYPE_HDMI = 9; // 0x9
    field public static final int TYPE_HDMI_ARC = 10; // 0xa
    field public static final int TYPE_LINE_ANALOG = 5; // 0x5
    field public static final int TYPE_LINE_DIGITAL = 6; // 0x6
    field public static final int TYPE_TELEPHONY = 18; // 0x12
    field public static final int TYPE_TV_TUNER = 17; // 0x11
    field public static final int TYPE_UNKNOWN = 0; // 0x0
    field public static final int TYPE_USB_ACCESSORY = 12; // 0xc
    field public static final int TYPE_USB_DEVICE = 11; // 0xb
    field public static final int TYPE_WIRED_HEADPHONES = 4; // 0x4
    field public static final int TYPE_WIRED_HEADSET = 3; // 0x3
  }
  public class AudioDevicesManager {
    method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler);
    method public android.media.AudioDeviceInfo[] listDevices(int);
    method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener);
    field public static final int LIST_DEVICES_ALL = 3; // 0x3
    field public static final int LIST_DEVICES_INPUTS = 1; // 0x1
    field public static final int LIST_DEVICES_OUTPUTS = 2; // 0x2
  }
  public final class AudioFocusInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.media.AudioAttributes getAttributes();
@@ -17424,6 +17466,10 @@ package android.media {
    ctor public NotProvisionedException(java.lang.String);
  }
  public abstract interface OnAudioDeviceConnectionListener {
    method public abstract void onAudioDeviceConnection();
  }
  public final class Rating implements android.os.Parcelable {
    method public int describeContents();
    method public float getPercentRating();
+8 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import android.location.CountryDetector;
import android.location.ICountryDetector;
import android.location.ILocationManager;
import android.location.LocationManager;
import android.media.AudioDevicesManager;
import android.media.AudioManager;
import android.media.MediaRouter;
import android.media.midi.IMidiManager;
@@ -693,6 +694,13 @@ final class SystemServiceRegistry {
            public RadioManager createService(ContextImpl ctx) {
                return new RadioManager(ctx);
            }});

        registerService(Context.AUDIO_DEVICES_SERVICE, AudioDevicesManager.class,
                new CachedServiceFetcher<AudioDevicesManager>() {
            @Override
            public AudioDevicesManager createService(ContextImpl ctx) {
                return new AudioDevicesManager(ctx);
            }});
    }

    /**
+9 −0
Original line number Diff line number Diff line
@@ -3077,6 +3077,15 @@ public abstract class Context {
     */
    public static final String RADIO_SERVICE = "radio";

    /**
     * Use with {@link #getSystemService} to retrieve a
     * {@link android.media.AudioDevicesManager} for handling device enumeration & notification.
     *
     * @see #getSystemService
     * @see android.media.AudioDevicesManager
     */
    public static final String AUDIO_DEVICES_SERVICE = "audio_devices_manager";


    /**
     * Determine whether the given permission is allowed for a particular
+71 −26
Original line number Diff line number Diff line
@@ -20,9 +20,8 @@ import android.util.SparseIntArray;

/**
 * Class to provide information about the audio devices.
 * @hide
 */
public class AudioDevice {
public class AudioDeviceInfo {

    /**
     * A device type associated with an unknown or uninitialized device.
@@ -106,46 +105,92 @@ public class AudioDevice {
     */
    public static final int TYPE_AUX_LINE         = 19;

    AudioDevicePortConfig mConfig;
    private final AudioDevicePort mPort;

    AudioDevice(AudioDevicePortConfig config) {
        mConfig = new AudioDevicePortConfig(config);
    AudioDeviceInfo(AudioDevicePort port) {
       mPort = port;
    }

    /**
     * @hide
     * CANDIDATE FOR PUBLIC API
     * @return
     * @return The internal device ID.
     */
    public boolean isInputDevice() {
        return (mConfig.port().role() == AudioPort.ROLE_SOURCE);
    public int getId() {
        return mPort.handle().id();
    }

    /**
     * @hide
     * CANDIDATE FOR PUBLIC API
     * @return
     * @return The human-readable name of the audio device.
     */
    public boolean isOutputDevice() {
        return (mConfig.port().role() == AudioPort.ROLE_SINK);
    public String getName() {
        return mPort.name();
    }

    /**
     * @hide
     * CANDIDATE FOR PUBLIC API
     * @return
     * @return The "address" string of the device. This generally contains device-specific
     * parameters.
     */
    public int getDeviceType() {
        return INT_TO_EXT_DEVICE_MAPPING.get(mConfig.port().type(), TYPE_UNKNOWN);
    // TODO Is there a compelling reason to expose this?
    public String getAddress() {
        return mPort.address();
    }

   /**
     * @hide
     * CANDIDATE FOR PUBLIC API
     * @return
     * @return true if the audio device is a source for audio data (e.e an input).
     */
    public String getAddress() {
        return mConfig.port().address();
    public boolean isSource() {
        return mPort.role() == AudioPort.ROLE_SOURCE;
    }

    /**
     * @return true if the audio device is a sink for audio data (i.e. an output).
     */
    public boolean isSink() {
        return mPort.role() == AudioPort.ROLE_SINK;
    }

    /**
     * @return An array of sample rates supported by the audio device.
     */
    public int[] getSampleRates() {
        return mPort.samplingRates();
    }

    /**
     * @return An array of channel masks supported by the audio device (defined in
     * AudioFormat.java).
     */
    public int[] getChannelMasks() {
        return mPort.channelMasks();
    }

    /**
     * @return An array of channel counts supported by the audio device.
     */
    public int[] getChannelCounts() {
        int[] masks = getChannelMasks();
        int[] counts = new int[masks.length];
        for (int mask_index = 0; mask_index < masks.length; mask_index++) {
            counts[mask_index] = isSink()
                    ? AudioFormat.channelCountFromOutChannelMask(masks[mask_index])
                    : AudioFormat.channelCountFromInChannelMask(masks[mask_index]);
        }
        return counts;
    }

    /**
     * @return An array of audio format IDs supported by the audio device (defined in
     * AudioFormat.java)
     */
    public int[] getFormats() {
        return mPort.formats();
    }

   /**
     * @return The device type identifier of the audio device (i.e. TYPE_BUILTIN_SPEAKER).
     */
    public int getType() {
        return INT_TO_EXT_DEVICE_MAPPING.get(mPort.type(), TYPE_UNKNOWN);
    }

    /** @hide */
Loading