2014-11-23 8 views
5

Sto facendo una tavola armonica con Swift. Funziona alla grande, ma sto cercando di verificare se l'istanza di AVAudioPlayer è in esecuzione, e se sì per fermarlo. I suoni sono elencati in una tableview che ottiene i dati da una matrice in cui memorizzo la mia classe Sound (che ha 2 variabili, titolo e url del suono).Controllo rapido se AVAudioPlayer sta giocando in crash

ho il mio AVAudioPlayer e AVAudioSession così come i miei suoni serie sulla mia classe ViewController:

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

ed a implementare la riproduzione audio quando l'utente applicazione seleziona una riga del genere:

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) 

    } 

Ma quando tocco la riga l'app si arresta in modo anomalo e tutto quello che sto ottenendo è "(lldb)"

Hai idea di cosa sta succedendo? O sto sbagliando tutto questo?

Grazie in anticipo

risposta

4

ho capito, quindi ho condividere con la comunità:

ho dovuto anche dichiarare la proprietà NSURL suono sul mio ViewController Classe:

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

e anche per preparare il mio audioPlayer sulla funzione ViewDidLoad: (Ho dovuto usare un suono di esempio per inizializzare l'AV AudioPlayer)

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

poi, sul metodo didSelectRowAtIndexPath, ho verificare se l'istanza AVAudioPlayer sta giocando e anche se è la riproduzione del suono riflesso dalla cellula che è stato sfruttato. Se sì, fermare l'audioplayer, se poi non riprodurre l'altro suono (l'Audioplayer si ferma e suona l'altro suono)

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) 

    } 

essere consapevoli del fatto che, se anche registrare suoni sul vostro app, è necessario impostare la categoria di sessione come AVAUdioSessionCategoryPlayback o il suono verrà ascoltato attraverso il piccolo altoparlante del dispositivo. Quindi, nella funzione viewWillAppear:

session.setCategory(AVAudioSessionCategoryPlayback, error: nil)