проблема в воспроизведении следующей песни в avaudioplayer - PullRequest
0 голосов
/ 31 декабря 2010

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

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag
{
 if (flag == NO)
  NSLog(@"Playback finished unsuccessfully");
 else
 {
  //[player stop];
  index++;
  NSLog(@"%d",index);
  path=[[NSBundle mainBundle] pathForResource:[songlist objectAtIndex:index] ofType:@"mp3"];
  [player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
  [songlabel2 setTitle:[songlist objectAtIndex:index]];

  [endtime setText:[NSString stringWithFormat:@"%.2f",[player duration]/100]];
  [player play];
         }
}

1 Ответ

1 голос
/ 31 декабря 2010

Поскольку вы не определяете локальную переменную с именем player, я предполагаю, что player - это переменная экземпляра, которая использовалась для воспроизведения первой песни, и вы создали ее с помощью

player = [[AVAudioPlayer alloc] initWithContentsOfURL:firstSongURL error:&error];

или что-то подобное, и вы установили делегата. В вашем audioPlayerDidFinishPlaying: successfully: методе у вас есть

[player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

, что означает, что вы снова отправляете -initWithContentsOfURL:error: в тот же экземпляр. Не вызывайте инициализатор дважды для данного объекта. Результаты непредсказуемы, и существует вероятность утечки памяти. Вы должны выпустить предыдущий экземпляр AVAudioPlayer, например

[player release];

, а затем снова создайте новый экземпляр с +alloc и -initWithContentsOfURL:error:, как вы сделали с первой песней, и установите соответствующий делегат:

player = [[AVAudioPlayer alloc] initWithContentsOfURL:secondSongURL error:&error];
player.delegate = self;
[player play];
...