0

我正在尝试从 remoteIO 录制,这是我的回调。我有一个问题......代码永远不会进入 if (*ioActionFlags == kAudioUnitRenderAction_PostRender)

我如何真正停止录制,使其进入 kAudioUnitRenderAction_PostRender ?对 Core Audio 来说非常新,所以这可能是一个愚蠢的问题(我感觉很好;))非常感谢。

码头。

static OSStatus RecordingCallback (
                               void *                           inRefCon,
                               AudioUnitRenderActionFlags * ioActionFlags,
                               const AudioTimeStamp *           inTimeStamp,
                               UInt32                           inBusNumber,
                               UInt32                           inNumberFrames,
                               AudioBufferList *                ioData) {
EffectState *effectState = (EffectState*) inRefCon;

// just copy samples
UInt32 bus1 = 1;
CheckError(AudioUnitRender(effectState->rioUnit,
                            ioActionFlags,
                            inTimeStamp,
                            bus1,
                            inNumberFrames,
                            ioData),
           "Couldn't render from RemoteIO unit");

if (*ioActionFlags == kAudioUnitRenderAction_PostRender)
{
    OSStatus result = ExtAudioFileWriteAsync(effectState->outputFile,inNumberFrames,ioData);
    if(result) printf("ExtAudioFileWriteAsync %ld \n", result);
}
return noErr;
}
4

1 回答 1

0

这里有几个问题。

首先,您可能打算检查是否设置了 kAudioUnitRenderAction_PostRender,对吗?在这种情况下,您应该使用*ioActionFlags & kAudioUnitRenderAction_PostRender而不是*ioActionFlags == kAudioUnitRenderAction_PostRender. 前者将检查是否设置了标志,而您正在做的是检查是否仅设置了该标志(即,如果kAudioUnitRenderAction_OutputIsSilence还设置了标志,则为*ioActionFlags == kAudioUnitRenderAction_PostRenderfalse

也就是说,在这种情况下,我认为您根本不需要检查该标志。该标志的描述如下:

在渲染通知 Proc 上调用 - 在音频单元的渲染操作之前或之后调用。如果设置了此标志,则在渲染操作完成后调用 proc。

这听起来好像该标志仅在 AUGraph 渲染通知中使用,以指示回调是在渲染完成之前还是之后发生(与您无关,因为看起来您正在从 RemoteIO 获取回调)。

所以基本上,你不需要在你的情况下检查那个标志。不过,您应该检查您的AudioUnitRender电话是否返回noErr

于 2012-10-29T02:16:42.983 回答