2013-11-07 5 views
12

Итак, в моем приложении, работающем на 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: просто регистрирует, что он был уволен. Ни журнал, ни точки останова не запускаются.

Чтобы быть ясным, изначально воспроизведение и запись звука работают нормально. Когда происходит прерывание (например, входящий вызов или сигнал тревоги), уведомление об отключении не запускается. Если требуется дополнительный код, сообщите мне.

+0

Как раз в том случае, если я вручную отправляю сообщение «AVAudioSessionInterruptionNotification», то мои наблюдатели запускают, так что это работает. По-прежнему не знаю, почему система не отправляет уведомление. – Doc

+0

Вы установили режим AVAudioSession и назвали 'setActive'? – imihaly

+0

Да, в противном случае звук не воспроизводится на начальном этапе, что и происходит.'[session setMode: AVAudioSessionModeVoiceChat error: & error]' и '[[AVAudioSession sharedInstance] setActive: YES error: & activationError]'. Я устанавливаю режим перед добавлением наблюдателя и активирую его позже, хотя это не имеет значения (?). – Doc

ответ

9

У вас есть экземпляр AVCaptureSession в вашем приложении?
Если это так, то я хотел бы предложить тот же самый ответ, который я получил на мой вопрос связан:
Попытка установить НЕТ к свойству вашего AVCaptureSession например usesApplicationAudioSession.
Это свойство, доступное с iOS 7. В предыдущих версиях iOS каждый AVCaptureSession использовал частный AVAudioSession. Начиная с iOS 7, Capture Sessions используют AVAudioSession совместно используемого приложения.
Свойство включено по умолчанию, поэтому, если вы хотите сохранить прежнее поведение, вы должны отключить его, установив NO.

Я надеюсь, что это сработает и для вас.

+0

Я попробую в понедельник (или если я получу возможность в выходные, я наткнусь на офис, чтобы попробовать это раньше). Пересечение пальцев ~ – Doc

+1

Это исправило мою проблему! Большое спасибо за помощь (и помните, чтобы ответить на этот вопрос после получения ваших собственных)! – Doc

+4

что делать, если [у меня нет] (http://stackoverflow.com/q/24205304/1387438) 'AVCaptureSession'? Будет ли это работать, если я создаю фиктивный объект «AVCaptureSession» (без добавленных входов/выходов)? –

1

Вы не передали экземпляр AVAudioSession в свой вызов addObserver в качестве последнего параметра.

Попробуйте это:

AVAudioSession *session = [AVAudioSession sharedInstance]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(AudioInterruption:) 
              name:AVAudioSessionInterruptionNotification 
              object:session]; 
+7

Передача сеанса не требуется, это просто мешает наблюдателю получать уведомления от других объектов. На всякий случай, я отредактировал мой код для передачи в сеансе вместо nil, не помог. Спасибо за предложение. – Doc

-1

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

Смежные вопросы