Воспроизведение записанного аудио только в том случае, если AVAudioPlayer имеет значение из AVAudioRecorder - PullRequest
0 голосов
/ 30 апреля 2018

Я бы хотел убедиться, что кнопка отключена, если нет записанного звука, чтобы приложение не зависало из-за того, что 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)
}

}
...