AVAudioEngine Voice Processing Fails with Mismatched Input/Output Devices: AggregateDevice Channel Count Mismatch

I'm encountering errors while using AVAudioEngine with voice processing enabled (setVoiceProcessingEnabled(true)) in scenarios where the input and output audio devices are not the same. This issue arises specifically with mismatched devices, preventing the application from functioning as expected.

Works: Paired devices (e.g., MacBook Pro mic → MacBook Pro speakers) Fails: Mismatched devices (e.g., AirPods mic → MacBook Pro speakers)

When using paired input and output devices:

The setup works as expected. Example: MacBook Pro microphone → MacBook Pro speakers. When using mismatched devices:

AVAudioEngine setup fails during aggregate device construction. Example: AirPods microphone → MacBook Pro speakers. Error logs indicate a channel count mismatch.

Here are the partial logs. Due to the content limit, I cannot post the entire logs.

       AUVPAggregate.cpp:1000  client-side input and output formats do not match (err=-10875)
        AUVPAggregate.cpp:1036  err=-10875
           AVAEInternal.h:109   [AVAudioEngineGraph.mm:1344:Initialize: (err = PerformCommand(*outputNode, kAUInitialize, NULL, 0)): error -10875
       AggregateDevice.mm:329   Failed expectation of constructed aggregate (312): mInput.streamChannelCounts == inputStreamChannelCounts
       AggregateDevice.mm:331   Failed expectation of constructed aggregate (312): mInput.totalChannelCount == std::accumulate(inputStreamChannelCounts.begin(), inputStreamChannelCounts.end(), 0U)
       AggregateDevice.mm:182   error fetching default pair
       AggregateDevice.mm:329   Failed expectation of constructed aggregate (336): mInput.streamChannelCounts == inputStreamChannelCounts
       AggregateDevice.mm:331   Failed expectation of constructed aggregate (336): mInput.totalChannelCount == std::accumulate(inputStreamChannelCounts.begin(), inputStreamChannelCounts.end(), 0U)
                     AUHAL.cpp:1782   ca_verify_noerr: [AudioDeviceSetProperty(mDeviceID, NULL, 0, isInput, kAudioDevicePropertyIOProcStreamUsage, theSize, theStreamUsage), 560227702]
AudioHardware-mac-imp.cpp:3484   AudioDeviceSetProperty: no device with given ID
                AUHAL.cpp:1782   ca_verify_noerr: [AudioDeviceSetProperty(mDeviceID, NULL, 0, isInput, kAudioDevicePropertyIOProcStreamUsage, theSize, theStreamUsage), 560227702]
       AggregateDevice.mm:182   error fetching default pair
       AggregateDevice.mm:329   Failed expectation of constructed aggregate (348): mInput.streamChannelCounts == inputStreamChannelCounts
       AggregateDevice.mm:331   Failed expectation of constructed aggregate (348): mInput.totalChannelCount == std::accumulate(inputStreamChannelCounts.begin(), inputStreamChannelCounts.end(), 0U)

Is it possible to use voice processing with different input/output devices?

If yes, are there any specific configurations required to handle mismatched devices? How can we resolve channel count mismatch errors during aggregate device construction?

Are there settings or API adjustments to enforce compatibility between input/output devices? Are there any workarounds or alternative approaches to achieve voice processing functionality with mismatched devices?

For instance, can we force an intermediate channel configuration or downmix input/output formats?

Hello @esphoenixx, thank you for your post. Do you get the same logs as above with just the relevant code in a small test project? If so, please share a link to your test project. That'll help us better understand what's going on. If you're not familiar with preparing a test project, take a look at Creating a test project.

same error

AVAudioEngine Voice Processing Fails with Mismatched Input/Output Devices: AggregateDevice Channel Count Mismatch
 
 
Q