2016-05-04 4 views
4

So heySwift 2: AVAudioPlayers mehrere Töne auf einmal

Ich habe gesucht, um zu spielen, versuchen, einen Weg zu finden, diese zu lösen, aber es gibt im Grunde keine Lösungen für diese noch.

Ich brauche dringend einen Weg zu instanziieren und einen Sound zu spielen, wann immer ich will, ohne dass es andere Sounds ausschneiden. Ich weiß, dass AVAudioPlayer nur einen Ton gleichzeitig abspielen kann, also versuche ich herauszufinden, wie man ein dynamisches Array von AVAudioPlayern erstellt, die ich jederzeit hinzufügen kann, wenn ich einen Ton abspielen möchte. Mein aktueller Code, dass ich aus einer anderen Antwort auf dieser Seite bekam, ist dies:

func Sound(sound: String) { 
    do { 
     if let bundle = NSBundle.mainBundle().pathForResource(sound, ofType: "wav") { 
      let alertSound = NSURL(fileURLWithPath: bundle) 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 
      try AVAudioSession.sharedInstance().setActive(true) 
      try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } 
    } catch { 
     print(error) 
    } 


} 

, die leider nicht funktioniert. Es spielt einen Ton ab, stoppt jedoch jeden anderen Ton vom Abspielen.

I've also tried the code from here, but I'm having the same problem the asker is having, and there's no solution.

Grundsätzlich Ich brauche nur einen Code-Schnipsel, die mit Swift 2 auf dem neuesten Stand ist, die mich einen Ton spielen können, ohne sie schneiden andere Töne aus, die zu spielen sind. Auch wenn es zweimal der gleiche Klangeffekt ist.

+2

Ein Spieler spielt einen Ton. Wenn du zwei Sounds gleichzeitig willst, benutze zwei Spieler. :) – Moritz

+0

ja! ICH KENNE! Das Problem, das ich habe, ist mit einem Array von AVAudioPlayers, so dass ich mehrere Sounds gleichzeitig spielen kann. Siehe: der Link, den ich unten gepostet habe. – Varkarrus

Antwort

8

Diese Frage klingt eher wie Sie nicht ganz ein Verständnis für Swift-Datenstrukturen haben, aber hier ist ein einfaches Snippet Sie auf Ihrem Weg zu bekommen:

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var arrayOfPlayers = [AVAudioPlayer]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     sound("tester") 
     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))) 
     dispatch_after(delayTime, dispatch_get_main_queue()) { 
      self.sound("tester") 
     } 

    } 

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

    func sound(sound: String) { 
     do { 
      if let bundle = NSBundle.mainBundle().pathForResource(sound, ofType: "wav") { 
       let alertSound = NSURL(fileURLWithPath: bundle) 
       try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 
       try AVAudioSession.sharedInstance().setActive(true) 
       let audioPlayer = try AVAudioPlayer(contentsOfURL: alertSound) 
       arrayOfPlayers.append(audioPlayer) 
       arrayOfPlayers.last?.prepareToPlay() 
       arrayOfPlayers.last?.play() 
      } 
     } catch { 
      print(error) 
     } 


    } 

} 
+0

Also habe ich es tatsächlich herausgefunden, zum Teil dank dem. Ich habe tatsächlich ein Verständnis für Datenstrukturen, es wurden nur die AVAudioPlayer nicht von der Liste entfernt, aber ich hatte eine Idee. Die magische Codezeile stellte sich in der Update-Funktion meines Spiels als "arrayOfPlayers = arrayOfPlayers.filter() {$ 0.playing}" heraus. Dadurch löste ich automatisch das Array von Spielern, die nicht mehr spielten, also würde ich kein Limit erreichen und aufhören, Sounds zu spielen. – Varkarrus

+0

Cool, froh zu hören. – diatrevolo

+0

Große Antwort! Vielen Dank! –