2015-09-27 3 views
0

Я делаю простую задачу из курса Udacity (Pitch Perfect)Swift. Звук не воспроизводится во второй раз

У меня есть один экран, где я записываю звук. После записи я сохраняю файл и передаю его на второй экран.

На втором экране у меня есть несколько кнопок, которые воспроизводят звук по-разному. Там у меня есть функция, которая воспроизводит звук.

Дело в том, что когда я впервые нахожу эту функцию, звук воспроизводится, но во второй раз звук отсутствует.

Я застрял.

func playSoundWithPitchRate(pitch: Float) { 

    self.audioPlayer.stop() 
    self.audioEngine.stop() 
    self.audioEngine.reset() 

    let audioPlayerNode = AVAudioPlayerNode() 
    self.audioEngine.attachNode(audioPlayerNode) 

    let changePitchEffect = AVAudioUnitTimePitch() 
    changePitchEffect.pitch = pitch 
    self.audioEngine.attachNode(changePitchEffect) 

    self.audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil) 
    self.audioEngine.connect(changePitchEffect, to: self.audioEngine.outputNode, format: nil) 

    let audioFileBuffer = AVAudioPCMBuffer(PCMFormat: self.audioFile.processingFormat, frameCapacity: AVAudioFrameCount(self.audioFile.length)) 

    do{ 
     try self.audioFile.readIntoBuffer(audioFileBuffer) 
    } catch let err as NSError { 
     print("self.audioFile.readIntoBuffer(audioFileBuffer)") 
     print(err.localizedDescription) 
    } 

    audioPlayerNode.scheduleBuffer(audioFileBuffer, atTime: nil, options: .Interrupts) {() -> Void in 

     // reminder: we're not on the main thread in here 
     dispatch_async(dispatch_get_main_queue()) { 
      self.stopPlayButton.enabled = false 
      self.makeSoundEffectButtonsEnabled(true) 
     } 

    } 

    do { 
     try audioEngine.start() 
    } catch let err as NSError { 
     print("audioEngine.start()") 
     print(err.localizedDescription) 
    } 

    audioPlayerNode.play() 

} 

ответ

0

Решено. Я прочитал документ и понял, что там, где ваш файл для чтения в буфер

self.audioFile.readIntoBuffer(audioFileBuffer) 

положение кадра файлов продвигаются по количеству кадров для чтения.

Так что в следующий раз не было никаких кадров для чтения. Поэтому я сбросил положение рамки, как это

self.audioFile.framePosition = 0 

Надеюсь, это поможет кому-то.