import Cocoa
import AVFoundation
class ViewController: NSViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {
var recordButton: NSButton!
var playButton: NSButton!
var pauseButton: NSButton!
var audioPlayer : AVAudioPlayer = AVAudioPlayer()
let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")
private var audioRecorder : AVAudioRecorder!
override func viewDidLoad() {
super.viewDidLoad()
recordButton = NSButton(title: "Strar Record", target: self, action: #selector(recordTapped(_:)))
recordButton.frame = CGRect(x: 50, y: 100, width: 160, height: 50)
self.view.addSubview(recordButton)
playButton = NSButton(title: "Play", target: self, action: #selector(playAudio(_:)))
playButton.frame = CGRect(x: 230, y: 100, width: 100, height: 50)
self.view.addSubview(playButton)
pauseButton = NSButton(title: "Pause", target: self, action: #selector(pauseAudio(_:)))
pauseButton.frame = CGRect(x: 350, y: 100, width: 100, height: 50)
self.view.addSubview(pauseButton)
}
override var representedObject: Any? {
didSet {
}
}
}
extension ViewController{
@objc private func recordTapped(_ btn: NSButton){
if audioRecorder == nil {
startRecording()
} else {
finishRecording(success: true)
}
}
@objc private func playAudio(_ sender: Any) {
self.audioPlayer.play()
}
@objc private func pauseAudio(_ sender: Any) {
self.audioPlayer.pause()
}
private func playAudio(forResource: String, ofType: String){
let url = audioFilename
do {
try audioPlayer = AVAudioPlayer(contentsOf: url)
audioPlayer.delegate = self
audioPlayer.prepareToPlay()
} catch let error as NSError {
print("audioPlayer error \(error.localizedDescription)")
}
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
extension ViewController {
private func startRecording() {
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.delegate = self
audioRecorder.record()
recordButton.title = "Stop Record"
} catch {
finishRecording(success: false)
}
}
private func finishRecording(success: Bool) {
audioRecorder.stop()
audioRecorder = nil
if success {
recordButton.title = "success,start Record"
print(audioFilename)
playAudio(forResource: "recording", ofType: "m4a")
} else {
recordButton.title = "fail,start Record"
}
}
}