Звук перекрывается несколькими нажатиями кнопок - PullRequest
0 голосов
/ 12 ноября 2011

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

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


    }

Ответы [ 6 ]

0 голосов
/ 19 декабря 2011

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

    }   
}

Вот честно об этом.При нажатии другой кнопки звуки прекратятся.

0 голосов
/ 12 ноября 2011

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

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

Описание класса AVAudioPlayer

0 голосов
/ 12 ноября 2011

В вашем методе playOnce переменная 'path' не используется - удалите ее, чтобы избавиться от предупреждающего сообщения.Ваш 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];
  }

}
0 голосов
/ 12 ноября 2011

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

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

0 голосов
/ 11 ноября 2011

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

    (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];
}
0 голосов
/ 11 ноября 2011

Объявите ваш 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 Docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...