2014-12-07 2 views
8

У меня есть эта функция, что я приношу к жизни в первой сцене:Swift Sound на повторе

func ThemeSound() { 
     if let path = NSBundle.mainBundle().pathForResource("InfinityThemeMain", ofType: "wav") { 
      let enemy1sound = NSURL(fileURLWithPath:path) 
      println(enemy1sound) 

      var error:NSError? 
      ThemePlayer = AVAudioPlayer(contentsOfURL: enemy1sound, error: &error) 
      ThemePlayer.prepareToPlay() 
      ThemePlayer.play() 
     } 
    } 

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

runAction(SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock(ThemePlayer), SKAction.waitForDuration(2.55)])) 

Но я не могу вставить в ViewController, потому что для запуска приложения требуется дочерний элемент. Как бы я мог это сделать?

ответ

20

Просто установите для свойства numberOfLoops отрицательное число.

ThemePlayer.numberOfLoops = -1 

От the documentation:

numberOfLoops количество раз звук возвращается к началу, при достижении конца, чтобы повторить воспроизведение.

...

вар numberOfLoops: Int

...

Значение 0, который является по умолчанию, значит воспроизводить звук один раз. Установите положительное целочисленное значение, чтобы указать количество раз, чтобы вернуться к началу и воспроизвести снова. Например, при задании значения 1 получается в общей сложности две пьесы звука. Установите любое отрицательное целочисленное значение, чтобы закодировать звук бесконечно, пока не назовете метод остановки.

Возможно, вам также понадобится make your AVAudioPlayer a property, rather than a local variable. Как бы то ни было, с автоматическим подсчетом ссылок, я думаю, что ваш локальный экземпляр ThemePlayer скорее всего будет освобожден ARC. Кто-то, кто знает AVAudioPlayer лучше меня, может прокомментировать это.

(Кстати, вы можете следовать соглашению от Apple именования экземпляров объектов, начиная с прописными буквами, например themePlayer, а не ThemePlayer. Это сделает ваш код проще для других людей, чтобы читать.)

+0

спасибо, это сработало! – Betkowski

+0

Обязательно используйте формат m4a, поскольку это позволяет избежать слышимого промежутка между повторениями. Преобразование поддерживается на OSX, как описано здесь: http://osxdaily.com/2011/07/30/convert-audio-to-m4a-mac-os-x-lion/ – nontomatic

+0

@nontomatic Когда я конвертирую его в m4a, установка числаOfLoops на -1 не делает его повторением. Пожалуйста помоги! Завтра у меня будет школьный проект ( – Alex

0

Я делаю это повторить с помощью Timer() вот мой код:

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var player = AVAudioPlayer() 

    var timer = Timer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



    @IBAction func play(_ sender: UIButton) { 

     // var player = AVAudioPlayer() 


     let soundURL = Bundle.main.url(forResource: "beeb", withExtension: "wav") 

     do { 
      player = try AVAudioPlayer(contentsOf: soundURL!) 
     } catch { 
      print("No sound found by URL") 
     } 



     alertation(title: "click stop to stop", msg: "") 


    } 


    func alertation(title:String,msg:String) 
    { 

     player.play() 
     self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { (timer) in 
      self.player.play() 
     }) 



     var alert = UIAlertController(title: title, message: msg, preferredStyle: .alert) 
     var stop = alert.addAction(UIAlertAction(title: "STOP", style: .default, handler: { (action) in 

      self.player.stop() 
      self.timer.invalidate() 

     })) 


     self.present(alert, animated: true, completion: nil) 

    } 



}