中断をテストするために、(SpriteKit)ゲームの実行中に電話で遊んでいます。「OpenAL オブジェクトと OALAudioTrack の使用」という ObjectAL ドキュメントの例を使用しています。
だから、ライブラリにこれを自動的に処理させます...
[OALAudioSession sharedInstance ]. handleInterruptions = YES
そしてそれは部分的にしか機能しません。たとえば、3 つのサウンドを使用した単純なセットアップでは、次のエラー メッセージが表示されます。
OALAudioSession activateAudioSession]: 2 回試行した後、オーディオ セッションをアクティブにできませんでした: エラー ドメイン = NSOSStatusErrorDomain コード = 561015905 「操作を完了できませんでした。(OSStatus エラー 561015905。)」
Error 561015905 == 0x21706C61 == !pla
、および AVAudioSession.h で宣言されたエラーを参照します。
AVAudioSessionErrorCodeCannotStartPlaying = '!pla', /* 0x21706C61, 561015905
実際、これは機能します。2 回失敗し、3 回目は成功しました。すべてが高速で、すべてが正常に機能しているように見えるため、何も気付かれません。
さらにサウンドを追加すると (20 としましょう)、同じメッセージが表示されることに気付きました。
20 回試行した後、オーディオ セッションをアクティブ化できませんでした:
その後、セッションがアクティブになります。次に、関連するメソッドにデバッグ メッセージを追加しました。
OALAudioSession.m
- (void) activateAudioSession
{
NSError* error;
for(int try = 1; try <= kMaxSessionActivationRetries; try++)
{
if([[AVAudioSession sharedInstance] setActive:YES error:&error])
{
NSLog(@"Session activated after %d", try);
audioSessionActive = YES;
return;
}
OAL_LOG_ERROR(@"Could not activate audio session after %d tries: %@", try, error);
[NSThread sleepForTimeInterval:0.2];
}
OAL_LOG_ERROR(@"Failed to activate the audio session");
}
したがって、最後に、20回の試行に失敗した後、「21回の試行後にセッションがアクティブになりました」というメッセージが表示されます
ただし、kMaxSessionActivationRetries が 40 に設定されているため、試行回数が許可されている 40 回を簡単に超える可能性があるため、サウンドの再生は最終的に「中断」します。この値を変更できることは承知していますが、実際には問題は解決しません。
ここで重要な何かが欠けていますか? プロパティが YES に設定されている場合handleInterruptions
、手動の中断/セッション処理を行う必要はないと思いましたか? 問題がある場合は、iPhone 6 と iOS8 でテストしています。誰かがこれに光を当てることができますか?