iPhone CoreAudio зависает при остановке

У меня есть приложение для iPhone, которое записывает звук, а затем транслирует его по сети. В ответ на «стоп» с дальнего конца он ставит в очередь уведомление об остановке записи. Увы, когда дело доходит до вызова AudioQueueStop, приложение просто зависает (т.е. Stop никогда не завершается). Благодаря уведомлению все манипуляции с AudioQueue происходят в одном потоке.

Кто-нибудь понял, что здесь происходит?

Изменить: я настроил прослушиватель в потоке пользовательского интерфейса, который обрабатывает рекордер.

Затем из своего сетевого потока я использую «postNotificationName», полагая, что это сообщение было отправлено в поток пользовательского интерфейса, и все будет выполняться из этого потока. Похоже, это не так. Когда я прерываю функцию, вызываемую postNotificationName, кажется, что вызов выполняется в сетевом потоке, а НЕ в потоке пользовательского интерфейса.

Я предполагаю, что это моя ошибка. Кто-нибудь знает, как заставить его работать, уведомив UIThread об этом?

Edit2: ОК, я переписал его, чтобы использовать PerformSelectorOnMainThread. И все равно вылетает.

С положительной стороны, я только что узнал, как получить гораздо больше информации из XCode, поэтому я могу видеть, как идет стек вызовов:

semaphore_timedwait_signal_trap
semaphore_timedwait_signal
_pthread_cond_wait
pthread_cond_timedwait_relative_np
CAGuard::WaitFor
ClientAudioQueue::ServicePendingCallbacks
AudioQueueStop
[и т. д.]

У кого-нибудь есть идеи, почему он зависает?


person Goz    schedule 22.06.2010    source источник


Ответы (1)


Как вызвать AudioQueueStop? Функция поддерживает два режима: синхронный и асинхронный.

Предпочтительным способом является использование асинхронной остановки, так как функция немедленно вернется, а оставшиеся буферы будут воспроизведены/записаны.

Если вы хотите работать синхронно и зависаете, возможно, где-то есть взаимоблокировка или состояние гонки. Вы пытались приостановить приложение под отладчиком и проверить фреймы стека потоков, чтобы увидеть, в чем проблема?

person Laurent Etiemble    schedule 22.06.2010
comment
Я делаю это синхронно, потому что хочу, чтобы это закончилось немедленно. Пожалуйста, проверьте мое редактирование :) - person Goz; 22.06.2010
comment
Пробовали ли вы метод detachNewThreadSelector:toTarget:withObject: NSThread вместо executeSelectorOnMainThread ? Тот факт, что остановка будет вызвана в новом потоке, возможно, решит проблему зависания. - person Laurent Etiemble; 22.06.2010
comment
На самом деле при ближайшем рассмотрении вы ПОЛНОСТЬЮ правы. Мое взаимодействие между потоками удерживает блокировку, которая предотвращает отправку звука по сети, и, поскольку это находится в обратном вызове, заполненном буфером, я предполагаю, что он не может выйти. Сейчас быстро проверю :) - person Goz; 22.06.2010
comment
Ага, это было! Блин, хотел бы я проверить это раньше. БЛАГОДАРНОСТЬ! :D - person Goz; 22.06.2010