Zebedee Pedersen
Zebedee Pedersen

Reputation: 435

Stereo mic passthrough with AVAudioEngine?

I'm trying to create a graph with AVAudioEngine that takes input from the device microphone, and supports stereo output.

Right now the graph looks like this:

[audioEngine.inputNode] --> [Mic input mixer node] --> [Summing mixer node] --> [audioEngine.mainMixerNode]

As the output of audioEngine.inputNode is 1 ch, 48000 Hz, Float32, I wanted to run through a mixer node after the mic so I can a) send the signal to multiple audio units and b) convert to a stereo signal for more interesting routing, panning etc…

However, the audio passthrough is only working if I set the entire graph to match the input format of 1 ch, 48000 Hz, Float32, like this:

audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format: inputSessionFormat!)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: inputSessionFormat!)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: inputSessionFormat!)

I have two format variables, the mono inputSessionFormat and stereo outputSettingFormat, which is 2 ch, 44100 Hz, Float32, non-inter.

As I understood from the docs AVAudioMixerNode should handle format conversion, but in this case it's refusing to play audio unless all connections are set to the same (mono) format. I've also tested this code with AVAudioConnectionPoint as well, to no avail.

Upvotes: 1

Views: 797

Answers (1)

dave234
dave234

Reputation: 4955

Only AVAudioEngine's inputNode and outputNodes have the fixed formats. Use nil when connecting to/from these. Mixers will implicitly convert between their input and output formats. Connect to microphoneInputMixer using nil, and from microphoneInputMixer using the desired format. The mainMixerNode will take any input format and its output format cannot be set.

let desiredFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)
audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format:nil)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: desiredFormat)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: desiredFormat)

Upvotes: 3

Related Questions