Аудио сигналы тревоги iOS 5 не звучат без kAudioSessionProperty_OverrideCategoryMixWithOthers On - PullRequest
3 голосов
/ 20 ноября 2011

У меня есть аудио приложение , у которого есть некоторые проблемы с тем, как iOS 5 изменила поведение звука. Когда воспроизводится звук моего приложения (AVAudioSessionCategoryPlayback) и из ОС запускается будильник или таймер Clock.app, всплывает уведомление UIAlertView, но без звукового оповещения. Звук моего приложения отлично звучит, чтобы убрать с пути звуковое оповещение, но звуковое оповещение приложения тревоги не звучит.

Естественно, тонны запросов на поддержку вылились в iOS 5. Я решил это временно , установив kAudioSessionProperty_OverrideCategoryMixWithOthers, который пропускает звук тревоги, но при этом есть несколько очень нежелательных побочных эффектов:

  • Аудио другого приложения может воспроизводиться вместе с моим.
  • События пульта дистанционного управления направляются не в мое приложение, а в iPod.app.

Ни один из вышеперечисленных недостатков не подходит для требований моего приложения. Я уже давно этим занимаюсь, но так и не смог его взломать. Как мне настроить звук так, чтобы:

  1. Аудио моего приложения по-прежнему использует категорию AVAudioSessionCategoryPlayback для фонового звука.
  2. Сигналы тревоги Clock.app по-прежнему содержат звуковые сигналы, издающие звук
  3. Приложение по-прежнему реагирует на уведомления удаленного управления

1 Ответ

3 голосов
/ 20 ноября 2011

После написания этого вопроса я отправил отчет об ошибке по этому вопросу.Я создал небольшой пример проекта , который, как я думал, будет повторять проблему, но я не мог ее воспроизвести!Это заставило меня еще раз углубиться и попытаться выяснить, что здесь произошло ...

Я включил сигнал тревоги iOS, затем установил точку останова в audioPlayerBeginInterruption: и построчно проследил мой кодв отладчике.Я заметил, что до того, как мой код заработал (пока я был приостановлен в отладчике), звучал сигнал тревоги iOS 5!К счастью, оно все еще звучало, даже когда я проходил через мое приложение, поэтому я смог выяснить, какие фрагменты кода специально заставили его перестать звучать.

Часть моего прерывания: Хэндлер (очевидно) должен остановить внутреннее аудиомоего приложения, чтобы позволить прерывание пройти.Я никогда не думал проверять этот метод раньше, но оказалось, что проблема существовала там.Мой метод остановки вызвал бы prepareToPlay сразу после остановки, чтобы в следующий раз ускорить возобновление.

[self.player stop];
[self.player prepareToPlay]; // <- iOS 5 alarm sound stopped here.

Документы указывают prepareToPlay метод

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

Звучит разумно, и это работало для небольших версий iOS.Моя гипотеза заключается в том, что , должно быть, внесли изменения в систему аварийной сигнализации Clock.app, чтобы новые звуки сигналов тревоги использовали аппаратное обеспечение, тогда как до этого использовалось программное обеспечение.Это то, что я думаю, заставляет сигналы тревоги iOS 5 в некоторых приложениях молчать.

Удаление строк prepareToPlay вызывало срабатывание будильника без использования kAudioSessionProperty_OverrideCategoryMixWithOthers, таким образом решая все мои проблемы, изложенные в этомвопрос.


TL; DR

Удалите вызовы prepareToPlay из вашей логики stop звукового кода.Это займет больше микросекунды, чтобы начать позже, но позволит звучать прерывания.

...