私は何週間も実際に何が起こっているのかを理解しようとしていましたが、中断後に再生を続行できない理由がわからないので、おそらく答えを知っているでしょう. AudioSessionSetActive(TRUE) は、アプリがバックグラウンドで再生され、別のアプリにいる場合、再アクティブ化中に kAudioSessionIncompatibleCategory である '!cat' を常に返します。アプリの使用中に中断が発生した場合でも、問題なく動作し、再生を続けます。
元のコードには、実際にはすべての AudioSession および AudioQueue 呼び出しが、エラーを意味する場合に OSStatus を出力するマクロでラップされていますが、読みやすくするために削除しました。また、[セルフポーズ]は一時停止を切り替えるだけなので、基本的には休止時に AudioQueueStart(audioQueue, NULL) を呼び出しますが、AudioSessionが失敗した場合はもちろん機能しません。
オーディオ セッションの初期化コード:
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");
}
}