从回调中调用Objective c方法

时间:2014-10-22 12:28:04

标签: ios objective-c audio-recording

首先我是新手! 我正在尝试从麦克风获取音频数据并应用过滤器。我发现的滤波器是一种基于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

感谢提前

2 个答案:

答案 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