Невозможно установить входную громкость шины 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.

Другие вопросы по тегам