Я бы хотел убедиться, что кнопка отключена, если нет записанного звука, чтобы приложение не зависало из-за того, что AVAudioPlayer был равен нулю.
var soundPlayer1 = AVAudioPlayer()
Так я объявляю и инициализирую аудиоплеер.
В функции viewDidLoad () я хочу условие, что когда я записываю что-то в AVAudioRecorder и устанавливаю это в AVAudioPlayer, мое состояние сможет проверить это и включить кнопку воспроизведения (если ничего не записано, то кнопка воспроизведения будет отключена).
Я пробовал несколько встроенных функций, связанных с AVAudioPlayer и AVAudioRecorder, чтобы увидеть, какие значения остаются постоянными до и после записи, но они либо не помогают мне (не изменяя до и после записи), либо создают поток 1: предположительно EXC_BAD_ACCESS потому что AVAudioPlayer не был инициализирован ни к какому аудио.
Любая помощь очень ценится. Спасибо!
РЕДАКТИРОВАТЬ 1
Извините, забыл код!
import UIKit
import AVFoundation
var url : NSURL!
var screenCounter = 0
var soundPlayer1 = AVAudioPlayer()
class Screen1: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {
@IBOutlet weak var recordBtn: UIButton!
@IBOutlet weak var playBtn: UIButton!
var soundRecorder : AVAudioRecorder!
var fileName = "audioFile0.aac"
override open func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override open func viewDidLoad() {
super.viewDidLoad()
if (screenCounter == 0){
setupRecorder()
playBtn.isEnabled = false
}
screenCounter += 1
}
func setupRecorder(){
let recordSettings = [ AVFormatIDKey : kAudioFormatMPEG4AAC
, AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, AVEncoderBitRateKey : 320000, AVNumberOfChannelsKey : 2, AVSampleRateKey : 44100.0 ] as [String : Any]
let _ : NSError?
let audioSession = AVAudioSession.sharedInstance()
do{
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
}catch{
print(error)
}
let url1 = getFileURL()
do{
soundRecorder = try AVAudioRecorder(url: url1 as URL, settings : recordSettings)
}catch{
print("Something went wrong")
}
soundRecorder.delegate = self
soundRecorder.prepareToRecord()
}
func getCacheDirectory() -> URL{
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
func getFileURL() -> NSURL{
let pathURL = getCacheDirectory().appendingPathComponent(fileName)
let pathString = pathURL.path
let filePath = NSURL(fileURLWithPath : pathString)
return filePath
}
@IBAction func record(_ sender: UIButton) {
if sender.titleLabel?.text == "Record"{
setupRecorder()
soundRecorder.deleteRecording()
soundRecorder.record()
sender.setTitle("Stop", for : .normal)
playBtn.isEnabled = false
}else{
soundRecorder.stop()
sender.setTitle("Record", for : .normal)
playBtn.isEnabled = false
}
}
@IBAction func playSound(_ sender: UIButton) {
if sender.titleLabel?.text == "Play"{
recordBtn.isEnabled = false
sender.setTitle("Stop", for : .normal)
preparePlayer()
soundPlayer1.play()
}else{
soundPlayer1.stop()
sender.setTitle("Play", for : .normal)
}
}
func preparePlayer(){
let _ : NSError?
let url = getFileURL()
do{
soundPlayer1 = try AVAudioPlayer(contentsOf : url as URL)
}catch{
print(error)
}
soundPlayer1.delegate = self
soundPlayer1.prepareToPlay()
soundPlayer1.volume = 1.0 //Adjust volume here
}
open func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
playBtn.isEnabled = true
}
open func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
recordBtn.isEnabled = true
playBtn.setTitle("Play", for : .normal)
}
}