swift swift2 avaudioplayer

Swift 2: AVAudioPlayers para reproducir mĂșltiples sonidos a la vez



swift2 (1)

Entonces oye

He estado buscando, tratando de encontrar una manera de resolver esto, pero básicamente todavía no hay soluciones para esto.

Necesito desesperadamente una forma de crear instancias y reproducir un sonido siempre que lo desee, sin que se eliminen otros sonidos. Sé que AVAudioPlayer solo puede reproducir un sonido a la vez, así que estoy tratando de descubrir cómo hacer una matriz dinámica de AVAudioPlayers que pueda agregar en cualquier momento que necesite reproducir un sonido. Mi código actual, que obtuve de una respuesta diferente en este sitio, es este:

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) } }

Lo cual, desafortunadamente, no funciona. Reproduce un sonido, pero detiene la reproducción de cualquier otro sonido.

También probé el código desde aquí, pero estoy teniendo el mismo problema que tiene el asker, y no hay solución.

Básicamente, solo necesito un fragmento de código actualizado con Swift 2, que me permita reproducir un sonido sin que se corte ningún otro sonido que se esté reproduciendo. Incluso si es el mismo efecto de sonido dos veces.


Esta pregunta parece más como si no entendiera bien las estructuras de datos de Swift, pero aquí hay un fragmento simple para seguir su camino:

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) } } }