在 iOS 9 中调用 DisposeAUGraph() 时导致 kAUGraphErr_CannotDoInCurrentContext 错误的原因是啥?

Posted

技术标签:

【中文标题】在 iOS 9 中调用 DisposeAUGraph() 时导致 kAUGraphErr_CannotDoInCurrentContext 错误的原因是啥?【英文标题】:What causes kAUGraphErr_CannotDoInCurrentContext error when calling DisposeAUGraph() in iOS 9?在 iOS 9 中调用 DisposeAUGraph() 时导致 kAUGraphErr_CannotDoInCurrentContext 错误的原因是什么? 【发布时间】:2016-01-07 12:57:18 【问题描述】:

我有一些代码可以使用 AudioToolbox 框架的 MusicPlayerMusicSequenceAUGraph 播放 MIDI 文件。

播放完成后的一段时间,下面的代码用于整理。此代码在 ios 6-8 中运行没有问题。

但是,在 iOS 9 中,对 DisposeAUGraph 的调用失败,返回错误代码 kAUGraphErr_CannotDoInCurrentContext

DisposeAUGraph 的文档几乎不存在,但返回代码本身的文档指出:

为了避免在渲染线程中旋转或等待(一个坏主意!),许多对 AUGraph 的调用可以返回:kAUGraphErr_CannotDoInCurrentContext。此结果仅在您从其渲染回调调用 AUGraph API 时生成。这意味着它需要的锁当时被另一个线程持有。如果您看到此结果代码,您通常可以再次尝试该操作 - 通常是 NEXT 渲染周期(因此同时可以清除锁定),或者您可以将该调用委托给应用程序中的另一个线程。您不应旋转或休眠渲染线程。

下面的代码没有AUGraph的渲染回调中调用 — 确实,不存在这样的回调 — 代码(当前,在我的调试代码中)由用户手动启动.

是什么导致了这个错误,有什么办法可以避免它吗?

OSStatus result = MusicPlayerStop(g_player);

if (result != noErr)
    DebugLog("Error calling MusicPlayerStop");

UInt32 trackCount;
result = MusicSequenceGetTrackCount(g_sequence, &trackCount);
if (result != noErr)
    DebugLog("Error calling MusicSequenceGetTrackCount.");

while(trackCount > 0)

    MusicTrack track;
    result = MusicSequenceGetIndTrack (g_sequence, 0, &track);
    if (result != noErr)
        DebugLog("Error calling MusicSequenceGetIndTrack.");

    result = MusicSequenceDisposeTrack(g_sequence, track);
    if (result != noErr)
        DebugLog("Error calling MusicSequenceDisposeTrack.");

    result = MusicSequenceGetTrackCount(g_sequence, &trackCount);
    if (result != noErr)
        DebugLog("Error calling MusicSequenceGetTrackCount.");


result = DisposeMusicPlayer(g_player);
if (result != noErr)
    DebugLog("Error calling DisposeMusicPlayer.");
result = DisposeMusicSequence(g_sequence);
if (result != noErr)
    DebugLog("Error calling DisposeMusicSequence.");
result = DisposeAUGraph(g_processingGraph);
if (result != noErr)
    DebugLog("Error calling DisposeAUGraph.");

【问题讨论】:

【参考方案1】:

通过在 iOS 9 上运行时重写我们的播放代码以使用较新的 AVMIDIPlayer* 而不是 MusicPlayer 等来解决此问题。

* 自 iOS 8 起可用

【讨论】:

以上是关于在 iOS 9 中调用 DisposeAUGraph() 时导致 kAUGraphErr_CannotDoInCurrentContext 错误的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 9 中调用 DisposeAUGraph() 时导致 kAUGraphErr_CannotDoInCurrentContext 错误的原因是啥?

iOS 9 中未调用 awakeFromNib

应用程序:didReceiveRemoteNotification:fetchCompletionHandler:未调用iOS 9 [重复]

iOS 9以上系统调用不了支付宝客户端只能调用网页解决方法

在 iOS 9 中未调用 updateSearchResultsForSearchController

调用 http:// 在 ios 9 中不起作用 [重复]