func convertBuffer(buffer: AVAudioPCMBuffer, format: AVAudioFormat) throws -> AVAudioPCMBuffer? {
   guard buffer.format != format else {
      return buffer
   }
   let converter = AVAudioConverter(from: buffer.format, to: format)
   converter?.primeMethod = .none
   guard let converter = converter else { return nil }

   // Calculate output size
   let sampleRateRatio = converter.outputFormat.sampleRate / converter.inputFormat.sampleRate
   let scaledInputFrameLength = Double(buffer.frameLength) * sampleRateRatio
   let frameCapacity = AVAudioFrameCount(scaledInputFrameLength.rounded(.up))
   guard let conversionBuffer = AVAudioPCMBuffer(pcmFormat: converter.outputFormat, frameCapacity: frameCapacity) else {
      return nil
   }
   var nsError: NSError?
   var bufferProcessed = false

   let status = converter.convert(to: conversionBuffer, error: &nsError) { packetCount, inputStatusPointer in
      defer { bufferProcessed = true }
      inputStatusPointer.pointee = bufferProcessed ? .noDataNow : .haveData
      return bufferProcessed ? nil : buffer
   }
   guard status != .error else { return nil }

   return conversionBuffer
}