AVAudioEngine player node excessive delay

I am trying to use AVAudioEngine for listening to mic samples and playing them simultaneously via external speaker or headphones (assuming they are attached to iOS device). I tried the following using AVAudioPlayerNode and it works, but there is too much delay in the audio playback. Is there a way to hear sound realtime without delay? Why the scheduleBuffer API has so much delay I wonder.

var engine: AVAudioEngine!
var playerNode: AVAudioPlayerNode!
var mixer: AVAudioMixerNode!
var audioEngineRunning = false

public func setupAudioEngine() {
    
    self.engine = AVAudioEngine()
   
    let input = engine.inputNode
    let format = input.inputFormat(forBus: 0)
    
    playerNode = AVAudioPlayerNode()
    engine.attach(playerNode)
  
    self.mixer = engine.mainMixerNode
    
    engine.connect(self.playerNode, to: self.mixer, format: playerNode.outputFormat(forBus: 0))
    
    engine.inputNode.installTap(onBus: 0, bufferSize: 4096, format: format, block: { buffer, time in
        self.playerNode.scheduleBuffer(buffer, completionHandler: nil)
    })
    
    do {
        engine.prepare()
        try self.engine.start()
        audioEngineRunning = true
        
        self.playerNode.play()
    }
    catch {
        print("error couldn't start engine")
        audioEngineRunning = false
    }
    
}
AVAudioEngine player node excessive delay
 
 
Q