diff --git a/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt b/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt index c293603bf..daa48237a 100644 --- a/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt +++ b/app/src/main/java/org/linphone/utils/AudioRouteUtils.kt @@ -56,22 +56,48 @@ class AudioRouteUtils { AudioDevice.Capabilities.CapabilityPlay else AudioDevice.Capabilities.CapabilityRecord - - for (audioDevice in coreContext.core.audioDevices) { - if (types.contains(audioDevice.type) && audioDevice.hasCapability(capability)) { - if (conference != null && conference.isIn) { - Log.i("[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName}], routing conference audio to it") - if (output) conference.outputAudioDevice = audioDevice - else conference.inputAudioDevice = audioDevice - } else { - Log.i("[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName}], routing call audio to it") - if (output) currentCall.outputAudioDevice = audioDevice - else currentCall.inputAudioDevice = audioDevice - } - return - } + val preferredDriver = if (output) { + coreContext.core.defaultOutputAudioDevice.driverName + } else { + coreContext.core.defaultInputAudioDevice.driverName + } + + val extendedAudioDevices = coreContext.core.extendedAudioDevices + Log.i("[Audio Route Helper] Looking for an ${if (output) "output" else "input"} audio device with capability [$capability], driver name [$preferredDriver] and type [$types] in extended audio devices list (size ${extendedAudioDevices.size})") + val foundAudioDevice = extendedAudioDevices.find { + it.driverName == preferredDriver && types.contains(it.type) && it.hasCapability(capability) + } + val audioDevice = if (foundAudioDevice == null) { + Log.w("[Audio Route Helper] Failed to find an audio device with capability [$capability], driver name [$preferredDriver] and type [$types]") + extendedAudioDevices.find { + types.contains(it.type) && it.hasCapability(capability) + } + } else { + foundAudioDevice + } + + if (audioDevice == null) { + Log.e("[Audio Route Helper] Couldn't find audio device with capability [$capability] and type [$types]") + for (device in extendedAudioDevices) { + // TODO: switch to debug? + Log.i("[Audio Route Helper] Extended audio device: [${device.deviceName} (${device.driverName}) ${device.type} / ${device.capabilities}]") + } + return + } + + if (conference != null && conference.isIn) { + Log.i("[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing conference audio to it") + if (output) conference.outputAudioDevice = audioDevice + else conference.inputAudioDevice = audioDevice + } else if (currentCall != null) { + Log.i("[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], routing call audio to it") + if (output) currentCall.outputAudioDevice = audioDevice + else currentCall.inputAudioDevice = audioDevice + } else { + Log.i("[Audio Route Helper] Found [${audioDevice.type}] ${if (output) "playback" else "recorder"} audio device [${audioDevice.deviceName} (${audioDevice.driverName})], changing core default audio device") + if (output) coreContext.core.outputAudioDevice = audioDevice + else coreContext.core.inputAudioDevice = audioDevice } - Log.e("[Audio Route Helper] Couldn't find [$typesNames] audio device") } private fun changeCaptureDeviceToMatchAudioRoute(call: Call?, types: List) {