在 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 框架的 MusicPlayer
、MusicSequence
和 AUGraph
播放 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 错误的原因是啥?
应用程序:didReceiveRemoteNotification:fetchCompletionHandler:未调用iOS 9 [重复]