アプリは正常に動作しますが、chipmunkButton をタップするとすぐにアプリがクラッシュし、次のエラーが表示されます。
ERROR: AVAudioPlayerNode.mm:678: -[AVAudioPlayerNode scheduleFile:atTime:completionHandler:]: required condition is false: file != nil 2015-05-10 17:24:25.269 Pitch Perfect[50278:1897012] *** 終了アプリ例外 'com.apple.coreaudio.avfaudio' がキャッチされていないため、理由: '必要な条件が false: ファイル != nil' です。
import UIKit
import AVFoundation
class PlaySoundsViewController: UIViewController {
var audioRecording = AVAudioPlayer()
var receivedAudio:RecordedAudio!
var audioEngine:AVAudioEngine!
var audioFile:AVAudioFile!
func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer {
//1
var path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
var url = NSURL.fileURLWithPath(path!)
//2
var error: NSError?
//3
var audioPlayer:AVAudioPlayer?
audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
//4
return audioPlayer!
}
override func viewDidLoad() {
super.viewDidLoad()
audioRecording = AVAudioPlayer(contentsOfURL: receivedAudio.filePathUrl, error: nil)
audioRecording.enableRate = true
audioEngine = AVAudioEngine()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func slowButton(sender: UIButton) {
playButtons()
audioRecording.rate = 0.5
}
@IBAction func fastSound(sender: UIButton) {
audioRecording.rate = 2.0
playButtons()
}
@IBAction func chipmunkButton(sender: UIButton) {
playAudioWithVariablePitch(1000)
}
func playAudioWithVariablePitch(pitch: Float) {
audioRecording.stop()
audioEngine.stop()
audioEngine.reset()
var audioPlayerNode = AVAudioPlayerNode()
audioEngine.attachNode(audioPlayerNode)
var changePitchEffect = AVAudioUnitTimePitch()
changePitchEffect.pitch = pitch
audioEngine.attachNode(changePitchEffect)
audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil)
audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil)
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
audioEngine.startAndReturnError(nil)
audioPlayerNode.play()
}
@IBAction func stopButton(sender: UIButton) {
audioRecording.stop()
}
func playButtons() {
audioRecording.stop()
audioRecording.currentTime = 0
audioRecording.play()
}
}