Как изменить или отключить AudioSessionInterruptionListener

Мне нужен способ изменить или отключить AudioSessionInterruptionListener после инициализации AudioSession.

И вот почему: в некоторых случаях мое приложение должно работать в фоновом режиме с записью звука, поэтому установлен режим фонового звука — это работает. Когда происходит вызов или другое прерывание, я должен сообщить некоторым другим объектам, чтобы они полностью остановили запись - это работает. Затем, когда приложение завершает работу с AudioSession, я вызываю AudioSessionSetActive(false); - это работает (если приложение отправляется в фоновый режим с активным сеансом, я получаю красную полосу вверху, если сеанс неактивен, красная полоса не появляется , хотя, я думаю, технически приложение все еще находится в "активном" фоновом режиме).

Тем не мение! В случае, если я закончил запись, и приложение было отправлено в фоновый режим, а аудиосеанс уже деактивирован, если поступает вызов или активируется Siri, мое приложение по-прежнему получает обратный вызов AudioSessionInterruptionListener. Да, я могу добавить код, чтобы проверить, должно ли мое приложение в настоящее время реагировать на прерывания. Однако я вижу в этом ошибку. Если я деактивировал AudioSession, прерывания должны перестать вызываться, фактически все слушатели аудиосессии/свойства должны перестать вызываться.

Как я могу изменить или отключить AudioSessionInterruptionListener? Или, может быть, еще один способ спросить об этом: как я могу запретить моему приложению «использовать» фоновый режим, когда он ему не нужен?

Дополнительная информация

Хорошо, кажется, что в iOS 6 теперь есть NSNotifications для прерываний AudioSession: AVAudioSessionDidBeginInterruptionNotification и AVAudioSessionDidEndInterruptionNotification. Однако я поддерживаю iOS 5.1 и выше, поэтому это не помогает. И в той же документации, где я нашел новые уведомления, говорится, что свойство делегата для интерфейса Obj-C AVAudioSession устарело (в IOS 6), поэтому мне, вероятно, не следует использовать это для установки/изменения делегата (и получения Obj -C прерывать обратные вызовы).

Я предполагаю, что возможный обходной путь - проверить версию iOS, а в версии 6.0 установить и отключить делегат, а затем в версии 6.0+ прослушать NSNotifications (которые не появятся в версии 6.0, поэтому не должны ломаться). Тем не менее, это похоже на кладж.


person Adam Jones    schedule 13.03.2013    source источник
comment
Это была такая боль. Я имею дело с этим сейчас, и, поскольку я использую C API, у меня еще больше боли.   -  person kakyo    schedule 02.07.2013


Ответы (1)


Вы пытались вызвать AudioSessionInitialize и передать NULL в AudioSessionInterruptionListener (то есть функцию, которая будет обрабатывать прерывание), когда вы закончите с этим?

Интерфейс выглядит следующим образом:

   OSStatus AudioSessionInitialize (
       CFRunLoopRef                      inRunLoop,
       CFStringRef                       inRunLoopMode,
       AudioSessionInterruptionListener  inInterruptionListener,
       void                              *inClientData
);

В документации прямо сказано:

Ваше приложение должно вызывать эту функцию перед любыми другими вызовами Audio Session Services. Вы можете активировать и деактивировать аудиосеанс по мере необходимости (см. AudioSessionSetActive), но инициализировать его следует только один раз.

person rmigneco    schedule 17.07.2013
comment
Я уверен, что я пытался вызвать AudioSessionInitialize один раз, чтобы активировать его (с заполненным параметром Listener), а затем я снова вызвал его с NULL для параметра Listener, когда я хотел прекратить прослушивание - это не помогло. Это было разочаровывающей частью - я не мог заставить его ОСТАНОВИТЬ вызов Слушателя. Мне все еще нужно вызвать AVAudioSession setDelegate:nil (который устарел в 6), чтобы остановить прерывания, и setDelegate:self, чтобы снова включить прерывания. Я еще раз вернусь к этому коду теперь, когда мой последний тестер переходит с iOS 5. - person Adam Jones; 17.07.2013
comment
Интересная проблема. Похоже, должна быть функция интерфейса в стиле C для деинициализации сеанса и прослушивателя прерываний. - person rmigneco; 17.07.2013