2017-02-21 1 views
0

AudioGraph에서 노드 연결에 대한 질문이 있습니다. 내 생각은 입력에서 음성을 받고 믹서로 볼륨을 높이고 저역 필터로 필터하는 것입니다.AudioGraph에서 RemoteIO, Mixer 및 Filter를 함께 연결하는 방법?

"학습 핵심 오디오"필자는 믹서에 연결된 입력에 연결할 수 있었고 입력을 조작 할 수 있었지만 세 요소를 결합 할 수 없었습니다.

필자도 Apple에서 제공하는 샘플 코드를 살펴 보았지만 프로젝트에 적용한 샘플 코드는 저에게 적합하지 않습니다. 내 코드를보고합니다.

AUGraph AudioGraph; 



    CheckError(NewAUGraph(&AudioGraph), "No new Graph"); 




    AUNode rioNode; 
    AUNode mixerNode; 
    AUNode filterNode; 

    AudioComponentDescription AudioCompDescRIO; 
    AudioCompDescRIO.componentType = kAudioUnitType_Output; 
    AudioCompDescRIO.componentSubType = kAudioUnitSubType_RemoteIO; 
    AudioCompDescRIO.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescRIO.componentFlags = 0; 
    AudioCompDescRIO.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescRIO, &rioNode), "No add Node"); 


    AudioComponentDescription AudioCompDescMixer; 
    AudioCompDescMixer.componentType = kAudioUnitType_Mixer; 
    AudioCompDescMixer.componentSubType = kAudioUnitSubType_MultiChannelMixer; 
    AudioCompDescMixer.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescMixer.componentFlags = 0; 
    AudioCompDescMixer.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescMixer, &mixerNode), "No add Node"); 


    AudioComponentDescription AudioCompDescFiler; 
    AudioCompDescFiler.componentType = kAudioUnitType_Effect; 
    AudioCompDescFiler.componentSubType = kAudioUnitSubType_LowPassFilter; 
    AudioCompDescFiler.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescFiler.componentFlags = 0; 
    AudioCompDescFiler.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescFiler, &filterNode), "No add Node"); 




    CheckError(AUGraphOpen(AudioGraph), "No open Graph"); 



    AudioUnit rioUnit; 
    AudioUnit mixerUnit; 
    AudioUnit filterUnit; 



    CheckError(AUGraphNodeInfo(AudioGraph, rioNode, NULL, &rioUnit), "No node info"); 
    CheckError(AUGraphNodeInfo(AudioGraph, mixerNode, NULL, &mixerUnit), "No node info"); 
    CheckError(AUGraphNodeInfo(AudioGraph, filterNode, NULL, &filterUnit), "No node info"); 







    UInt32 bytesPerSample = sizeof(Float32); 

    AudioStreamBasicDescription asbd; 

    bzero(&asbd, sizeof(asbd)); 
    asbd.mSampleRate = 44100; 
    asbd.mFormatID = kAudioFormatLinearPCM; 
    asbd.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved; 
    asbd.mBitsPerChannel = 8 * bytesPerSample; 
    asbd.mBytesPerFrame = bytesPerSample; 
    asbd.mBytesPerPacket = bytesPerSample; 
    asbd.mFramesPerPacket = 1; 
    asbd.mChannelsPerFrame = 2; 





    AudioUnitElement inputElement = 1; 


    UInt32 enableIO = 1; 
    CheckError(AudioUnitSetProperty(rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputElement, &enableIO, sizeof(enableIO)), "No set property"); 


    AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &asbd, sizeof(asbd)); 
    AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &asbd, sizeof(asbd)); 


    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = inputRenderCallback; 
    callbackStruct.inputProcRefCon = (__bridge void * _Nullable)(self); 
    AUGraphSetNodeInputCallback(AudioGraph, mixerNode, 0, &callbackStruct); 




    AUGraphConnectNodeInput(AudioGraph, rioNode, 1, mixerNode, 0); 
    AUGraphConnectNodeInput(AudioGraph, mixerNode, 0, filterNode, 0); 
    AUGraphConnectNodeInput(AudioGraph, filterNode, 0, rioNode, 0); 




    CheckError(AUGraphInitialize(AudioGraph), "No initialize graph"); 

그래서 도움을 요청합니다. 어떻게해야합니까? 내가 잘 만든 연결? 다른 속성을 설정해야합니까?

감사합니다.

답변

0

결국 세 가지 요소를 모두 실행할 수있었습니다. 내가 만든 실수는 속성의 설정과 관련이 있습니다. 나는 그것을 필요로하는 누군가를 도울 수 있기를 희망하는 작업 코드를 남겨 둡니다. 안녕!

CheckError(NewAUGraph(&AudioGraph), "No new Graph"); 

    AUNode rioNode; 
    AUNode mixerNode; 
    AUNode filterNode; 


    AudioComponentDescription AudioCompDescRIO; 
    AudioCompDescRIO.componentType = kAudioUnitType_Output; 
    AudioCompDescRIO.componentSubType = kAudioUnitSubType_RemoteIO; 
    AudioCompDescRIO.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescRIO.componentFlags = 0; 
    AudioCompDescRIO.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescRIO, &rioNode), "No add Node"); 


    AudioComponentDescription AudioCompDescMixer; 
    AudioCompDescMixer.componentType = kAudioUnitType_Mixer; 
    AudioCompDescMixer.componentSubType = kAudioUnitSubType_MultiChannelMixer; 
    AudioCompDescMixer.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescMixer.componentFlags = 0; 
    AudioCompDescMixer.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescMixer, &mixerNode), "No add Node"); 


    AudioComponentDescription AudioCompDescFiler; 
    AudioCompDescFiler.componentType = kAudioUnitType_Effect; 
    AudioCompDescFiler.componentSubType = kAudioUnitSubType_LowPassFilter; 
    AudioCompDescFiler.componentManufacturer = kAudioUnitManufacturer_Apple; 
    AudioCompDescFiler.componentFlags = 0; 
    AudioCompDescFiler.componentFlagsMask = 0; 

    CheckError(AUGraphAddNode(AudioGraph, &AudioCompDescFiler, &filterNode), "No add Node"); 


    CheckError(AUGraphOpen(AudioGraph), "No open Graph"); 

    AudioUnit rioUnit; 
    AudioUnit mixerUnit; 
    AudioUnit filterUnit; 


    CheckError(AUGraphNodeInfo(AudioGraph, rioNode, NULL, &rioUnit), "No node info"); 
    CheckError(AUGraphNodeInfo(AudioGraph, mixerNode, NULL, &mixerUnit), "No node info"); 
    CheckError(AUGraphNodeInfo(AudioGraph, filterNode, NULL, &filterUnit), "No node info"); 


    UInt32 bytesPerSample = sizeof(Float32); 

    AudioStreamBasicDescription asbd; 
    bzero(&asbd, sizeof(asbd)); 
    asbd.mSampleRate = 44100; 
    asbd.mFormatID = kAudioFormatLinearPCM; 
    asbd.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved; 
    asbd.mBitsPerChannel = 8 * bytesPerSample; 
    asbd.mBytesPerFrame = bytesPerSample; 
    asbd.mBytesPerPacket = bytesPerSample; 
    asbd.mFramesPerPacket = 1; 
    asbd.mChannelsPerFrame = 2; 

    AudioUnitElement inputElement = 1; 

    AudioUnitSetProperty(rioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, inputElement, &asbd, sizeof(asbd)); 


    UInt32 enableIO = 1; 
    AudioUnitSetProperty(rioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputElement, &enableIO, sizeof(enableIO)); 


    UInt32 mixerElementCount = 3; 
    AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &mixerElementCount, sizeof(mixerElementCount)); 

    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = &inputRenderCallback; 
    callbackStruct.inputProcRefCon = (__bridge void *)self; 

    AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 1, &callbackStruct, sizeof(callbackStruct)); 

    AudioUnitSetProperty(mixerUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 2, &callbackStruct, sizeof(callbackStruct)); 

    AudioUnitSetParameter (mixerUnit, kMultiChannelMixerParam_Volume, kAudioUnitScope_Output, 0, 1, 0); 

    AudioUnitSetParameter(filterUnit, kLowPassParam_CutoffFrequency, kAudioUnitScope_Global, 0, 2500, 0); 

    AUGraphConnectNodeInput(AudioGraph, rioNode, 1, mixerNode, 0); 
    AUGraphConnectNodeInput(AudioGraph, mixerNode, 0, filterNode, 0); 
    AUGraphConnectNodeInput(AudioGraph, filterNode, 0, rioNode, 0); 

    CAShow(AudioGraph); 

    CheckError(AUGraphInitialize(AudioGraph), "No initialize graph"); 

    AUGraphStart(AudioGraph); 
관련 문제