in amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/device/DefaultDeviceController.kt [78:158]
override fun listAudioDevices(): List<MediaDevice> {
@SuppressLint("NewApi")
if (buildVersion >= AUDIO_MANAGER_API_LEVEL) {
var isWiredHeadsetOn = false
var isHandsetAvailable = false
val handsetDevicesInfo = setOf(
AudioDeviceInfo.TYPE_BUILTIN_EARPIECE,
AudioDeviceInfo.TYPE_TELEPHONY
)
val audioDevices = mutableListOf<MediaDevice>()
var wiredDeviceCount = 0
for (device in audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {
// System will select wired headset over receiver
// so we want to filter receiver out when wired headset is connected
if (device.type == AudioDeviceInfo.TYPE_WIRED_HEADSET ||
device.type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES ||
device.type == AudioDeviceInfo.TYPE_USB_HEADSET
) {
isWiredHeadsetOn = true
wiredDeviceCount++
}
// Return only one handset device to avoid confusion
if (handsetDevicesInfo.contains(device.type)) {
if (isHandsetAvailable) continue
else {
isHandsetAvailable = true
}
}
if (device.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) continue
audioDevices.add(
MediaDevice(
"${device.productName} (${getReadableType(device.type)})",
MediaDeviceType.fromAudioDeviceInfo(
device.type
)
)
)
}
// It doesn't look like Android can switch between two wired connection, so we'll assume WIRED_HEADSET
// is where audio is routed.
if (wiredDeviceCount > 1) audioDevices.removeIf { it.type == MediaDeviceType.AUDIO_USB_HEADSET }
return if (isWiredHeadsetOn) audioDevices.filter { it.type != MediaDeviceType.AUDIO_HANDSET } else audioDevices
} else {
val res = mutableListOf<MediaDevice>()
res.add(
MediaDevice(
getReadableType(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER),
MediaDeviceType.AUDIO_BUILTIN_SPEAKER
)
)
if (audioManager.isWiredHeadsetOn) {
res.add(
MediaDevice(
getReadableType(AudioDeviceInfo.TYPE_WIRED_HEADSET),
MediaDeviceType.AUDIO_WIRED_HEADSET
)
)
} else {
res.add(
MediaDevice(
getReadableType(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE),
MediaDeviceType.AUDIO_HANDSET
)
)
}
if (audioManager.isBluetoothScoOn) {
res.add(
MediaDevice(
getReadableType(AudioDeviceInfo.TYPE_BLUETOOTH_SCO),
MediaDeviceType.AUDIO_BLUETOOTH
)
)
}
return res
}
}