Filter 如何在听力图中连接RemoteIO、混音器和滤波器?
我有一个关于听力图中的节点连接的问题。我的想法是接收输入的声音,用混音器把音量调大,用低通滤波器过滤 阅读《学习核心音频》一书,我能够连接并操作耦合到滤波器的输入,耦合到混音器的输入,但我无法连接这三个元素 我还查看了苹果公司提供的示例代码,但将其用于我的项目并不适合我。我报告我的代码:Filter 如何在听力图中连接RemoteIO、混音器和滤波器?,filter,audiounit,mixer,remoteio,augraph,Filter,Audiounit,Mixer,Remoteio,Augraph,我有一个关于听力图中的节点连接的问题。我的想法是接收输入的声音,用混音器把音量调大,用低通滤波器过滤 阅读《学习核心音频》一书,我能够连接并操作耦合到滤波器的输入,耦合到混音器的输入,但我无法连接这三个元素 我还查看了苹果公司提供的示例代码,但将其用于我的项目并不适合我。我报告我的代码: AUGraph AudioGraph; CheckError(NewAUGraph(&AudioGraph), "No new Graph"); AUNode ri
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");
所以我请求帮助。我该怎么办?我建立的联系好吗?我必须设置其他属性
感谢您的关注。我终于成功运行了所有三个元素。我犯的错误与设置属性有关。我留下工作代码,希望它能帮助需要它的人。再见
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);