2010-06-22 132 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