Tengo problemas para insertar una unidad mezcladora en un AUGraph
que de lo contrario funciona bien en Mac OS e iOS.Silencio al agregar kAudioUnitSubType_MultiChannelMixer a AUGraph
Mi gráfico de trabajo es el siguiente:
(My Audio render callback) <- [Format converter] <- [DefaultOutput]
Además, soy capaz de insertar correctamente una unidad de ecualización de esta manera:
(My Audio render callback) <- [Format converter] <- [GraphicEQ] <- [DefaultOutput]
Mi objetivo es insertar una unidad mezcladora, pero no hay ecualización, así que puedo controlar el volumen de mi gráfico independientemente del volumen del sistema en iOS. Sin embargo, cuando configuro el gráfico, parece que mira OK, pero todo lo que obtengo es silencio.
Esto es lo que se ve el gráfico como:
(My Audio render callback) <- [Format converter] <- [MultiChannelMixer] <- [DefaultOutput]
... y la salida de CAShow:
AudioUnitGraph 0x397000:
Member Nodes:
node 1: 'auou' 'def ' 'appl', instance 0x8039704d O I
node 2: 'aumx' 'mcmx' 'appl', instance 0x8039704e O I
node 3: 'aufc' 'conv' 'appl', instance 0x8039704f O I
Connections:
node 3 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 2 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
Input Callbacks:
{0x100035d90, 0x10037cd60} => node 3 bus 0 [2 ch, 44100 Hz]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isRunning=T (1)
Y, por último, el código que se establece el gráfico con la comprobación de errores y iOS- código específico eliminado:
// A description of the output device we're looking for.
AudioComponentDescription outputDescription;
outputDescription.componentType = kAudioUnitType_Output;
outputDescription.componentSubType = kAudioUnitSubType_DefaultOutput;
outputDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
outputDescription.componentFlags = 0;
outputDescription.componentFlagsMask = 0;
// A description of the mixer unit
AudioComponentDescription mixerDescription;
mixerDescription.componentType = kAudioUnitType_Mixer;
mixerDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
mixerDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
mixerDescription.componentFlags = 0;
mixerDescription.componentFlagsMask = 0;
// A description for the libspotify -> standard PCM device
AudioComponentDescription converterDescription;
converterDescription.componentType = kAudioUnitType_FormatConverter;
converterDescription.componentSubType = kAudioUnitSubType_AUConverter;
converterDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
converterDescription.componentFlags = 0;
converterDescription.componentFlagsMask = 0;
// Create an AUGraph
OSErr status = NewAUGraph(&audioProcessingGraph);
// Open the graph. AudioUnits are open but not initialized (no resource allocation occurs here)
AUGraphOpen(audioProcessingGraph);
// Add audio output...
status = AUGraphAddNode(audioProcessingGraph, &outputDescription, &outputNode);
// Add mixer
status = AUGraphAddNode(audioProcessingGraph, &mixerDescription, &mixerNode);
// Get mixer unit so we can change volume etc
status = AUGraphNodeInfo(audioProcessingGraph, mixerNode, NULL, &mixerUnit);
// Set mixer bus count
UInt32 busCount = 1;
status = AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &busCount, sizeof(busCount));
// Create PCM converter
status = AUGraphAddNode(audioProcessingGraph, &converterDescription, &inputConverterNode);
// Connect converter to mixer
status = AUGraphConnectNodeInput(audioProcessingGraph, inputConverterNode, 0, mixerNode, 0);
// Connect mixer to output
status = AUGraphConnectNodeInput(audioProcessingGraph, mixerNode, 0, outputNode, 0);
// Set render callback
AURenderCallbackStruct rcbs;
rcbs.inputProc = AudioUnitRenderDelegateCallback;
rcbs.inputProcRefCon = (__bridge void *)(self);
status = AUGraphSetNodeInputCallback(audioProcessingGraph, inputConverterNode, 0, &rcbs);
// Init Queue
status = AUGraphInitialize(audioProcessingGraph);
AUGraphUpdate(audioProcessingGraph, NULL);
AUGraphStart(audioProcessingGraph);
así que esto funcionó con GraphicEQ en lugar de con el mezclador? Con la misma devolución de llamada? ¿Puedes hacerlo funcionar sin la devolución de llamada? – hooleyhoop