简体   繁体   中英

EZAudio doesnt work: Thread1 EXC_BAD_ACCESS while creating EZRecorder instance

My complete implementation of EZAudio :

class ViewController: UIViewController, EZMicrophoneDelegate, EZRecorderDelegate {

    @IBOutlet var recordingAudioPlot: EZAudioPlot!

    private var isRecording = false {

        didSet {

            if isRecording {

                player.pause()
                recordingAudioPlot.clear()
                microphone.startFetchingAudio()
                recorder = EZRecorder(url: filePathUrl(), clientFormat: microphone.audioStreamBasicDescription(), fileType: EZRecorderFileType.M4A, delegate: self) 
                // ** Here is where the error occurs **

            } else {

                recorder.delegate = nil
                microphone.stopFetchingAudio()
                recorder.closeAudioFile()

                player.playAudioFile(EZAudioFile(url: filePathUrl()))
            }
        }
    }
    private var microphone = EZMicrophone()
    private var recorder = EZRecorder()
    private var player = EZAudioPlayer()

    @IBAction func startStopRecordingButtonTapped(_ sender: UIButton) {
        isRecording = !isRecording
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let session = AVAudioSession.sharedInstance()
        try! session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try! session.setActive(true)

        microphone.delegate = self

        try! session.overrideOutputAudioPort(.speaker)
    }

    func microphone(_ microphone: EZMicrophone!, hasAudioReceived buffer: UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

        DispatchQueue.main.async {
            self.recordingAudioPlot.updateBuffer(buffer[0], withBufferSize: bufferSize)
        }
    }

    func microphone(_ microphone: EZMicrophone!, hasBufferList bufferList: UnsafeMutablePointer<AudioBufferList>!, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

        if isRecording {
            recorder.appendData(from: bufferList, withBufferSize: bufferSize)
        }
    }

    private func filePathUrl() -> URL {

        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first ?? ""

        return URL(fileURLWithPath: String(format: "%@/%@", path, "pathtofile.m4a"))
    }
}

The error is following:

在此处输入图片说明 What goes wrong?

The solution is to declare recorder as optional type, not an instance:

private var recorder: EZRecorder?

Something happens when first time it tries to deallocate first initialized recorder... but now there is nil so the error doesn't exist anymore.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM