Звук перекрывается несколькими нажатиями кнопок

Когда я нажимаю кнопку, затем нажимаю другую, звуки перекрываются. Как я могу это исправить, поэтому первый звук останавливается при нажатии другого?

- (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]; } 

Объявите свой AVAudioPlayer в заголовке viewController (не выделяйте новый каждый раз, когда вы воспроизводите звук). Таким образом, у вас будет указатель, который вы можете использовать в методе 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]; } 

также обязательно прочитайте Apple Docs

Код, который вы опубликовали, будет воспроизводить только один звук, первый звук, отправленный методу.

Если вы хотите играть только один сменный звук, после остановки проигрывателя отпустите Audio, а затем установите новый звук.

Добавьте чек, чтобы узнать, играет ли игрок в начале каждого метода:

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

Ссылка на class AVAudioPlayer

В вашем методе playOnce переменная «путь» не используется – удалите это, чтобы избавиться от вашего предупреждающего сообщения. Ваш playOnce ничего не устанавливает, чтобы играть, поэтому я не уверен, как это должно работать – если вы сначала не вызовете playLooped? Вам также необходимо вызвать prepareToPlay после 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]; } } 

Вам нужно будет утилизировать значение BOOL, чтобы оно работало правильно.

в вашем .m файле ПЕРЕД @implementation поставьте это:

 static BOOL soundIsPlaying = NO; 

Тогда ваш IBAction должен выглядеть примерно так:

 - (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; } } 

Честно говоря, об этом. Он останавливает звук при нажатии другой кнопки.

Возможно, вы можете сделать что-то вроде следующего:

  (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]; } 
  • Как получить размер объекта в памяти?
  • java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет VM - Android
  • Получение максимальной пропускной способности на Haswell в кеше L1: получение только 62%
  • EditText вызывает утечку памяти
  • Почему размер кеша L1 меньше, чем размер кэша L2 на большинстве процессоров?
  • Как работают free и malloc в C?
  • Как многомерные массивы отформатированы в памяти?
  • Как узнать использование памяти моего приложения в Android?
  • Разработка iPhone - Имитация памяти
  • Как происходит «переполнение стека» и как вы его предотвращаете?
  • Шаги в процессе выделения памяти для объектов Java
  • Давайте будем гением компьютера.