Я играл с телефонными звонками во время игры (SpriteKit), чтобы проверить прерывания. Я использую пример из документации ObjectAL под названием: "Использование объектов OpenAL и OALAudioTrack" а>.
Итак, я позволяю библиотеке обрабатывать это автоматически...
[OALAudioSession sharedInstance ]. handleInterruptions = YES
И это работает, но частично. Например, при простой настройке с 3 звуками я получаю следующее сообщение об ошибке:
OALAudioSession enableAudioSession]: не удалось активировать аудиосеанс после 2 попыток: Error Domain = NSOSStatusErrorDomain Code = 561015905 «Операция не может быть завершена. (Ошибка OSStatus 561015905.)»
Error 561015905 == 0x21706C61 == !pla
и ссылаясь на ошибку, объявленную в AVAudioSession.h:
AVAudioSessionErrorCodeCannotStartPlaying = '!pla', /* 0x21706C61, 561015905
И на самом деле это работает, две неудачные попытки, третья удалась, ничего не замечаешь, потому что все быстро и вроде все работает как надо.
Я заметил, что если я добавлю больше звуков (скажем, 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 попыток. Я знаю, что могу изменить это значение, но на самом деле это не решает проблему.
Я пропустил что-то важное здесь? Я думал, что когда для свойства handleInterruptions
установлено значение YES, нам не нужно делать какие-либо ручные прерывания/обработку сеанса? Я тестирую на iPhone 6 и iOS8, если это имеет значение. Может ли кто-нибудь пролить свет на это?