Как audioPlayerDidFinishPlaying узнает, какой файл закончен? - PullRequest
1 голос
/ 17 марта 2011

Я использую AVAudioPlayer для воспроизведения 15 аудиофайлов.Аудио файлы должны быть воспроизведены в наборах по 5, причем каждый набор имеет три файла.Три файла в наборе не меняются.Порядок воспроизведения наборов может измениться.

Я попытался использовать цикл while с isPlaying следующим образом:

while ([backgroundSound isPlaying]) {
    NSLog(@"First while loop");
}
backgroundSoundPath = [[NSBundle mainBundle] pathForResource:@"Set0File1" ofType:@"mp3"]; // *Music filename* 
backgroundSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:backgroundSoundPath] error:nil];
[backgroundSound prepareToPlay];
[backgroundSound play];
while ([backgroundSound isPlaying]) {
    NSLog(@"Second while loop");
}
backgroundSoundPath = [[NSBundle mainBundle] pathForResource:@"Set0File2" ofType:@"mp3"]; // *Music filename* 
backgroundSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:backgroundSoundPath] error:nil];
[backgroundSound prepareToPlay];
[backgroundSound play];
while ([backgroundSound isPlaying]) {
    NSLog(@"Third while loop");
} 

Теперь я понимаю, что это не так с побочным эффектом, заключающимся в том, чтоВесь пользовательский интерфейс заблокирован на время воспроизведения файла.

Я знаю, что должен использовать:

  • (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) проигрыватель успешно: (BOOL) flag

Но я не знаю, как audioPlayerDidFinishPlaying должен точно знать, какой файл завершил воспроизведение.

Я подумал, что это может быть как - (void) animationDidStop, где вы можете использоватьзначениеForKeyPath, чтобы выяснить, какой файл закончил воспроизведение.

Нужно ли отслеживать его вручную?

Буду признателен за любые предложения указать мне правильное направление.

Спасибо.

1 Ответ

8 голосов
/ 17 марта 2011

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

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
     if ([player.url isEqual:url1])
     {
         // file which is in url1 stopped playing
     }
     else if ([player.url isEqual:url2])
     {
         // file which is in url2 stopped playing
     }
}
...