У меня есть приложение для iPhone, которое записывает аудио, а затем транслирует его по сети. В ответ на «остановку» с дальнего конца он приостанавливает уведомление, чтобы остановить запись. Увы, когда он доходит до вызова AudioQueueStop, приложение просто зависает (т.е. Stop никогда не выходит). Благодаря уведомлению все манипуляции с AudioQueue происходят в одном и том же потоке.iPhone CoreAudio зависает при остановке
У кого-нибудь есть идея, что здесь происходит?
Редактировать: Я установил прослушиватель в потоке пользовательского интерфейса, который обрабатывает рекордер.
Затем из сетевого потока я использую «postNotificationName», полагая, что он отправил сообщение в поток пользовательского интерфейса, и все будет работать из этого потока. Это, похоже, не так. Когда я прерываю точку, вызванную postNotificationName, кажется, что вызов выполняется в сетевом потоке, а НЕ - в потоке пользовательского интерфейса.
Я предполагаю, что это моя ошибка. Кто-нибудь знает, как заставить его работать, уведомив UIThread об этом?
Edit2: OK Я переписал его для использования performSelectorOnMainThread. И он по-прежнему падает.
С положительной стороны я только узнал, как получить намного больше информации из XCode, так что я могу видеть стек вызовов идет:
semaphore_timedwait_signal_trap
semaphore_timedwait_signal
_pthread_cond_wait
pthread_cond_timedwait_relative_np
CAGuard :: WaitFor
ClientAudioQueue :: ServicePendingCallbacks
AudioQueueStop
[etc]
У кого-нибудь есть идеи, почему он висит?
Я делаю это синхронно, потому что я хочу, чтобы он заканчивался немедленно. Пожалуйста, проверьте мои изменения :) – Goz
Вы пробовали метод «detachNewThreadSelector: toTarget: withObject:» для NSThread вместо «performSelectorOnMainThread»? Тот факт, что остановка вызывается в новом потоке, может решить проблему. –
На самом деле при ближайшем рассмотрении вы ПОЛНОСТЬЮ прямо там. Моя связь между потоками содержит блокировку, которая останавливает передачу звука по сети, и поскольку это в буфере, заполненном обратным вызовом, я предполагаю, что он не может выйти. Я проверю это быстро :) – Goz