2012-09-02 8 views
36

Próbuję napisać aplikację na iOS, która dodaje efekty dźwiękowe. Próbuję umieścić efekt audio (ex, distortion i reverb) pomiędzy auconverter i remoteIO. Po ustawieniu tej AU, nie ma dźwięku.Jak ustawić 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); 

AUGraphConnectNodeInput w sekcji jeśli nie

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

ale

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

produkuje dźwięk bez efektów.

+0

Czy sprawdzasz wartość zwracaną po ustawieniu formatu strumienia jednostki zniekształcenia? Zauważyłem, że jednostki audio efektów są wyjątkowo wrażliwe na to, które formaty zaakceptują. –

+0

Czy udzielona odpowiedź jest dla Ciebie pomocna? Tak jest, jeśli nadal jest to problem. W przeciwnym razie sam znajdź rozwiązanie poniżej i zaakceptuj je. Dzięki! – Josiah

Odpowiedz

1

Wprawdzie wcześniej nie wiedziałem o twoim problemie, więc trochę popatrzyłem na twój kod, a na CoreAudioOverview.pdf dla programistów komputerów Mac, który doprowadził mnie wszędzie. W twoim kodzie nie widziałem nic zbyt podstępnego. Wygląda dość ciasno, ale zastanawiałem się nad tymi liniami:

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

Najbardziej szczegółowo wyjaśniono, dlaczego istnieją tutaj dwie linie. Czy nie masz po prostu pierwszej linii?

Po prostu myśl.

Jeśli to nie ma żadnej wartości, sprawdziłeś, czy wykres dźwiękowy jest prawidłowo podłączony. A czy możesz spróbować innego efektu i sprawdzić, czy to działa?

Dobry sukces w tym projekcie. TWOJE ZDROWIE!