私は何週間も実際に何が起こったのか把握しようとしていましたが、なぜ中断後に再生を続けることができないのかわからないので、おそらく皆さんは答えを知っています。 AudioSessionSetActive(TRUE)は、アプリがバックグラウンドで再生され、別のアプリに入っている場合、再アクティブ化中に常に '!cat'を返します。これはkAudioSessionIncompatibleCategoryです。それはうまく動作し、私のアプリで中断したときに再生を続ける。
元のコードは、実際にはすべてのAudioSessionとAudioQueue呼び出しがエラーを意味する場合にはOSStatusを出力するマクロにラップされていますが、読みやすくするために削除しました。また、[self pause]は一時停止をトグルするだけなので、基本的にはupauseで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");
}
}
このストリーマーのソースコードは、 https:// bitbucket .org /と/ amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.m が問題を解決するのに役立ちます。