2010-06-22 99 views
2

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

有没有人知道这是怎么回事?

编辑:我已经在处理记录器的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
[etc]

任何人有任何想法,为什么它挂起?

回答

1

你怎么称呼AudioQueueStop?该功能支持两种模式:同步和异步。

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

如果你想去同步,你会得到一个挂起,那么也许有一个死锁或竞争条件的地方。你是否尝试在调试器下暂停应用程序并检查线程的栈帧以查看问题出在哪里?

+0

我在做同步,因为我希望它立即结束。请检查我的编辑:) – Goz 2010-06-22 10:11:11

+0

您是否尝试过NSThread而不是“performSelectorOnMainThread”的“detachNewThreadSelector:toTarget:withObject:”方法?停止将在新线程中调用的事实也许可以解决这个问题。 – 2010-06-22 11:58:46

+0

其实仔细检查你完全正确。我的线程间通信是持有一个锁,它阻止音频通过网络发送,因为在缓冲区填充回调我猜它不能退出。我会立即检查这个:) – Goz 2010-06-22 12:34:09