Я использую AVAudioPlayer для воспроизведения звуковых эффектов в игре для iPhone.
Это часть моего кода:
AVAudioPlayer *player = [dict objectForKey:@"Player"];
if (player.playing) {
player.currentTime = 0;
} else {
[player play];
}
Один звук, который можно воспроизводить многократно и очень часто, поскольку он воспроизводится на основе взаимодействия с пользователем. Когда пользователь двигает пальцем, я несколько раз вызываю этот фрагмент кода.
Если вы это сделаете, приложение зависнет, и это ошибка, которую я получаю в журнале сбоев:
0 libSystem.B.dylib 0x3146bb18 semaphore_timedwait_signal_trap + 8
1 libSystem.B.dylib 0x3146297c semaphore_timedwait_signal + 8
2 libSystem.B.dylib 0x3145f0fe _pthread_cond_wait + 898
3 libSystem.B.dylib 0x3145f25a pthread_cond_timedwait_relative_np + 10
4 AudioToolbox 0x348ddd50 CAGuard::WaitFor(unsigned long long) + 116
5 AudioToolbox 0x3491b94c ClientAudioQueue::ServicePendingCallbacks() + 232
6 AudioToolbox 0x3491ba60 AudioQueueReset + 44
7 AVFoundation 0x34d16668 -[AVAudioPlayer setCurrentTime:] + 444
Это выглядит как проблема с блокировкой внутри AVAudioPlayer, и я не смог ее решить. Я пробовал с разными звуковыми форматами (CAFF и IMA4), и оба не сработали одинаково.
Есть указатель? Я действительно хотел бы придерживаться AVAudioPlayer, поскольку его гораздо проще использовать, чем Audio Queues, но мне нужны звуки для воспроизведения, а не для сбоя приложения.