2016-12-29 1 views
0

J'essaie d'utiliser CoreAudio/AudioToolbox pour lire plusieurs fichiers MIDI en utilisant différents nœuds MIDISynth. J'ai les samplers câblés dans un MultiChanelMixer qui est à son tour câblé dans l'unité IO. Je veux pouvoir changer les différents volumes d'entrée indépendamment les uns des autres. Je tentais cela avec cette ligne:Impossible de régler le volume d'entrée du bus MultiChanelMixer AudioUnit

AudioUnitSetParameter(mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Input, UInt32(trackIndex), volume, 0) 

Le problème est que l'ajustement trackIndex 0 ajuste chaque entrée entrant dans le mélangeur, pas seulement un bus comme je me attends à.

Voici la sortie de CAShow du graphique maître

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) 

Voici la classe que j'ai écrit pour contrôler tout cela: https://gist.github.com/jadar/26d9625c875ce91dd2ad0ad63dfd8f80

+0

Le seul endroit où je vois que vous utilisez kMultiChannelMixerParam_Volume dans votre classe est avec kAudioUnitScope_Input. En plus de régler le volume de chaque échantillonneur sur le mélangeur, vous pouvez définir la sortie du mélangeur dans son ensemble en utilisant kAudioUnitScope_Output. –

Répondre

0

mélangeurs sont difficiles parce que d'une manière les canaux briser l'audio paradigme de flux que l'audio de base met en place, plus son différent pour les points de croisement que les maîtres d'entrée/sortie, et différent pour le maître global. Sur la base du code que vous avez fourni, et en supposant que vous passez 0 pour trackIndex, je regarderais les volumes en utilisant la propriété kAudioUnitProperty_MatrixLevels (ce qui peut être difficile à utiliser, alors laissez-moi savoir si vous avez besoin d'aide pour cela). Il est possible que les niveaux de point de croisement ne soient pas réglés correctement et que l'abaissement trackIndex 0 (qui est en fait le bus 0 du canal 0) affecte tout ce que vous entendez. Dans le cas où ce n'est pas clair, la façon dont fonctionne le paradigme bus/canal est contiguë dans le mélangeur lui-même. Donc, si vous avez 4 bus avec des canaux stéréo et que vous voulez affecter le canal 0 du bus 0, ce sera le canal mixer n ° 7.