我有一个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 :: WaitFor的
ClientAudioQueue :: ServicePendingCallbacks
AudioQueueStop
[等]
任何人都有任何想法为什么会挂起来?
答案 0 :(得分:1)
你如何致电AudioQueueStop?该功能支持两种模式:同步和异步。
首选方法是使用异步停止,因为函数将立即返回,而剩余的缓冲区将被播放/录制。
如果你想同步并且你得到一个挂起,那么可能在某处有死锁或竞争条件。您是否尝试在调试器下暂停应用程序并检查线程的堆栈帧以查看问题所在?