Search code examples
iosswiftavaudiosessiontwilio-videovideocall

Switch Audio Between Speaker, Built in mic, Bluetooth or No Audio


I am working on a Video/Audio Call App where i need to provide four options related to the Audio Output:

Speaker, Built in mic, Any BLE Device supporting audio, No Audio output

Below functions i have used:

static func setBuiltInMic() {
        let outputs = audioSession.availableInputs
        for output in outputs! {
            if output.portType.rawValue == AVAudioSession.Port.builtInMic.rawValue {
                do {
                    try audioSession.setPreferredInput(output)
                } catch let error {
                    print("Setting Built in Mic Port: \(error.localizedDescription)")
                }
            }
        }
    }
 static func setAndCheckBLEAudioPort() -> Bool {
        let outputs = audioSession.availableInputs
        for output in outputs! {
            if output.portType.rawValue == AVAudioSession.Port.bluetoothHFP.rawValue {
                do {
                    try audioSession.setPreferredInput(output)
                    return true
                } catch let error {
                    print("Setting BLE Port: \(error.localizedDescription)")
                    return false
                }
            }
        }
        return false
    }
static func setupAudioSession(isSpeakerEnabled: Bool) {
        do {
            try audioSession.setCategory(.playAndRecord)
            try audioSession.setMode(.voiceChat)
            try audioSession.overrideOutputAudioPort(isSpeakerEnabled ? .speaker : .none)
            try audioSession.setActive(true, options: [])
        } catch let error as NSError {
            print("Fail: \(error.localizedDescription)")
        }
    }

But this doesn't work Audio keeps coming from different source like speaker even if i try to mute it using setupAudioSession

Anyone has an idea or reference for me to look into it?


Solution

  • The code is working fine, it was an issue with a third party library used for audio and video calls prior to Twilio.