AVAudioPlayer挂起整个应用程序

时间:2009-04-22 17:27:48

标签: iphone

我正在使用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,因为它比音频队列更容易使用,但我需要播放声音而不会使我的应用程序崩溃。

2 个答案:

答案 0 :(得分:0)

我找不到解决这个问题的方法。我通过使用OpenAL来解决我的声音需求。

答案 1 :(得分:0)

您是否尝试在重置currentTime之前调用stop,然后调用play?编辑你的例子:

if (player.playing) {
    [player stop];
    player.currentTime = 0;
    [player play];
} else {
    [player play];
}

我不知道是否是这种情况,但是在播放声音时重置currentTime可能会导致锁定问题。文档当然不会对此或任何事情发出警告。