AVAudioEngineを用いて、録音したいのですが、

AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default

と設定すると、iPhoneの上のスピーカーからしか音声が出ないため、
optionsに .defaultToSpeaker を追加したいのですが、 .defaultToSpeaker を追加すると音声が録音されません。

解決策をご存知の方はいないでしょうか?

以下は書いたコードの全容です。

final class RecordEngine {
    private var engine: AVAudioEngine!
    private var mixer: AVAudioMixerNode!
    private var player: AVAudioPlayerNode!
    private var outputFile: AVAudioFile!

    let session = AVAudioSession.sharedInstance()

    init() {
        prepareAVAudioSession()
        prepareNodes()
        prepare()
    }

    func start() {
        try! engine.start()
    }

    func stop() {
        engine.pause()
        engine.reset()
    }

    private func prepareAVAudioSession() {
        do {
//            try session.setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth, .allowBluetoothA2DP])
            try session.setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
            try session.setActive(true)
        } catch {

        }
    }

    private func prepareNodes() {
        engine = AVAudioEngine()
        mixer = AVAudioMixerNode()
        player = AVAudioPlayerNode()
        engine.attach(mixer)
        engine.attach(player)
    }

    private func prepare() {
        let input = engine.inputNode
        let mainMixer = engine.mainMixerNode

        let format = input.outputFormat(forBus: 0)
        engine.connect(player, to: mainMixer, format: format)
        engine.connect(input, to: mixer, format: format)
    }

    func startRecord() {
        start()

        let format = mixer.outputFormat(forBus: 0)
        let outputFileURL = URL(string: NSTemporaryDirectory() + "temp.caf")!

        do {
            outputFile = try AVAudioFile(forWriting: outputFileURL, settings: format.settings)
        } catch {
            print(error)
        }

        mixer.installTap(onBus: 0, bufferSize: 1024, format: format) { [weak self] buffer, when in
            do {
                try self?.outputFile.write(from: buffer)
            } catch {
                print(error)
            }
        }
    }

    func stopRecord() {
        mixer.removeTap(onBus: 0)
        print(outputFile)
        stop()
    }

    func startPlaying() {
        start()

        player.scheduleFile(outputFile, at: nil) {
            print("complete")
        }

        player.play()
    }

    func pausePlaying() {
        player.pause()
    }
}