【问题标题】:iPhone CoreAudio hang when stoppingiPhone CoreAudio 停止时挂起
【发布时间】:2010-06-22 08:21:04
【问题描述】:

我有一个 iPhone 应用程序正在录制音频,然后通过网络进行广播。响应来自远端的“停止”,它会排队通知以停止记录。唉,当它到达 AudioQueueStop 调用时,应用程序只是挂起(即 Stop 永远不会退出)。感谢通知,所有 AudioQueue 操作都发生在同一个线程上。

有人知道这里发生了什么吗?

编辑:我在处理记录器的 UI 线程中设置了一个侦听器。

然后,从我的网络线程中,我使用“postNotificationName”,相信它是向 UI 线程发布消息,并且一切都将从该线程运行。情况似乎并非如此。当我断点 postNotificationName 调用的函数时,似乎调用是在网络线程上进行的,而不是在 UI 线程上进行的。

我认为这是我的错误。任何人都知道如何通过通知 UIThread 来处理它来使其工作?

Edit2:好的,我已经重写它以使用 performSelectorOnMainThread。它仍然崩溃。

从好的方面来说,我刚刚学会了如何从 XCode 中获取更多信息,因此我可以看到调用堆栈:

semaphore_timedwait_signal_trap
semaphore_timedwait_signal
_pthread_cond_wait
pthread_cond_timedwait_relative_np
CAGuard::等待
ClientAudioQueue::ServicePendingCallbacks
音频队列停止
[等]

有人知道为什么会挂起吗?

【问题讨论】:

    标签: c++ iphone objective-c core-audio


    【解决方案1】:

    你怎么称呼AudioQueueStop ?该函数支持同步和异步两种模式。

    首选的方式是使用异步停止,因为函数会立即返回,而剩余的缓冲区将被播放/记录。

    如果您想进行同步并且遇到了挂起,那么某处可能存在死锁或竞争条件。您是否尝试过在调试器下暂停应用程序并检查线程的堆栈帧以查看问题所在?

    【讨论】:

    • 我正在同步执行它,因为我希望它立即结束。请检查我的编辑:)
    • 你试过 NSThread 的 "detachNewThreadSelector:toTarget:withObject:" 方法而不是 "performSelectorOnMainThread" 吗? stop 将在新线程中调用这一事实可能会解决挂起问题。
    • 实际上,仔细检查后,您完全就在那里。我的线程间通信持有一个锁,它阻止音频通过网络发送,因为那是在缓冲区填充回调中,我猜它无法退出。我现在会快速检查一下:)
    • 是的,就是这样!该死的,我希望我早点检查一下。谢谢! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多