c++ - iPhone CoreAudio 停止时挂起

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

我有一个 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::WAITING
ClientAudioQueue::ServicePendingCallbacks
音频队列停止
[等]

有人知道它挂起的原因吗?

最佳答案

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

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

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

关于c++ - iPhone CoreAudio 停止时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3091400/

相关文章:

iphone - 释放你拥有的所有@property 保留@synthesize?

iphone - 使用 iPhone 的模态登录 View

ios - 如何在常规 UIViewController 或 UITableViewControllerCell 中对 UITableViewController 单元格进行分组?

objective-c - 如何连续获取 NSSlider 的值?

ios - 分配后,iOS用其他UIImage更新UIImage

c++ - 如何初始化作为 c++11 中的类成员的静态 const vector ?

iphone - 清除 iPhone GPS 坐标缓存以测试较差的 GPS 条件?

c++ - 将数据插入数据结构时是深拷贝还是浅拷贝?

c++ - 循环中的重复随机数

c++ - 类型的无效操作数