Sobreposição de som com vários pressionamentos de botão

Quando pressiono um botão e pressiono outro, os sons se sobrepõem. Como posso consertar isso para que o primeiro som pare quando outro é pressionado?

- (void)playOnce:(NSString *)aSound { NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"]; AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; [theAudio setDelegate: self]; [theAudio setNumberOfLoops:0]; [theAudio setVolume:1.0]; [theAudio play]; } - (void)playLooped:(NSString *)aSound { NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"]; AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; [theAudio setDelegate: self]; // loop indefinitely [theAudio setNumberOfLoops:-1]; [theAudio setVolume:1.0]; [theAudio play]; [theAudio release]; } 

Declare seu AVAudioPlayer no header do viewController (não aloque um novo a cada vez que tocar um som). Dessa forma, você terá um ponteiro que você pode usar em um método StopAudio.

 @interface myViewController : UIViewController  { AVAudioPlayer *theAudio; } @property (nonatomic, retain) AVAudioPlayer *theAudio; @end @implementation myViewController @synthesize theAudio; - (void)dealloc { [theAudio release]; } @end - (void)playOnce:(NSString *)aSound { NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"]; if(!theAudio){ theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL]; } [theAudio setDelegate: self]; [theAudio setNumberOfLoops:0]; [theAudio setVolume:1.0]; [theAudio play]; } - (void)playLooped:(NSString *)aSound { NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"]; if(!theAudio){ theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL]; } [theAudio setDelegate: self]; // loop indefinitely [theAudio setNumberOfLoops:-1]; [theAudio setVolume:1.0]; [theAudio play]; } - (void)stopAudio { [theAudio stop]; [theAudio setCurrentTime:0]; } 

também não se esqueça de ler o Apple Docs

O código que você postou tocará apenas um som, o primeiro som enviado para o método.

Se você quiser apenas reproduzir um som alterável, depois de parar o player, solte oAudio e, em seguida, defina o novo som.

Adicione um cheque para ver se o jogador já está jogando no começo de cada método:

 if (theAudio.playing == YES) { [theAudio stop]; } 

Referência de Classe AVAudioPlayer

No seu método playOnce, a variável ‘path’ não é usada – remova isso para se livrar da sua mensagem de aviso. Seu playOnce não define nada para jogar, então não tenho certeza de como isso deve funcionar – a menos que você chame playLooped primeiro? Você também precisa estar chamando prepareToPlay após o initWithContentsOfUrl.

  - (void)playOnce:(NSString *)aSound { NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"]; if (theAudio && [theAudio isPlaying]) { [theAudio stop] } else { theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL]; [theAudio prepareToPlay]; [theAudio setDelegate: self]; [theAudio setNumberOfLoops: 1]; [theAudio setVolume: 1.0]; [theAudio play]; } } 

Você precisará utilizar um valor BOOL para que isso funcione corretamente.

no seu arquivo .m ANTES de @implementation colocar isto:

 static BOOL soundIsPlaying = NO; 

Então o seu IBAction precisa ser algo como isto:

 - (IBAction)play { if (soundIsPlaying == YES) { [theAudio release]; soundIsPlaying = NO; } else if (soundIsPlaying == NO) { NSString *path = [[NSBundle mainBundle] pathForResource:@"SOUNDFILENAME" ofType:@"wav"]; theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; theAudio.delegate = self; theAudio.volume = 1.0; theAudio.numberOfLoops = 0; [theAudio play]; soundIsPlaying = YES; } } 

isso é honestamente sobre isso. Parará os sons quando outro botão for pressionado.

Você provavelmente pode fazer algo como o seguinte:

  (void) playLooped: (NSString * ) aSound { NSString * path = [[NSBundle mainBundle] pathForResource: aSound ofType: @"caf"]; //stop audio player from playing so the sound don't overlap if([theAudio isPlaying]) { [theAudio stop]; //try this instead of stopAudio } if (!theAudio) { theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL]; } [theAudio setDelegate: self]; // loop indefinitely [theAudio setNumberOfLoops: -1]; [theAudio setVolume: 1.0]; [theAudio play]; }