13ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi/*
23ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
33ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi *
43ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
53ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * you may not use this file except in compliance with the License.
63ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * You may obtain a copy of the License at
73ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi *
83ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
93ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi *
103ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
113ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
123ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * See the License for the specific language governing permissions and
143ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi * limitations under the License.
153ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi */
163ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
173ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivipackage android.media;
183ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
19bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hungimport android.annotation.NonNull;
203ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Triviimport android.util.SparseIntArray;
213ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
223115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLeanimport java.util.TreeSet;
233115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean
243ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi/**
252e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi * Class to provide information about the audio devices.
263ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi */
27e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLeanpublic final class AudioDeviceInfo {
283ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
292e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
302e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type associated with an unknown or uninitialized device.
312e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
326a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_UNKNOWN          = 0;
332e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
342e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the attached earphone speaker.
352e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
366a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_BUILTIN_EARPIECE = 1;
372e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
382e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the speaker system (i.e. a mono speaker or stereo speakers) built
392e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * in a device.
402e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
416a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_BUILTIN_SPEAKER  = 2;
422e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
432e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing a headset, which is the combination of a headphones and microphone.
442e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
456a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_WIRED_HEADSET    = 3;
462e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
47a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * A device type describing a pair of wired headphones.
482e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
496a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_WIRED_HEADPHONES = 4;
502e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
512e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing an analog line-level connection.
522e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
536a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_LINE_ANALOG      = 5;
542e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
552e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing a digital line connection (e.g. SPDIF).
562e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
576a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_LINE_DIGITAL     = 6;
582e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
59a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * A device type describing a Bluetooth device typically used for telephony.
602e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
616a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_BLUETOOTH_SCO    = 7;
622e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
632e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing a Bluetooth device supporting the A2DP profile.
642e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
656a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_BLUETOOTH_A2DP   = 8;
662e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
672e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing an HDMI connection .
682e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
696a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_HDMI             = 9;
702e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
712e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the Audio Return Channel of an HDMI connection.
722e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
736a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_HDMI_ARC         = 10;
742e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
752e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing a USB audio device.
762e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
776a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_USB_DEVICE       = 11;
782e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
792e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing a USB audio device in accessory mode.
802e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
816a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_USB_ACCESSORY    = 12;
822e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
832e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the audio device associated with a dock.
842e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
856a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_DOCK             = 13;
862e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
872e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type associated with the transmission of audio signals over FM.
882e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
896a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_FM               = 14;
902e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
912e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the microphone(s) built in a device.
922e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
936a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_BUILTIN_MIC      = 15;
942e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
952e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type for accessing the audio content transmitted over FM.
962e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
976a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_FM_TUNER         = 16;
982e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
992e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type for accessing the audio content transmitted over the TV tuner system.
1002e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
1016a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_TV_TUNER         = 17;
1022e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
1032e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the transmission of audio signals over the telephony network.
1042e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
1056a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_TELEPHONY        = 18;
1062e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
1072e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     * A device type describing the auxiliary line-level connectors.
1082e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
1096a8eeda65f5e290365029672ef01f9039a83754fEric Laurent    public static final int TYPE_AUX_LINE         = 19;
1101e725f8137391474b71ebd9109a0968ecef5373fEric Laurent    /**
1111e725f8137391474b71ebd9109a0968ecef5373fEric Laurent     * A device type connected over IP.
1121e725f8137391474b71ebd9109a0968ecef5373fEric Laurent     */
1131e725f8137391474b71ebd9109a0968ecef5373fEric Laurent    public static final int TYPE_IP               = 20;
1143ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
115a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    private final AudioDevicePort mPort;
1163ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
117a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    AudioDeviceInfo(AudioDevicePort port) {
118a33be211e768746745a0deeba71f8c6b65e72442Paul McLean       mPort = port;
1193ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
1203ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
1212e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
122a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return The internal device ID.
1232e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
124a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    public int getId() {
125a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.handle().id();
1263ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
1273ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
1282e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
129a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return The human-readable name of the audio device.
1302e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
131338f27ab28a451d08417e4b2987aba1267b4c95dPaul McLean    public CharSequence getProductName() {
132338f27ab28a451d08417e4b2987aba1267b4c95dPaul McLean        String portName = mPort.name();
133338f27ab28a451d08417e4b2987aba1267b4c95dPaul McLean        return portName.length() != 0 ? portName : android.os.Build.MODEL;
1343ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
1353ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
1362e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
137e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     * @hide
138a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return The "address" string of the device. This generally contains device-specific
139a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * parameters.
1402e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
141a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    public String getAddress() {
142a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.address();
143a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
144a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
145a33be211e768746745a0deeba71f8c6b65e72442Paul McLean   /**
146a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return true if the audio device is a source for audio data (e.e an input).
147a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
148a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    public boolean isSource() {
149a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.role() == AudioPort.ROLE_SOURCE;
1503ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
1513ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
1522e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi    /**
153a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return true if the audio device is a sink for audio data (i.e. an output).
1542e7dd4bfc2460b99c37568a223a18e74b9cb8086Jean-Michel Trivi     */
155a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    public boolean isSink() {
156a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.role() == AudioPort.ROLE_SINK;
157a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
158a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
159a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    /**
160a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return An array of sample rates supported by the audio device.
16122cfec3cb843ede7d969591813d6a68eada930cePaul McLean     *
16222cfec3cb843ede7d969591813d6a68eada930cePaul McLean     * Note: an empty array indicates that the device supports arbitrary rates.
163a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
164bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    public @NonNull int[] getSampleRates() {
165a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.samplingRates();
166a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
167a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
168a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    /**
169bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * @return An array of channel position masks (e.g. {@link AudioFormat#CHANNEL_IN_STEREO},
170bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * {@link AudioFormat#CHANNEL_OUT_7POINT1}) for which this audio device can be configured.
171e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     *
172e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     * @see AudioFormat
17322cfec3cb843ede7d969591813d6a68eada930cePaul McLean     *
17422cfec3cb843ede7d969591813d6a68eada930cePaul McLean     * Note: an empty array indicates that the device supports arbitrary channel masks.
175a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
176bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    public @NonNull int[] getChannelMasks() {
177a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return mPort.channelMasks();
178a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
179a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
180a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    /**
181bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * @return An array of channel index masks for which this audio device can be configured.
182bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     *
183bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * @see AudioFormat
18422cfec3cb843ede7d969591813d6a68eada930cePaul McLean     *
18522cfec3cb843ede7d969591813d6a68eada930cePaul McLean     * Note: an empty array indicates that the device supports arbitrary channel index masks.
186bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     */
187bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    public @NonNull int[] getChannelIndexMasks() {
188f29e5f34b39a5688925ca4654be0eab11277b1ccPaul McLean        return mPort.channelIndexMasks();
189bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    }
190bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung
191bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    /**
192bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * @return An array of channel counts (1, 2, 4, ...) for which this audio device
193e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     * can be configured.
19422cfec3cb843ede7d969591813d6a68eada930cePaul McLean     *
19522cfec3cb843ede7d969591813d6a68eada930cePaul McLean     * Note: an empty array indicates that the device supports arbitrary channel counts.
196a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
197bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung    public @NonNull int[] getChannelCounts() {
1983115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        TreeSet<Integer> countSet = new TreeSet<Integer>();
1993115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean
2003115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        // Channel Masks
2013115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        for (int mask : getChannelMasks()) {
2023115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean            countSet.add(isSink() ?
2033115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean                    AudioFormat.channelCountFromOutChannelMask(mask)
2043115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean                    : AudioFormat.channelCountFromInChannelMask(mask));
2053115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        }
2063115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean
2073115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        // Index Masks
2083115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        for (int index_mask : getChannelIndexMasks()) {
2093115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean            countSet.add(Integer.bitCount(index_mask));
2103115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        }
2113115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean
2123115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        int[] counts = new int[countSet.size()];
2133115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        int index = 0;
2143115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean        for (int count : countSet) {
2153115960bdeb89f23131c5abf6eebc8c7e0fd8b9cPaul McLean            counts[index++] = count;
216a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        }
217a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return counts;
218a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
219a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
220a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    /**
221bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * @return An array of audio encodings (e.g. {@link AudioFormat#ENCODING_PCM_16BIT},
222bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * {@link AudioFormat#ENCODING_PCM_FLOAT}) supported by the audio device.
223bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * <code>ENCODING_PCM_FLOAT</code> indicates the device supports more
224bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * than 16 bits of integer precision.  Specifying <code>ENCODING_PCM_FLOAT</code>
225bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * with {@link AudioTrack} or {@link AudioRecord} can preserve at least 24 bits of
226bece0c7a1d4dd038817e7281dc446d3e49ba9d64Andy Hung     * integer precision to that device.
227e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     *
228e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     * @see AudioFormat
22922cfec3cb843ede7d969591813d6a68eada930cePaul McLean     *
23022cfec3cb843ede7d969591813d6a68eada930cePaul McLean     * Note: an empty array indicates that the device supports arbitrary encodings.
231a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
232f62c7428e78b1559ccc61e2d645c31ce10199c60Paul McLean    public @NonNull int[] getEncodings() {
233cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return AudioFormat.filterPublicFormats(mPort.formats());
234a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    }
235a33be211e768746745a0deeba71f8c6b65e72442Paul McLean
236a33be211e768746745a0deeba71f8c6b65e72442Paul McLean   /**
237a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     * @return The device type identifier of the audio device (i.e. TYPE_BUILTIN_SPEAKER).
238a33be211e768746745a0deeba71f8c6b65e72442Paul McLean     */
239a33be211e768746745a0deeba71f8c6b65e72442Paul McLean    public int getType() {
240a33be211e768746745a0deeba71f8c6b65e72442Paul McLean        return INT_TO_EXT_DEVICE_MAPPING.get(mPort.type(), TYPE_UNKNOWN);
2413ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
2423ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
243d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    /** @hide */
244d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    public static int convertDeviceTypeToInternalDevice(int deviceType) {
245d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi        return EXT_TO_INT_DEVICE_MAPPING.get(deviceType, AudioSystem.DEVICE_NONE);
246d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    }
247d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi
248d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    /** @hide */
249d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    public static int convertInternalDeviceToDeviceType(int intDevice) {
2506a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        return INT_TO_EXT_DEVICE_MAPPING.get(intDevice, TYPE_UNKNOWN);
251d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    }
252d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi
2533ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    private static final SparseIntArray INT_TO_EXT_DEVICE_MAPPING;
2543ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
255d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi    private static final SparseIntArray EXT_TO_INT_DEVICE_MAPPING;
256d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi
2573ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    static {
2583ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi        INT_TO_EXT_DEVICE_MAPPING = new SparseIntArray();
2596a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_EARPIECE, TYPE_BUILTIN_EARPIECE);
2606a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_SPEAKER, TYPE_BUILTIN_SPEAKER);
2616a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_WIRED_HEADSET, TYPE_WIRED_HEADSET);
2626a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_WIRED_HEADPHONE, TYPE_WIRED_HEADPHONES);
2636a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO, TYPE_BLUETOOTH_SCO);
2646a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET, TYPE_BLUETOOTH_SCO);
2656a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT, TYPE_BLUETOOTH_SCO);
2666a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, TYPE_BLUETOOTH_A2DP);
2676a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, TYPE_BLUETOOTH_A2DP);
2686a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, TYPE_BLUETOOTH_A2DP);
2696a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI, TYPE_HDMI);
2706a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET, TYPE_DOCK);
2716a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET, TYPE_DOCK);
2726a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_USB_ACCESSORY, TYPE_USB_ACCESSORY);
2736a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_USB_DEVICE, TYPE_USB_DEVICE);
2746a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_TELEPHONY_TX, TYPE_TELEPHONY);
2756a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_LINE, TYPE_LINE_ANALOG);
2766a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HDMI_ARC, TYPE_HDMI_ARC);
2776a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_SPDIF, TYPE_LINE_DIGITAL);
2786a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_FM, TYPE_FM);
2796a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_AUX_LINE, TYPE_AUX_LINE);
2801e725f8137391474b71ebd9109a0968ecef5373fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_IP, TYPE_IP);
2816a8eeda65f5e290365029672ef01f9039a83754fEric Laurent
2826a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BUILTIN_MIC, TYPE_BUILTIN_MIC);
2836a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET, TYPE_BLUETOOTH_SCO);
2846a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_WIRED_HEADSET, TYPE_WIRED_HEADSET);
2856a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_HDMI, TYPE_HDMI);
2866a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_TELEPHONY_RX, TYPE_TELEPHONY);
2876a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BACK_MIC, TYPE_BUILTIN_MIC);
2886a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_ANLG_DOCK_HEADSET, TYPE_DOCK);
2896a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_DGTL_DOCK_HEADSET, TYPE_DOCK);
2906a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_USB_ACCESSORY, TYPE_USB_ACCESSORY);
2916a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_USB_DEVICE, TYPE_USB_DEVICE);
2926a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_FM_TUNER, TYPE_FM_TUNER);
2936a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_TV_TUNER, TYPE_TV_TUNER);
2946a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_LINE, TYPE_LINE_ANALOG);
2956a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_SPDIF, TYPE_LINE_DIGITAL);
2966a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BLUETOOTH_A2DP, TYPE_BLUETOOTH_A2DP);
2971e725f8137391474b71ebd9109a0968ecef5373fEric Laurent        INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_IP, TYPE_IP);
2985fa8939d6f05b964897bd3703d8b56056c0d59caPaul Mclean
2995fa8939d6f05b964897bd3703d8b56056c0d59caPaul Mclean        // not covered here, legacy
3005fa8939d6f05b964897bd3703d8b56056c0d59caPaul Mclean        //AudioSystem.DEVICE_OUT_REMOTE_SUBMIX
3015fa8939d6f05b964897bd3703d8b56056c0d59caPaul Mclean        //AudioSystem.DEVICE_IN_REMOTE_SUBMIX
302d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi
303d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi        // privileges mapping to output device
304d2bebb3ab86177c0d27664af86b30b7dce2c9bcbJean-Michel Trivi        EXT_TO_INT_DEVICE_MAPPING = new SparseIntArray();
3056a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BUILTIN_EARPIECE, AudioSystem.DEVICE_OUT_EARPIECE);
3066a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BUILTIN_SPEAKER, AudioSystem.DEVICE_OUT_SPEAKER);
3076a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_WIRED_HEADSET, AudioSystem.DEVICE_OUT_WIRED_HEADSET);
3086a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_WIRED_HEADPHONES, AudioSystem.DEVICE_OUT_WIRED_HEADPHONE);
3096a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_LINE_ANALOG, AudioSystem.DEVICE_OUT_LINE);
3106a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_LINE_DIGITAL, AudioSystem.DEVICE_OUT_SPDIF);
3116a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLUETOOTH_SCO, AudioSystem.DEVICE_OUT_BLUETOOTH_SCO);
3126a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLUETOOTH_A2DP, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
3136a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI, AudioSystem.DEVICE_OUT_HDMI);
3146a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HDMI_ARC, AudioSystem.DEVICE_OUT_HDMI_ARC);
3156a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_DEVICE, AudioSystem.DEVICE_OUT_USB_DEVICE);
3166a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_USB_ACCESSORY, AudioSystem.DEVICE_OUT_USB_ACCESSORY);
3176a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_DOCK, AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET);
3186a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_FM, AudioSystem.DEVICE_OUT_FM);
3196a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BUILTIN_MIC, AudioSystem.DEVICE_IN_BUILTIN_MIC);
3206a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_FM_TUNER, AudioSystem.DEVICE_IN_FM_TUNER);
3216a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_TV_TUNER, AudioSystem.DEVICE_IN_TV_TUNER);
3226a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_TELEPHONY, AudioSystem.DEVICE_OUT_TELEPHONY_TX);
3236a8eeda65f5e290365029672ef01f9039a83754fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_AUX_LINE, AudioSystem.DEVICE_OUT_AUX_LINE);
3241e725f8137391474b71ebd9109a0968ecef5373fEric Laurent        EXT_TO_INT_DEVICE_MAPPING.put(TYPE_IP, AudioSystem.DEVICE_OUT_IP);
3253ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi    }
3263ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi}
3273ef181227245d437ee3f528fcffc9cfe1e5d7c1eJean-Michel Trivi
328