2015-10-28 2 views
1

Я пишу простой плеер в быстром использовании AVFoundation framework. Кажется, что все работает, за исключением того, что мой плеер снова и снова играет одну и ту же песню. У меня есть только одна песня в моем списке воспроизведения, так что это имеет смысл. то, что я пытаюсь сделать, это проверить флаг audioPlayerDidFinishPlaying, чтобы убедиться, что это сделано, а затем я остановлюсь. Я не уверен, как реализовать вызов, чтобы получить флаг здесь, это мой код.audioPlayerDidFinishPlaying функция в SWIFT

mp3Player?.play() 
    **if (mp3Player?.audioPlayerDidFinishPlaying:successfully) {** 
    mp3Player?.stop() 
} 

правильный способ получить флаг в Objective C является:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
NSLog(@"audioPlayerDidFinishPlaying"); 
} 

Может кто-нибудь объяснить, как реализовать ту же функцию в SWIFT? Это моя первая программа в SWIFT. Я пробовал читать о недействительных функциях в SWIFT, но не повезло.

ошибка я получаю не удается преобразовать значение типа «» AVAudioPlayer.Type ожидаемого типа аргумента «AVAudioPlayer»

ответ

5

Вы можете перепроверить, что в то время как начать играть множество аудио numberOfLoops к 0 и delegate установлен в self или контроллер, в котором играет ваш плеер.

mp3Player?.numberOfLoops = 0 
    mp3Player?.delegate = self 

В том же классе реализации delegate метод AVAudioPlayer как, как показано ниже.

func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) { 
    //You can stop the audio 
    player.stop() 

} 
+0

спасибо. Теперь это имеет гораздо больший смысл. Я просто добавил player.stop() в audioPlayerDidFinishPlaying, и программа работает по назначению. – Sophman

0

Я смог реализовать решение внутри класса mp3-плеера следующим образом.

func audioPlayerDidFinishPlaying(player: AVAudioPlayer, 
    successfully flag: Bool){ 
     if flag == true { 
     ++self.numberOfLoops 
     GlobalVariables.NumberOfLoops = numberOfLoops 
     numberOfLoopsReq = GlobalVariables.NumberOfLoopsRequired 
     player.stop() 
     if numberOfLoops < numberOfLoopsReq { 
       // delay before and play 
       let delay = GlobalVariables.DelayBeforeSong * Double(NSEC_PER_SEC)// nanoseconds per second 
       let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
       dispatch_after(delayTime, dispatch_get_main_queue(),{ 
        self.player!.play() 
        }) 
              } 
              } 
Смежные вопросы