【问题标题】:Calling objective c function in callback function在回调函数中调用目标 c 函数
【发布时间】:2013-08-12 04:48:13
【问题描述】:

如何在回调函数中调用objective c函数

回调函数:

static OSStatus inputRenderCallback (

    void                        *inRefCon,      
    AudioUnitRenderActionFlags  *ioActionFlags, 
    const AudioTimeStamp        *inTimeStamp,   
    UInt32                      inBusNumber,    
    UInt32                      inNumberFrames, 
    AudioBufferList             *ioData         
) {

    soundStructPtr    soundStructPointerArray   = (soundStructPtr) inRefCon;
    UInt32            frameTotalForSound        = soundStructPointerArray[inBusNumber].frameCount;
    BOOL              isStereo                  = soundStructPointerArray[inBusNumber].isStereo;


    AudioUnitSampleType *dataInLeft;
    AudioUnitSampleType *dataInRight;

    dataInLeft                 = soundStructPointerArray[inBusNumber].audioDataLeft;
    if (isStereo) dataInRight  = soundStructPointerArray[inBusNumber].audioDataRight;

    AudioUnitSampleType *outSamplesChannelLeft;
    AudioUnitSampleType *outSamplesChannelRight;

    outSamplesChannelLeft                 = (AudioUnitSampleType *) ioData->mBuffers[0].mData;
    if (isStereo) outSamplesChannelRight  = (AudioUnitSampleType *) ioData->mBuffers[1].mData;


    UInt32 sampleNumber = soundStructPointerArray[inBusNumber].sampleNumber;


    for (UInt32 frameNumber = 0; frameNumber < inNumberFrames; ++frameNumber) {

        outSamplesChannelLeft[frameNumber]                 = dataInLeft[sampleNumber];
        if (isStereo) outSamplesChannelRight[frameNumber]  = dataInRight[sampleNumber];

        sampleNumber++;

        if (sampleNumber >= frameTotalForSound){
            sampleNumber = 0;

        }
    }


    soundStructPointerArray[inBusNumber].sampleNumber = sampleNumber;


    return noErr;
}

目标c函数:

- (void) stopAUGraph {

    NSLog (@"Stopping audio processing graph");
    Boolean isRunning = false;
    OSStatus result = AUGraphIsRunning (processingGraph, &isRunning);
    if (noErr != result) {[self printErrorMessage: @"AUGraphIsRunning" withStatus: result]; return;}

    if (isRunning) {

        result = AUGraphStop (processingGraph);
        if (noErr != result) {[self printErrorMessage: @"AUGraphStop" withStatus: result]; return;}
        self.playing = NO;
    }
}

现在在

if (sampleNumber >= frameTotalForSound){
   sampleNumber = 0;
}

回调函数部分如何调用stopAUGraph函数

【问题讨论】:

    标签: iphone ios objective-c callback


    【解决方案1】:

    A.对象有方法,没有功能。不调用方法,但将消息发送到执行该方法的接收器。

    B.因此,您需要引用实例作为消息的接收者,这会导致方法的执行。有两种获取方式:

    文学学士通常,回调有一个 userInfo 指针,它可以直接保存引用,也可以保存在结构中。

    B.B.如果您没有这样的信息,您可以向单身人士索取它或使用全局变量。这更糟。

    C.有了这样的接收器引用后,您可以在 C 函数中使用通常的消息语法,如果它被编译为 Objective-C 代码(filename.m 或 Xcode 中的设置):

    void function (void *userInfo)
    {
       id reference = userInfo; // Using ARC you have to clarify the ownership with castings.
       [reference message];
    }
    

    如果您获得方法的实现指针或使用 rte,您也可以使用函数调用,例如 objc_msgSend()。获取实现指针更糟糕,因为它关闭了多态机制。

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多