AVAudioEngine stops running when changing input to AirPods

I have trouble understanding AVAudioEngine's behaviour when switching audio input sources.

Expected Behaviour

When switching input sources, AVAudioEngine's inputNode should adopt the new input source seamlessly.

Actual Behaviour

When switching from AirPods to the iPhone speaker, AVAudioEngine stops working. No audio is routed through anymore. Querying engine.isRunning still returns true.

When subsequently switching back to AirPods, it still isn't working, but now engine.isRunning returns false.

Stopping and starting the engine on a route change does not help. Neither does calling reset(). Disconnecting and reconnecting the input node does not help, either. The only thing that reliably helps is discarding the whole engine and creating a new one.

OS

This is on iOS 14, beta 5. I can't test this on previous versions I'm afraid; I only have one device around.

Code to Reproduce


Here is a minimum code example. Create a simple app project in Xcode (doesn't matter whether you choose SwiftUI or Storyboard), and give it permissions to access the microphone in Info.plist. Create the following file Conductor.swift:

Code Block swift
import AVFoundation
class Conductor {
static let shared: Conductor = Conductor()
private let _engine = AVAudioEngine?
init() {
// Session
let session = AVAudioSession.sharedInstance()
try? session.setActive(false)
try! session.setCategory(.playAndRecord, options: [.defaultToSpeaker,
.allowBluetooth,
.allowAirPlay])
try! session.setActive(true)
_engine.connect(_engine.inputNode, to: _engine.mainMixerNode, format: nil)
_engine.prepare()
}
func start() { _engine.start() }
}


And in AppDelegate, call:

Code Block swift
Conductor.shared.start()


This example will route the input straight to the output. If you don't have headphones, it will trigger a feedback loop.

Question

What am I missing here? Is this expected behaviour? If so, it does not seem to be documented anywhere.
Hi,

Did you managed to fix this issue. I am working macOS currently and encountered the same issue as you.

Bump

AVAudioEngine stops running when changing input to AirPods
 
 
Q