Аудиоплеер решает проблему с игрой!Iphone SDK - PullRequest
0 голосов
/ 09 мая 2011

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

-(IBAction) ... {
   for ( ...) {
     if (compare(Output, N1)) {
       songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
     }
     if (compare(Output, N2)) {
       songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
     }
     audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: songPath] error:NULL];
                [audioPlayer setDelegate:self];
                [audioPlayer play];
   }
}


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
  NSLog(@"Song FINISHED!!!!!!");
  [player release];
}

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Как только пользователь нажимает кнопку, воспроизводится аудиопроигрыватель, но создается впечатление, что если звук не закончен и пользователь снова его нажимает, создается другой объект аудиопроигрывателя с другой ссылкой на аудиофайл. Это позволяет воспроизводить два или даже более звука одновременно. Ну, решение простое. Просто установите флажок, чтобы видеть каждый раз, когда нажимается кнопка, если проигрыватель уже воспроизводится, если это так, остановите проигрыватель и отпустите и создайте новый экземпляр с новой ссылкой на файл. Чтобы сделать это, вы должны синтезировать audioPlayer и использовать его как,

-(IBAction) ... {
   for ( ...) {
   if (compare(Output, N1)) {
     songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
   }
   if (compare(Output, N2)) {
     songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
   }
   if(self.audioPlayer){
     self.audioPlayer.delegate=nil;
     self.audioPlayer=nil;
    }
   self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:
                           [NSURL fileURLWithPath: songPath] error:NULL];
   [self.audioPlayer setDelegate:self];
   [self.audioPlayer play];
  }
 }


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
     NSLog(@"Song FINISHED!!!!!!");
     [self.audioPlayer setDelegate:nil];   
     self.audioPlayer=nil; 
  }
0 голосов
/ 09 мая 2011

Ваш код не совсем понятен, но я думаю, что понимаю вашу цель.

Для его реализации, скажем, у вас есть NSArray *itemsToPlay.В самом начале (т. Е. Когда пользователь нажимает на вашу кнопку), он заполняется всеми вашими звуками.

После того, как пользователь нажимает кнопку, вызывается IBAction.Там вы выбираете первый звук из itemsToPlay (и удаляете его из этого контейнера) и говорите audioPlayer играть.

После того, как игрок закончил играть, вызывается audioPlayerDidFinishPlaying:successfully:.Там вы снова выбираете первый предмет из itemsToPlay и заново запускаете свой audioPlayer с ним.Снова, скажите audioPlayer, чтобы играть.

Этот цикл закончится, когда itemsToPlay пуст.

...