Итак, в моем приложении, работающем на iOS 6, все работает отлично с аудио. Я использую старый формат API C, чтобы перехватывать прерывания с помощью обратного вызова; с помощью: AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, (__bridge void *)self)
, и это было здорово. Однако, используя SDK iOS 7, кажется, что мой обратный вызов прерывания никогда не вызывается, когда устройство принимает вызовы или отключается сигнализация.Прерывания AVAudioSession
После некоторого осмотра я слышал, что старые C api были устаревшими и что вы должны перейти к новым функциям AVAudioSession. Более подробное чтение показало, что делегат AVAudioSession устарел и что вы должны использовать NSNotification
для AVAudioSessionInterruptionNotification
, чтобы перехватывать прерывания и делать все, что нужно сделать.
Для меня кажется, что это уведомление никогда не срабатывает, и поэтому я никогда не получаю должным образом прерывание, которое затем прерывает все мои аудиоматериалы после завершения вызова.
подписаться на уведомления следующим образом:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AudioInterruption:) name:AVAudioSessionInterruptionNotification object:nil];
В настоящем время, функция AudioInterruption:
просто регистрирует, что он был уволен. Ни журнал, ни точки останова не запускаются.
Чтобы быть ясным, изначально воспроизведение и запись звука работают нормально. Когда происходит прерывание (например, входящий вызов или сигнал тревоги), уведомление об отключении не запускается. Если требуется дополнительный код, сообщите мне.
Как раз в том случае, если я вручную отправляю сообщение «AVAudioSessionInterruptionNotification», то мои наблюдатели запускают, так что это работает. По-прежнему не знаю, почему система не отправляет уведомление. – Doc
Вы установили режим AVAudioSession и назвали 'setActive'? – imihaly
Да, в противном случае звук не воспроизводится на начальном этапе, что и происходит.'[session setMode: AVAudioSessionModeVoiceChat error: & error]' и '[[AVAudioSession sharedInstance] setActive: YES error: & activationError]'. Я устанавливаю режим перед добавлением наблюдателя и активирую его позже, хотя это не имеет значения (?). – Doc