2012-09-02 3 views
36

음향 효과를 추가하는 iOS 앱을 작성하려고합니다. 저는 오디오 변환기 (예 : 디스토션 및 리버브)를 변환기와 리모트 IO 사이에 넣으려고합니다. 상기 AU를 설정 한 후에는 소리가 들리지 않습니다. AUGraphConnectNodeInput 섹션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(mAuGraph, converterNode, 0, effectNode, 0); 
AUGraphConnectNodeInput(mAuGraph, effectNode, 0, remoteOutputNode, 0); 

하지만

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

는 효과가없는 사운드를 생성한다.

+0

왜곡 단위의 스트림 형식을 설정할 때 반환 값을 확인하고 있습니까? 나는 효과 오디오 유닛이 그들이 받아 들일 포맷에 대해 매우 까다 로울 수 있다는 것을 발견했다. –

+0

제공된 대답이 도움이됩니까? 이것은 여전히 ​​문제가되는 경우입니다. 그렇지 않으면 아래에 직접 솔루션을 제공하고 동의하십시오. 감사! – Josiah

답변

1

필자는 이전에 문제에 대해 알지 못 했으므로 코드를 조금만 들었고 Mac 개발자의 CoreAudioOverview.pdf에서 저에게 많은 도움이되었습니다. 나는 당신의 코드에서 너무 부끄러 웠던 것을 보지 못했습니다. 그것은 아주 꽉 보이지만, 나는이 선에 대해 궁금했던 두 개의 선이 여기 왜 거기

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

대부분의 particulalry합니다. 첫 번째 라인 만 가지고 있으면 안됩니까?

그냥 생각해보십시오.

그다지 가치가 없다면 오디오 그래프가 모두 제대로 연결되어 있는지 확인했는지 확인하십시오. 또한 다른 효과를 시도하고 효과가 있는지 확인할 수 있습니까?

이 프로젝트에 성공했습니다. 건배!