I am using AVAudioEngine to capture audio from macOS microphone and some other sources to mix multiple audio inputs, since the AVAudioCaptureSession does not have a feature to mix multiple inputs. Therefore, I am trying to convert the AVAudioPCMBuffer which I can obtain by installing a tap to the node of audioengine and convert it back to CMSampleBuffer. This is what I got so far.
engine.mainMixerNode.installTap(onBus: 0, bufferSize: 4096, format: format) { (buffer, time) in
var sbuf : CMSampleBuffer?
var timing = CMSampleTimingInfo(duration: CMTimeMake(value: 4096, timescale: 44100), presentationTimeStamp: .zero, decodeTimeStamp: .invalid)
let code = CMSampleBufferCreate(allocator: kCFAllocatorDefault, dataBuffer: nil, dataReady: false, makeDataReadyCallback: nil, refcon: nil, formatDescription: buffer.format.formatDescription, sampleCount: CMItemCount(4096), sampleTimingEntryCount: 1, sampleTimingArray: &timing, sampleSizeEntryCount: 0, sampleSizeArray: nil, sampleBufferOut: &sbuf)
print(code)
let status = CMSampleBufferSetDataBufferFromAudioBufferList(sbuf!, blockBufferAllocator: kCFAllocatorDefault, blockBufferMemoryAllocator: kCFAllocatorDefault, flags: 0, bufferList: buffer.audioBufferList)
print(status)
}
However, when I do print(status) it prints -12731, and the databuffer is not initialized.
I am not sure what I did wrong.