Наложение звука при нескольких нажатиях кнопок

#iphone #ios4 #audio

#iPhone #ios4 #память #Аудио

Вопрос:

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

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


    }
  

Комментарии:

1. Вам действительно нужно задать вопрос.

2. мой вопрос в том, что когда я нажимаю на одну кнопку, она воспроизводит звуки, но затем я нажимаю другую, и они перекрываются

3. вы можете выполнить одно из следующих действий: 1. после нажатия кнопки проверьте, продолжает ли воспроизведение AVAudioPlayer. если да, вы можете проигнорировать это и ничего не делать или 2, вы можете остановить это, а затем воспроизвести новый звук.

4. — (недействительный)playOnce:(NSString *)aSound;

5. — (IBAction) beatButton50 { [self playOnce:@»racecars»]; }

Ответ №1:

Объявите свой AVAudioPlayer в заголовке ViewController (не выделяйте новый при каждом воспроизведении звука). Таким образом, у вас будет указатель, который вы сможете использовать в методе StopAudio.

 @interface myViewController : UIViewController <AVAudioPlayerDelegate> { 
    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

Комментарии:

1. как мне создать AVAudioPlayer в файле заголовка я новичок в этом и многого не знаю

2. я добавил эти строки кодов, и звуки все еще перекрываются

3. просто отредактировал код выше. можете ли вы описать, чего вы пытаетесь достичь более подробно?

4. я создаю приложение, в котором примерно 20 кнопок, и каждая из них воспроизводит свой звук, но звуки перекрываются, когда я нажимаю на другие кнопки

5. Затем остановите AVAudioPlayer перед воспроизведением следующего звука.

Ответ №2:

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

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

Комментарии:

1. как мне отключить звук и установить новый

Ответ №3:

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

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

Ссылка на класс AVAudioPlayer

Ответ №4:

В вашем методе playOnce переменная ‘path’ не используется — удалите ее, чтобы избавиться от вашего предупреждающего сообщения. Ваш playOnce ничего не настраивает для воспроизведения, поэтому я не уверен, как это должно работать — если вы сначала не вызовете playLooped? Вы также должны вызывать prepareToPlay после initWithContentsOfURL.

  - (void)playOnce:(NSString *)aSound {

  NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
  if (theAudio amp;amp; [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];
  }

}
  

Комментарии:

1. я удалил строку playLoop, потому что она мне действительно не была нужна, и я удалил строку path, но звук по-прежнему не воспроизводится

2. Добавить prepareToPlay, вы пробовали это? Вам действительно нужно вызвать код, который у вас есть в playLoop, чтобы настроить AVAudioPlayer.

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

4. Ах, верно, я понимаю, о чем ты говоришь. Я думаю, вам нужно проверить, есть ли у вас другой звук, и перезагрузить проигрыватель в этом случае.

5. у меня есть код для всех кнопок, но как мне увидеть, воспроизводится ли у меня другой звук, и перезагрузить проигрыватель Я новичок в программировании, поэтому я мало что знаю

Ответ №5:

Вам нужно будет использовать значение 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;

    }   
}
  

честно говоря, это все. При нажатии другой кнопки звуки прекращаются.

Ответ №6:

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

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

Комментарии:

1. это говорит мне, что stopAudio не найден

2. странно, что звук все еще перекрывается, когда я нажимаю несколько кнопок

3. вы поменяли код и убедились, что вызывается [Остановка прослушивания]?

4. как мне изменить код, должен ли я его выпустить, я новичок в программировании, все еще пытаюсь учиться