我正在使用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,因为它比音频队列更容易使用,但我需要播放声音而不会使我的应用程序崩溃。
答案 0 :(得分:0)
我找不到解决这个问题的方法。我通过使用OpenAL来解决我的声音需求。
答案 1 :(得分:0)
您是否尝试在重置currentTime之前调用stop,然后调用play?编辑你的例子:
if (player.playing) {
[player stop];
player.currentTime = 0;
[player play];
} else {
[player play];
}
我不知道是否是这种情况,但是在播放声音时重置currentTime可能会导致锁定问题。文档当然不会对此或任何事情发出警告。