Обработка прерываний с помощью аудио-очереди - PullRequest
6 голосов
/ 23 марта 2009

Я разрабатываю аудио-стример и объявил прослушиватель прерываний, чтобы сохранить состояние песни, когда происходит прерывание - например, входящий звонок или смс.

Вот соответствующий код

В моем AppDelegate у меня есть это

AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, self);
AudioSessionSetActive(YES);

Так выглядит слушатель прерывания

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) {
// This callback, being outside the implementation block, needs a reference 
//to the AudioPlayer object
MyPlayer *player = (MyPlayer *)inUserData;

if (interruptionState == kAudioSessionBeginInterruption) {
    if ([player audioStreamer]) {
        // if currently playing, pause
        [player pausePlayback];
        player.interruptedOnPlayback = YES;
    }

} else if ((interruptionState == kAudioSessionEndInterruption) && player.interruptedOnPlayback) {
    // if the interruption was removed, and the app had been playing, resume playback
    [player resumePlayback];
    player.interruptedOnPlayback = NO;
}

}

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

ошибка: tca! ошибка: int: 560030580

Кто-нибудь имеет представление о том, как правильно обрабатывать прерывания звука при потоковой передаче аудиофайлов.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 23 марта 2009

Эта ссылка показывает, в чем проблема. Может помочь кому-нибудь.

https://devforums.apple.com/message/31758#31758

2 голосов
/ 26 января 2010

! Act - это kAudioSessionNotActiveError, объявленный в AudioServices.h с комментарием

"Операция не удалась, потому что AudioSession не активен. Вызов AudioSessionSetActive (true) сначала исправит эту ошибку в большинстве случаев."

Вы также получаете эту ошибку, когда вызываете AudioQueueStart () после прерывания (как я узнал сегодня).

0 голосов
/ 23 марта 2009

Мне кажется, что вы устанавливаете inUserData в качестве приложения appDelegate вместо вашего плеера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...