2014-10-10 1 views
1

Я создал класс объекта AVAudioPlayer ниже, для того, чтобы играть шум:AVAudioPlayer Объект Звук не играет - Swift

class MusicAudio: NSObject, AVAudioPlayerDelegate { 

    var bassAudio : AVAudioPlayer! = AVAudioPlayer() 

    override init() { 
     super.init() 
     let bassAudioPath  = NSBundle.mainBundle().pathForResource("Raw", ofType:"mp3") 

     let fileURL = NSURL(fileURLWithPath: bassAudioPath!) 
     bassAudio = AVAudioPlayer(contentsOfURL: fileURL, error: nil) 
     bassAudio.currentTime = 0 
     bassAudio.volume = 1.0 
     bassAudio.delegate = self 
    } 

    func adjustAudioLayerState(volumeOn:Bool, layer:AudioLayerState) { 

     if layer == AudioLayerState.Bass { 
      self.bassAudio.prepareToPlay() 
      self.bassAudio.play() 
     } 
    } 
} 

Чтобы играть шум, я называю класс с помощью:

@IBAction func testSound() { 
    var sound:MusicAudio = MusicAudio() 
    sound.adjustAudioLayerState(true, layer: AudioLayerState.Bass) 

} 

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

Edit: После ответа rdelmar

var bassAudio : AVAudioPlayer! = AVAudioPlayer() 

class MusicAudio: NSObject, AVAudioPlayerDelegate { 

    override init() { 
     super.init() 
     let bassAudioPath  = NSBundle.mainBundle().pathForResource("Raw", ofType:"mp3") 

     let fileURL = NSURL(fileURLWithPath: bassAudioPath!) 
     bassAudio = AVAudioPlayer(contentsOfURL: fileURL, error: nil) 
     bassAudio.currentTime = 0 
     bassAudio.volume = 1.0 
     bassAudio.delegate = self 
    } 

    func adjustAudioLayerState(volumeOn:Bool, layer:AudioLayerState) { 

     if layer == AudioLayerState.Bass { 
      self.bassAudio.prepareToPlay() 
      self.bassAudio.play() 
     } 
    } 
} 

ответ

4

Вы не получаете никакого звука, потому что ваш класс MusicAudio в настоящее время освобождаться. Вам нужно сделать var, sound, свойство, а не локальную переменную.

class ViewController: UIViewController { 

    var sound = MusicAudio() 

    @IBAction func testSound() { 
     self.sound.adjustAudioLayerState(true, layer: AudioLayerState.Bass) 
    } 

} 
+0

Это устранило проблему, однако исправление (см изменить в вопросе) в моей голове, кажется, грязный - есть более подходящий способ я должен делать это в Swift или я параноик? – Ryan

+0

@Ryan, я ничего не вижу в вашем редактировании, отличном от того, что вы изначально разместили. Изменения должны быть в классе контроллера вида, где у вас есть IBAction. – rdelmar

+0

О, я вижу !, в моем редактировании я переместил «var bassAudio: AVAudioPlayer! = AVAudioPlayer()» вне самого класса вверху (что также устранило проблему). Я реализовал то, что вы имели в виду, и теперь это работает :) – Ryan