Why is AVAudioEngine input giving all zero samples?

I am trying to get access to raw audio samples from mic. I've written a simple example application that writes the values to a text file.

Below is my sample application. All the input samples from the buffers connected to the input tap is zero. What am I doing wrong?

I did add the Privacy - Microphone Usage Description key to my application target properties and I am allowing microphone access when the application launches. I do find it strange that I have to provide permission every time even though in Settings > Privacy, my application is listed as one of the applications allowed to access the microphone.

class AudioRecorder {
  private let audioEngine = AVAudioEngine()
  private var fileHandle: FileHandle?
  
  func startRecording() {
    let inputNode = audioEngine.inputNode
    
    let audioFormat: AVAudioFormat
#if os(iOS)
    let hardwareSampleRate = AVAudioSession.sharedInstance().sampleRate
    audioFormat = AVAudioFormat(standardFormatWithSampleRate: hardwareSampleRate, channels: 1)!
#elseif os(macOS)
    audioFormat = inputNode.inputFormat(forBus: 0) // Use input node's current format
#endif
    
    setupTextFile()
    
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: audioFormat) { [weak self] buffer, _ in
      self!.processAudioBuffer(buffer: buffer)
    }
    
    do {
      try audioEngine.start()
      print("Recording started with format: \(audioFormat)")
    } catch {
      print("Failed to start audio engine: \(error.localizedDescription)")
    }
  }
  
  func stopRecording() {
    audioEngine.stop()
    audioEngine.inputNode.removeTap(onBus: 0)
    print("Recording stopped.")
  }
  
  private func setupTextFile() {
    let tempDir = FileManager.default.temporaryDirectory
    let textFileURL = tempDir.appendingPathComponent("audioData.txt")
    
    FileManager.default.createFile(atPath: textFileURL.path, contents: nil, attributes: nil)
    
    fileHandle = try? FileHandle(forWritingTo: textFileURL)
  }
  
  private func processAudioBuffer(buffer: AVAudioPCMBuffer) {
    guard let channelData = buffer.floatChannelData else { return }
    
    let channelSamples = channelData[0]
    let frameLength = Int(buffer.frameLength)
    
    var textData = ""
    var allZero = true
    for i in 0..<frameLength {
      let sample = channelSamples[i]
      if sample != 0 {
        allZero = false
      }
      textData += "\(sample)\n"
    }
    
    if allZero {
      print("Got \(frameLength) worth of audio data on \(buffer.stride) channels. All data is zero.")
    } else {
      print("Got \(frameLength) worth of audio data on \(buffer.stride) channels.")
    }
    
    // Write to file
    if let data = textData.data(using: .utf8) {
      fileHandle!.write(data)
    }
  }
}
Why is AVAudioEngine input giving all zero samples?
 
 
Q