Problemas técnicos audibles en la reproducción de búfer a través de AVAudioPlayerNode en iOS (Swift) * trabajando en el simulador, pero no en el dispositivo

Cuando se utiliza un AVAudioPlayerNode para progtwigr un breve búfer para que se reproduzca inmediatamente en un evento táctil ("Retocar el interior"), he notado fallas o artefactos audibles en la reproducción durante las testings. El audio no falla en absoluto en el simulador de iOS, sin embargo, hay una distorsión audible en la reproducción cuando ejecuto la aplicación en un dispositivo iOS real. La distorsión audible se produce aleatoriamente (el sonido disparado a veces sonará bien, mientras que otras veces suena distorsionado)

He intentado utilizar diferentes files de audio, formattings de file y preparar el búfer para la reproducción mediante el método prepareWithFrameCount, pero, desafortunadamente, el resultado es siempre el mismo y me estoy preguntando qué podría salir mal …

He eliminado el código a global para mayor claridad y simplicidad. Cualquier ayuda o idea sería muy apreciada. Este es mi primer bash de desarrollar una aplicación de iOS y mi primera pregunta publicada en Stack Overflow.

let filePath = NSBundle.mainBundle().pathForResource("BD_withSilence", ofType: "caf")! let fileURL: NSURL = NSURL(fileURLWithPath: filePath)! var error: NSError? let file = AVAudioFile(forReading: fileURL, error: &error) let fileFormat = file.processingFormat let frameCount = UInt32(file.length) let buffer = AVAudioPCMBuffer(PCMFormat: fileFormat, frameCapacity: frameCount) let audioEngine = AVAudioEngine() let playerNode = AVAudioPlayerNode() func startEngine() { var error: NSError? file.readIntoBuffer(buffer, error: &error) audioEngine.attachNode(playerNode) audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: buffer.format) audioEngine.prepare() func start() { var error: NSError? audioEngine.startAndReturnError(&error) } start() } startEngine() let frameCapacity = AVAudioFramePosition(buffer.frameCapacity) let frameLength = buffer.frameLength let sampleRate: Double = 44100.0 func play() { func scheduleBuffer() { playerNode.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Interrupts, completionHandler: nil) playerNode.prepareWithFrameCount(frameLength) } if playerNode.playing == false { scheduleBuffer() let time = AVAudioTime(sampleTime: frameCapacity, atRate: sampleRate) playerNode.playAtTime(time) } else { scheduleBuffer() } } // triggenetworking by a "Touch Up Inside" event on a UIButton in my ViewController @IBAction func triggerPlay(sender: AnyObject) { play() } 

Actualizar:

Ok, creo que he identificado la fuente de la distorsión: el volumen del nodo (s) es demasiado grande en la salida y causa el recorte. Al agregar estas dos líneas a mi function startEngine, la distorsión ya no se produjo:

 playerNode.volume = 0.8 audioEngine.mainMixerNode.volume = 0.8 

Sin embargo, sigo sin saber por qué tengo que bajar la salida, mi file de audio en sí no se graba. Supongo que podría ser el resultado de la implementación de AVAudioPlayerNodeBufferOptions.Interrupts. Cuando una memory intermedia interrumpe otro búfer, ¿podría haber un aumento en el volumen de salida como resultado de la interrupción, lo que provocaría un recorte de salida? Sigo buscando una comprensión sólida de por qué ocurre esto … ¡Si alguien está dispuesto / es capaz de proporcionar alguna aclaración sobre esto, sería fantástico!