我正在尝试从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;
}
答案 0 :(得分:0)
这里有几个问题。
首先,您可能打算检查是否设置了kAudioUnitRenderAction_PostRender,对吗?在这种情况下,您应该使用*ioActionFlags & kAudioUnitRenderAction_PostRender
而不是*ioActionFlags == kAudioUnitRenderAction_PostRender
。前者将检查标志是否已设置,而您正在做的是检查是否仅设置了该标志(即,如果kAudioUnitRenderAction_OutputIsSilence
标志也已设置,则*ioActionFlags == kAudioUnitRenderAction_PostRender
将为false
})。
那就是说,在这种情况下,我认为你根本不需要检查那面旗帜。该标志的描述如下:
在渲染通知Proc上调用 - 在音频单元的渲染操作之前或之后调用。如果设置了此标志,则在渲染操作完成后调用proc。
这听起来像是那个标志仅用于AUGraph渲染通知,以指示回调是在渲染完成之前或之后发生的(与你无关,因为看起来你正在从一个回调中获得回调RemoteIO)。
基本上,你不需要在你的情况下检查那个标志。您应该检查您的AudioUnitRender
电话是否已返回noErr
。