2017-02-21 13 views
0

私はAudioGraphのノード接続について質問します。私の考えは、入力から音声を受信し、ミキサーで音量を上げ、ローパスフィルターでフィルターをかけることです。AudioGraphのRemoteIO、Mixer、Filterを一緒に接続するには?

「Learning Core Audio」という本を読んでいます。私は、フィルタに接続された入力、ミキサーに接続された入力を接続して操作することができましたが、3つの要素を結合できませんでした。

私は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

私は最終的に3つの要素をすべて実行することができました。私が作った間違いは、プロパティの設定に関連していました。私はそれが必要な人を助けることができることを望んでいる作業コードを残す。さようなら!

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); 
関連する問題