2011-06-18 68 views
6

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

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

到后来被称为玩,就像这样:

[player3 play]; 

但这个声音被多次调用(与弹跳球碰撞)。有时,球在连续快速击中两件事情时,第一次反弹的声音仍然在第二次碰撞时发挥作用。然后这第二次反弹不会产生声音。即使它涉及支付与已经播放的声音重叠的声音,我怎样才能让它在每次碰撞时发出声音?

任何帮助是极大的赞赏。要解决这个问题

回答

3

办法之一是要创建的AVAudioPlayer一个新实例,如果前一个正在播放:

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

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

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

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

0

这是一个古老的线程,但也许有人可以受益于这种答案。创建AVAudioPlayer反复可以为应用程序的负担,并且可以创建滞后。在这种情况下,你可以使用SystemSound。

NSString *pathToMySound = [[NSBundle mainBundle] pathForResource:@"yourMusic" ofType:@"mp3"]; 
SystemSoundID soundID; 
AudioServicesCreateSystemSoundID((__bridge CFURLRef)([NSURL fileURLWithPath: pathToMySound]), &soundID); 
AudioServicesPlaySystemSound(soundID); 

此解决方案的缺点是,您无法调整音量。