2010-06-22 2 views
2

У меня есть приложение для 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]

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

ответ

1

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

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

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

+0

Я делаю это синхронно, потому что я хочу, чтобы он заканчивался немедленно. Пожалуйста, проверьте мои изменения :) – Goz

+0

Вы пробовали метод «detachNewThreadSelector: toTarget: withObject:» для NSThread вместо «performSelectorOnMainThread»? Тот факт, что остановка вызывается в новом потоке, может решить проблему. –

+0

На самом деле при ближайшем рассмотрении вы ПОЛНОСТЬЮ прямо там. Моя связь между потоками содержит блокировку, которая останавливает передачу звука по сети, и поскольку это в буфере, заполненном обратным вызовом, я предполагаю, что он не может выйти. Я проверю это быстро :) – Goz

Смежные вопросы