2012-09-02 12 views
36

Estoy tratando de escribir una aplicación de iOS que agregue efectos de sonido. Estoy tratando de poner una unidad de audio de efectos (por ejemplo, distorsión y reverberación) entre el auconverter y el remoteIO. Después de configurar dicha AU, no hay sonido.Cómo configurar kAudioUnitSubType_Distortion

NewAUGraph(&mAuGraph); 
    AUGraphOpen(mAuGraph); 

    AUNode remoteOutputNode, converterNode, effectNode; 
    AudioUnit remoteIOAudioUnit, converterUnit, effectUnit; 

    AudioComponentDescription cd; 

    cd.componentManufacturer = kAudioUnitManufacturer_Apple; 
    cd.componentFlags = cd.componentFlagsMask = 0; 

    // remote io 
    cd.componentType = kAudioUnitType_Output; 
    cd.componentSubType = kAudioUnitSubType_RemoteIO; 
    AUGraphAddNode(mAuGraph, &cd, &remoteOutputNode); 

    // converter 
    cd.componentType = kAudioUnitType_FormatConverter; 
    cd.componentSubType = kAudioUnitSubType_AUConverter; 
    AUGraphAddNode(mAuGraph, &cd, &converterNode); 

    // ipodeq 
    cd.componentType = kAudioUnitType_Effect; 
    cd.componentSubType = kAudioUnitSubType_Distortion; 
    AUGraphAddNode(mAuGraph, &cd, &effectNode); 

    //callback 
    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = renderCallback; 
    callbackStruct.inputProcRefCon = &audioDataInfo; 
    AUGraphSetNodeInputCallback(mAuGraph, converterNode, 0, &callbackStruct); 

    // set audio unit asbd 
    AudioStreamBasicDescription audioFormat = AUCanonicalASBD(44100.0, audioDataInfo.inputFormat.mChannelsPerFrame); 
    AUGraphNodeInfo(mAuGraph, converterNode, NULL, &converterUnit); 

    AudioUnitSetProperty(converterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &audioDataInfo.inputFormat, sizeof(AudioStreamBasicDescription)); 
    AudioUnitSetProperty(converterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &audioFormat, sizeof(AudioStreamBasicDescription)); 

    // get effect unit 
    AUGraphNodeInfo(mAuGraph, effectNode, NULL, &effectUnit); 

    // set effect unit asbd 
    AudioUnitSetProperty(effectUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &audioFormat, sizeof(AudioStreamBasicDescription)); 
    AudioUnitSetProperty(effectUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &audioFormat, sizeof(audioFormat)); 

    // set remoteio unit asbd 
    AUGraphNodeInfo(mAuGraph, remoteOutputNode, 0, &remoteIOAudioUnit); 
    AudioUnitSetProperty(remoteIOAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &audioFormat, sizeof(AudioStreamBasicDescription)); 

    AUGraphConnectNodeInput(mAuGraph, converterNode, 0, effectNode, 0); 
    AUGraphConnectNodeInput(mAuGraph, effectNode, 0, remoteOutputNode, 0); 

    AUGraphInitialize(mAuGraph); 

en AUGraphConnectNodeInput sección, si no

AUGraphConnectNodeInput(mAuGraph, converterNode, 0, effectNode, 0); 
AUGraphConnectNodeInput(mAuGraph, effectNode, 0, remoteOutputNode, 0); 

pero

AUGraphConnectNodeInput(mAuGraph, converterNode, 0, remoteOutputNode, 0); 

Produce un sonido sin efectos.

+0

¿Está comprobando el valor de retorno cuando configura el formato de secuencia de la unidad de distorsión? He encontrado que las unidades de audio de efectos son extremadamente exigentes con respecto a los formatos que aceptarán. –

+0

¿La respuesta proporcionada lo ayuda? Eso es si esto sigue siendo un problema. De lo contrario, proporcione la solución usted mismo a continuación y acéptelo. ¡Gracias! – Josiah

Respuesta

1

Es cierto que antes no sabía nada acerca de su problema, así que eché un vistazo a su código y al desarrollador de Mac CoreAudioOverview.pdf que me llevó por todas partes. No vi nada demasiado furtivo en tu código. Parece bastante estrecho, pero lo hice se preguntan acerca de estas líneas:

// set effect unit asbd 
AudioUnitSetProperty(effectUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &audioFormat, sizeof(AudioStreamBasicDescription)); 
AudioUnitSetProperty(effectUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &audioFormat, sizeof(audioFormat)); 

mayoría particulalry por las que hay dos líneas aquí. ¿No deberías tener solo la primera línea?

Solo un pensamiento.

Si eso no tiene ningún valor, entonces, ha comprobado para asegurarse de que su gráfico de audio está conectado correctamente. ¿Y también puedes probar un efecto diferente y ver si eso funciona?

Buen éxito en este proyecto. ¡ACLAMACIONES!