AVAudioPlayer不会重复播放

use*_*370 6 audio cocoa-touch objective-c avaudioplayer ios

我有一个相对简单的应用程序播放声音使用AVAudioPlayer,像这样:

NSURL *file3 = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ball_bounce.aiff", [[NSBundle mainBundle] resourcePath]]];
player3 = [[AVAudioPlayer alloc] initWithContentsOfURL:file3 error:nil];
[player3 prepareToPlay];
Run Code Online (Sandbox Code Playgroud)

后来被叫去玩,像这样:

[player3 play];
Run Code Online (Sandbox Code Playgroud)

但是这种声音在多个地方被调用(与弹跳球碰撞)很多次.有时,球会以足够快的速度击中两个东西,当第二次碰撞时,第一次弹跳的声音仍在播放.第二次弹跳然后不会发出声音.每次碰撞时如何让它发出声音,即使它涉及发出的声音与已播放的声音重叠?

任何帮助是极大的赞赏.

Jac*_*kin 3

解决此问题的一种方法是,AVAudioPlayer如果前一个实例已经在播放,则创建一个新实例:

if([player3 isPlaying]) {
   AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[player3 url]];
   [newPlayer setDelegate:self];
   [newPlayer play];
}
Run Code Online (Sandbox Code Playgroud)

然后,在委托方法中audioPlayerDidFinishPlaying:successfully:,您应该向玩家发送消息-release

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
   if(player != player3) {
      [player release];
   }
}
Run Code Online (Sandbox Code Playgroud)

这就是它必须的方式,因为您确实需要为每个并发声音播放一个新的源缓冲区。:(