代码之家  ›  专栏  ›  技术社区  ›  pgb

avaudioplayer挂起整个应用程序

  •  0
  • pgb  · 技术社区  · 17 年前

    我正在使用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 回复  |  直到 16 年前
        1
  •  0
  •   pgb    17 年前

    我找不到解决这个问题的方法。我用Openal来满足我的声音需求。

        2
  •  0
  •   Bdebeez    16 年前

    在重新设置当前时间,然后调用Play之前,您是否尝试过调用Stop?编辑示例:

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

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