Я анализирую входящее аудио на 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 вызывает у меня головную боль.Простой способ предотвратить это - отложить начало аудио-очереди, чтобы звук разблокировки мог воспроизводиться беспрепятственно.Но это похоже на взлом, и если кто-то может указать мне в лучшем направлении, я был бы гораздо более счастливым кодером.
Спасибо / Андреас