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