Я пытался выяснить, что на самом деле происходит в течение нескольких недель, и я понятия не имею, почему я не могу продолжить воспроизведение после прерывания, так что, вероятно, вы, ребята, знаете ответ.AudioSessionSetActive (TRUE) всегда возвращает '! Cat', которая является kAudioSessionIncompatibleCategory при повторной активации, если мое приложение воспроизводится в фоновом режиме, а я нахожусь в другом приложении.Хотя он работает нормально и продолжает воспроизведение, если я обнаружил прерывание, находясь в моем приложении.
В оригинальном коде все вызовы AudioSession и AudioQueue заключены в макросы, которые выводят OSStatus, если это означает ошибку, но я удалил его для лучшей читаемости.Кроме того, [self pause] просто переключает паузу, поэтому в основном она вызывает AudioQueueStart (audioQueue, NULL) для upause, но не работает, если AudioSession завершается неудачно.
Код инициализации Audio Session:
AudioSessionInitialize(NULL, NULL, _audioSessionInterruptionListener, self);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, _audioSessionPropertyListener, self);
AudioSessionSetActive(TRUE);
Код обработчика прерывания:
- (void)handleInterruptionChangeToState:(AudioQueuePropertyID)inInterruptionState
{
if(inInterruptionState == kAudioSessionBeginInterruption)
{
NSLog(@"+Interruption");
if(self.state == NX_STATE_PLAY)
{
[self pause];
AudioSessionSetActive(FALSE);
isPausedByInterruption = YES;
}
}
else if(inInterruptionState == kAudioSessionEndInterruption)
{
if(isPausedByInterruption)
{
AudioSessionSetActive(TRUE);
[self pause];
isPausedByInterruption = FALSE;
}
NSLog(@"-Interruption");
}
}
Этот исходный код стримера можно найти здесь https://bitbucket.org/and/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.m, если это поможет каким-либо образом решить проблему ..