我正在使用AUGraph
Audio Units API和Audio Units在我的iOS应用程序中播放和录制音频。现在,当我AUGraph
无法启动并出现以下错误时,我遇到了一个罕见的问题:
结果= kAUGraphErr_CannotDoInCurrentContext(-10863)
当我们尝试呼叫AUGraphStart
为音频播放设置的错误时,发生了意外错误:
(BOOL)startRendering
{
if (playing) {
return YES;
}
playing = YES;
if (NO == [self setupAudioForGraph:&au_play_graph playout:YES]) {
print_error("Failed to create play AUGraph",0);
playing = NO;
return NO;
}
//result = kAUGraphErr_CannotDoInCurrentContext (-10863)
OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
print_error("AUGraphStart", result);
playing = NO;
}
return playing;
}
这是我们从文档中得到的:
为避免旋转或在渲染线程中等待(这是一个好主意!),对AUGraph的许多调用都可以返回:kAUGraphErr_CannotDoInCurrentContext。仅当您从其渲染回调调用AUGraph API时,才生成此结果。这意味着它当时需要的锁是由另一个线程持有的。如果看到此结果代码,则通常可以再次尝试执行该操作-通常为NEXT渲染周期(因此,在此期间可以清除锁定),也可以将该调用委托给应用程序中的另一个线程。您不应该旋转或休眠渲染线程。
此结果代码只是一个过渡状态,将在您其他线程对AUGraph(具有锁)的调用完成时通过。
就我而言,我只是启动AUGraph
,它是新创建的。我该如何调试这种情况,这里可能存在什么潜在问题?
是的,setupAudioForGraph创建并初始化图形。大多数情况下,它运行良好。这里是并行访问或类似问题。如果只启动一次然后停止一次-一切正常。
—
Alexey Strakh
我会寻找一种方法来查看互斥锁是否存在,如果存在,请继续执行循环(如果未生成AUGraph)。
—
泰勒·贝兰
setupAudioForGraph
办?您是否先对AUGraph进行了初始化?