2016-04-05 1 views
0

У меня есть AVAudioPlayer в отдельном классе, который я загружаю в ViewController. Вот код:AVAudioPlayer не воспроизводит звук?

import Foundation 
import AVFoundation 

class SoundController { 

    var audioPlayer: AVAudioPlayer! 

    init() { 
    } 

    func playAudio() { 
     let path = NSBundle.mainBundle().pathForResource("ring-ring", ofType: "aiff", inDirectory: "Media")! 
     let url = NSURL(fileURLWithPath: path) 

     do { 
      print("Let's play the sound") 
      let sound = try AVAudioPlayer(contentsOfURL: url) 
      self.audioPlayer = sound 
      sound.play() 
     } catch { 
      print("Error playing sound file") 
     } 
    } 
} 

А вот ViewController

override func viewDidLoad() { 
     super.viewDidLoad() 

     let sound = SoundController() 
     sound.playAudio() 
    } 

Все компилирует и я получаю консольный вывод «Давайте играть звук», но независимо от того, какое устройство я испытываю, звук Безразлично Не играй. Какие-нибудь советы, что не так?

+1

какой объект хранит ваш «звук»? в этом коде нет такой вещи, поэтому «звук» будет выпущен сразу же после того, как «-viewDidLoad» выйдет из области, даже если вы можете услышать что-то. – holex

+0

что это за фикс здесь? – Tronic

+0

возможно, понимание того, как работает ARC .... что может помочь решить текущую проблему для вас за секунду; потому что в этом случае вы сохранили бы сильный указатель где-то вне области действия, и экземпляр класса SoundController не будет выпущен сразу после создания экземпляра. – holex

ответ

0

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

import Foundation 
import AVFoundation 
var audioPlayer: AVAudioPlayer! 

class SoundController { 
    class func playAudio() { 
     let path = NSBundle.mainBundle().pathForResource("ring-ring", ofType: "aiff", inDirectory: "Media")! 
     let url = NSURL(fileURLWithPath: path) 

     do { 
      print("Let's play the sound") 
      audioPlayer = try AVAudioPlayer(contentsOfURL: url) 
      audioPlayer.prepareToPlay() 
     } catch { 
      print("Error playing sound file") 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    SoundController.playAudio() 
    audioPlayer.play() 
} 
+0

спасибо за подсказку, но я хочу, чтобы SoundController был в отдельном классе-файле. можете ли вы изменить свой код следующим образом? – Tronic

+0

ну просто скопируйте весь класс SoundController в другой файл. (строка 5-18) :) – Eric