2011-06-18 16 views
6

Tengo una aplicación relativamente simple que reproduce un sonido usando AVAudioPlayer, así:AVAudioPlayer no se reproducirá repetidamente

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

a ser llamado más tarde para jugar, así:

[player3 play]; 

Pero este sonido se llama en múltiples lugares (colisiones con una pelota que rebota), muchas veces. A veces, la pelota golpea dos cosas en una sucesión lo suficientemente rápida donde el sonido del primer rebote sigue sonando cuando la pelota colisiona por segunda vez. Este segundo rebote no produce un sonido. ¿Cómo puedo hacer que reproduzca un sonido cada vez que colisiona, incluso si implica pagar un sonido que se superpone a un sonido que ya se está reproduciendo?

Cualquier ayuda es muy apreciada.

Respuesta

3

Una forma de resolver este problema sería que crear una nueva instancia de AVAudioPlayer si el anterior ya se está reproduciendo:

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

Luego, en el método delegado audioPlayerDidFinishPlaying:successfully:, usted debe enviar al jugador el mensaje -release :

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

Ésta es sólo la forma en que tiene que ser, como usted no necesita un nuevo buffer fuente de sonido para cada juego simultáneo. :(

0

Es un viejo hilo, pero tal vez alguien puede beneficiarse de esta respuesta. La creación de AVAudioPlayer en repetidas ocasiones puede ser una carga para la aplicación y puede crea retardos. En este caso se puede usar SystemSound.

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

Desventaja de esta solución, no puede ajustar el volumen.

Cuestiones relacionadas