Невозможно установить входную громкость шины MultiChanelMixer AudioUnit
Я пытаюсь использовать CoreAudio/AudioToolbox для воспроизведения нескольких файлов MIDI с использованием разных узлов MIDISynth. У меня есть семплеры, подключенные к MultiChanelMixer, который, в свою очередь, подключен к блоку ввода-вывода. Я хочу иметь возможность изменять различные объемы ввода независимо друг от друга. Я пытаюсь это с этой строкой:
AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, UInt32(trackIndex), volume, 0)
Проблема в том, что настройка trackIndex
0 регулирует каждый вход, поступающий в микшер, а не только одну шину, как я ожидал.
Вот вывод из CAShow
мастер-графа
AudioUnitGraph 0xC590003:
Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x60000002d580 O I
node 2: 'aumx' 'mcmx' 'appl', instance 0x60000002d680 O I
node 3: 'aumu' 'msyn' 'appl', instance 0x60000002db60 O I
node 4: 'aumu' 'msyn' 'appl', instance 0x60000002ef20 O I
node 5: 'aumu' 'msyn' 'appl', instance 0x60000002df00 O I
node 6: 'aumu' 'msyn' 'appl', instance 0x60800022d820 O I
Connections:
node 2 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 3 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 4 bus 0 => node 2 bus 1 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 5 bus 0 => node 2 bus 2 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 6 bus 0 => node 2 bus 3 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isInitialized=T, isRunning=T (2)
Вот класс, который я написал, чтобы контролировать все это: https://gist.github.com/jadar/26d9625c875ce91dd2ad0ad63dfd8f80
1 ответ
Микшеры сложны, потому что каналы нарушают парадигму аудиопотока, которую устанавливает базовое аудио, плюс она отличается для точек пересечения от мастеров ввода / вывода и отличается для глобального мастера.
На основе предоставленного вами кода и при условии, что вы передаете 0 для trackIndex
Я бы посмотрел на объемы, используя свойство kAudioUnitProperty_MatrixLevels
(что может быть сложно использовать, поэтому дайте мне знать, если вам нужна помощь с этим). Возможно, что уровни пересечения установлены неправильно и что снижение trackIndex
0 (на самом деле это шина 0, канал 0), это влияет на все, что вы слышите.
В случае, если неясно, как работает парадигма шины / канала, это смежный процесс внутри самого микшера. Так что если у вас есть 4 шины со стереоканалами и вы хотите воздействовать на правый канал шины 0, это будет канал микшера 7.