AVAudioPlayer вызывает только audioPlayerDidFinishPlaying дважды - PullRequest
0 голосов
/ 22 августа 2011

Я пытаюсь создать некий аудио-плейлист с помощью AVAudioPlayer.Поэтому я использовал следующий код:

.h

<AVAudioPlayerDelegate>
{
    AVAudioPlayer *audioPlayer;
}

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

.m

@synthesize audioPlayer;

 - (void)viewDidLoad 
{
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    audioPlayer.numberOfLoops = 0;
    audioPlayer.delegate = self;
    [audioPlayer play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag)
    {
        [player release];

        currentSong = currentSong + 1;
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[songs objectAtIndex:currentSong] ofType:@"mp3"]];

        artist.text = [artists objectAtIndex:currentSong];
        song.text = [songs objectAtIndex:currentSong];

        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

        audioPlayer.delegate = self;
        audioPlayer.numberOfLoops = 0;

        [audioPlayer initWithContentsOfURL:url error:nil];
        [audioPlayer play];
    }
}

Это работает для двух песен, но после этого нет звука.Есть идеи, почему это так?

Спасибо, Денис

Ответы [ 2 ]

1 голос
/ 22 августа 2011

В этой строке вы запускаете аудиоплеер:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

Затем вы запускаете его снова в этой строке (ненужное дублирование и, возможно, дополнительное сохранение):

 [audioPlayer initWithContentsOfURL:url error:nil];

Затем в следующий раз, когда цикл возобновится, даже если вы отпустите его, используя строку

[player release];

… возникает проблема, поскольку она все еще находится в памяти, связывая аппаратный кодек или тратя ресурсы.Попробуйте удалить вторую строку initWithContents…, так как она не нужна.

0 голосов
/ 22 августа 2011

1. Просто сохраняйте массив.
2. После создания экземпляра audioPlayer - добавьте в массив и вызовите play, а затем отпустите экземпляр audioPlayer (поскольку он будет сохранен после добавления в массив).
3.В audioPlayerDidFinishPlaying удалите audioPlayer из этого массива.

Таким образом, вы можете воспроизводить несколько файлов одновременно

...