2014-11-23 13 views
5

Ich mache ein Soundboard mit Swift. Es funktioniert gut, aber ich versuche, eine Überprüfung, ob AVAudioPlayer-Instanz spielt, und wenn ja, um es zu stoppen. Die Sounds werden in einer Tabellenansicht aufgelistet, die die Daten aus einem Array abruft, in dem ich meine Sound-Klasse (mit 2 Variablen, Titel und Sound-URL) abspeichere.Schnelle Überprüfung, ob AVAudioPlayer abstürzt

Ich habe meine AVAudioPlayer und AVAudioSession sowie meine Sounds Array auf meinem Viewcontroller Klasse:

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var sounds: [Sound] = [] 

und ich die Audio-Wiedergabe implementieren, wenn die App Benutzer eine Zeile wie das wählt:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
      if audioPlayer.playing { 

       audioPlayer.stop() 
      } else { 
      var sound = self.sounds[indexPath.row] 

      var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
      var pathComponents = [baseString, sound.url] 
      var audioNSURL = NSURL.fileURLWithPathComponents(pathComponents) 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 
      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

Aber wenn ich auf die Reihe tippe die App stürzt ab und alles was ich bekomme ist "(lldb)"

Haben Sie eine Idee, was passiert? Oder mache ich das völlig falsch?

Vielen Dank im Voraus

Antwort

4

ich es herausgefunden, so dass ich mit der Gemeinde teilen:

musste ich auch die Ton NSURL Eigenschaft auf meine Viewcontroller Klasse erklären:

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var audioNSURL = NSURL() 

und auch um meinen audioPlayer auf dem ViewDidLoad Funktion vorzubereiten: (Ich musste einen Beispielton verwenden, um das AV zu initialisieren Audioplayer)

let samplePath = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4") 
audioNSURL = NSURL.fileURLWithPath(samplePath!)! 
audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
audioPlayer.prepareToPlay() 

dann auf der DidSelectRowAtIndexPath Methode, überprüfe ich, ob die AVAudioPlayer Instanz spielt und auch, wenn es spielt den Ton von der Zelle reflektiert, die angezapft wurde. Wenn ja, das Audioplayer stoppen, wenn nicht, dann die andere Ton abspielen (der Audioplayer hält und spielt die anderen Ton)

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     var sound = self.sounds[indexPath.row] 
     var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
     var pathComponents = [baseString, sound.url] 

     var rowSoundURL = NSURL.fileURLWithPathComponents(pathComponents)! 


     if audioPlayer.playing && rowSoundURL == audioNSURL { 

      audioPlayer.stop() 

     } else { 

      audioNSURL = rowSoundURL 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 

      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

bewusst sein, dass, wenn Sie auch Rekord auf Ihrer App klingt, müssen Sie die Set Session-Kategorie als AVAUDioSessionCategoryPlayback oder der Sound wird durch den kleinen Lautsprecher des Geräts gehört werden. Also, in viewWillAppear Funktion:

session.setCategory(AVAudioSessionCategoryPlayback, error: nil)