Donate. I desperately need donations to survive due to my health

Get paid by answering surveys Click here

Click here to donate

Remote/Work from Home jobs

Trying to record and play simultaneously using AVFoundation Swift 4.2

I am trying to record and play audio simultaneously using the playAndRecord AvAudioSessionCategory. I have found other stack overflow posts about this but they have either been outdated or don't work for the code I have written. When I just use the playback category I am able to successfully play back audio. When I set it to playAndRecord audio no longer plays. The program runs but I am met with this error during runtime:

Output will be downmixed to mono: Error Domain=NSOSStatusErrorDomain Code=-50 "(null)"

This is the code for playing the audio. It is in viewDidLoad and runs automatically when the app is opened.

recordingSession = AVAudioSession.sharedInstance()


        do {

            guard let url = Bundle.main.url(forResource: "7s_sinesweeps", withExtension: "wav") else {return}
            print( "I am going to play audio")

            try recordingSession.setCategory(AVAudioSession.Category.playAndRecord
                , mode: AVAudioSession.Mode.default)
            try recordingSession.setActive(true)
            audioPlayer = try AVAudioPlayer(contentsOf: url)

            audioPlayer?.play()
        }
        catch {
            print("error in player")
        }

I am also having issues with recording the audio, even when I just have the AVAudioSessionCategory set to record. Here is the code for recording the audio:

        do {
recordingSession.setCategory(AVAudioSession.Category.record
                , mode: AVAudioSession.Mode.default)
            try recordingSession.setActive(true)
            recordingSession.requestRecordPermission() { [unowned self] allowed in
                DispatchQueue.main.async {
                    if allowed {
                       self.beginRecording()
                    } else {
                        // failed to record!
                    }
                }
                print("I am going to record")
            }
        } catch {
            // failed to record!
        }

The method it calls is beginRecording which is included below:

func beginRecording() {

    let fileMgr = FileManager.default

    let dirPaths = fileMgr.urls(for: .documentDirectory,
                                in: .userDomainMask)

    let url = dirPaths[0].appendingPathComponent("sound.wav")

    let settings = [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 12000,
        AVNumberOfChannelsKey: 1,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ]

    do {
        audioRecorder = try AVAudioRecorder(url: url, settings: settings)
        audioRecorder.delegate = self
        audioRecorder.prepareToRecord()
        audioRecorder.record(forDuration: 1.0)

    } catch {
        return
    }
}

Comments