首先我是新手! 我正在尝试从麦克风获取音频数据并应用过滤器。我发现的滤波器是一种基于NVDSP滤波器的客观c方法。滤波器方法和来自麦克风的回调函数在下面。但我不知道如何连接点。如何从performRender回调调用目标c方法,即FilterData?
static OSStatus performRender (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
UInt32 bus1 = 1;
CheckError(AudioUnitRender(effectState.rioUnit,
ioActionFlags,
inTimeStamp,
bus1,
inNumberFrames,
ioData), "Couldn't render from RemoteIO unit");
//how can I call the method here to apply filter on ioData->mBuffers[0].mData ?
//is this logical ? what should I do for best performance?
return noErr;
}
@implementation ViewController
...
...
-(float *) FilterData_rawSamples:(float *)samples
{
// setup Highpass filter
NVHighpassFilter *HPF;
HPF = [[NVHighpassFilter alloc] initWithSamplingRate:samplingRate];
HPF.cornerFrequency = 17500.0f;
HPF.Q = 0.5f;
[HPF filterData:samples numFrames:(UInt32)theFileLengthInFrames numChannels:1];
return samples;
}
...
...
@end
感谢提前
答案 0 :(得分:2)
我没有看到您将回调挂钩到数据源的代码(麦克风API?)。
通常在那时你将传入一个对象。我注意到回调的参数:
void *inRefCon
你没有使用。看一下文档 - 可能你已经传递了你的objective-c对象,回调将使它可以通过参数访问。 inRefCon听起来有点像它可能是你正在寻找的参数。
正确传入您的对象,然后在回调中转换inRefCon。 (再次请查看您正在制作的任何API调用的文档,它可能会概述这一点,我猜测。)
答案 1 :(得分:2)
这是连接回调函数的代码
// Set the render callback on AURemoteIO
AURenderCallbackStruct renderCallback;
renderCallback.inputProc = performRender;
renderCallback.inputProcRefCon = (__bridge void *)(self);
所以我根据Kirk的帖子将自己发送到inRefCon然后我就像这样使用
ViewController *vc = (__bridge ViewController *) inRefCon;
float * filteredData = [vc FilterData_rawSamples:ioData->mBuffers[0].mData numSamples:inNumberFrames ];
//by the way I changed the filterData method
感谢Kirk