Синхронизация служб аудио-очереди и системных звуков iPhone - PullRequest
4 голосов
/ 23 февраля 2012

Я анализирую входящее аудио на iPhone / iPod Touch, используя Audio Queue Services.Требуемое поведение анализатора сводится к следующему: когда приложение становится активным, начинайте анализ;когда приложение отправлено в фоновый режим, прекратите анализ.

Я использую прямой подход, использующий AppDelegate для запуска и остановки анализатора при каждом изменении состояния приложения.

Вот некоторый код:

- (void)applicationWillResignActive:(UIApplication *)application {

    AudioQueueFlush(_aqRef);
    AudioQueueStop(_aqRef, true);
    AudioQueueDispose(_aqRef, true);
}


- (void)applicationDidBecomeActive:(UIApplication *)application {

    AudioQueueNewInput(&_formatDescription, _renderCallback, NULL, NULL, NULL, 0, &_aqRef);
    AudioQueueAllocateBuffer(_aqRef, _aqBufferSize, &_aqBufferRef);
    AudioQueueEnqueueBuffer(_aqRef, _aqBufferRef, 0, NULL);
    AudioQueueStart(_aqRef, NULL);
}

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

Вот что происходит:

Шаг 1) Запустите приложение, аудио-очередь запустится, Боб твой дядя.

Шаг 2) Нажмите кнопку питания, и приложение будет приостановлено.Вы не слышите звук блокировки, потому что аудио-очередь все еще блокирует системные звуки.Тем не менее, иногда это появляется, в основном после первого запуска приложения, но это не надежно.Первый глюк.

Шаг 3) Нажмите кнопку домой и разблокируйте телефон.Опять же, вы не услышите системный звук разблокировки телефона, потому что аудио-очередь уже вступила во владение.Однако вы можете услышать короткий звук разблокировки.Иногда.Также не надежный.Второй глюк.

Шаг 4) Нажмите кнопку домой и отправьте приложение на задний план.Примерно через секунду после исчезновения приложения система вспоминает, что не смогла воспроизвести звук разблокировки на шаге 3, и воспроизводит его СЕЙЧАС.На полную громкость.Это действительно плохо.

Это приводит меня к двум вопросам:

Вопрос 1): Когда нажимают кнопку питания, я не вижу другого способа остановитьаудио-очередь раньше, чем в applicationWillResignActive :.Что-то, чего мне здесь не хватает?У меня все в порядке с отсутствующим звуком блокировки, но я рад узнать о любом другом способе сделать его надежным (или не звуковым) надежно.

Вопрос 2): Отложенная разблокировказвук на шаге 4 вызывает у меня головную боль.Простой способ предотвратить это - отложить начало аудио-очереди, чтобы звук разблокировки мог воспроизводиться беспрепятственно.Но это похоже на взлом, и если кто-то может указать мне в лучшем направлении, я был бы гораздо более счастливым кодером.

Спасибо / Андреас

...