调用AUGraphStart进行播放时接收kAUGraphErr_CannotDoInCurrentContext


113

我正在使用AUGraphAudio 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办?您是否先对AUGraph进行了初始化?
cvu 2015年

6
是的,setupAudioForGraph创建并初始化图形。大多数情况下,它运行良好。这里是并行访问或类似问题。如果只启动一次然后停止一次-一切正常。
Alexey Strakh

1
我会寻找一种方法来查看互斥锁是否存在,如果存在,请继续执行循环(如果未生成AUGraph)。
泰勒·贝兰

Answers:


1

您可以使用CSS或SQLite制作东西。这就是为什么

OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
    print_error("AUGraphStart", result);
    playing = NO;
}

return playing;

}

尝试仅操作此代码,代码中的布尔值存在问题...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.