Swift/문법
[SWIFT]UnsafeMutablePointer<AudioBufferList> to AVAudioPCMBuffer
삽질중
2023. 7. 25. 10:08
extension UnsafeMutablePointer where Pointee == AudioBufferList {
func toPCMBuffer(format: inout AudioStreamBasicDescription) -> AVAudioPCMBuffer? {
guard let format = AVAudioFormat(streamDescription: &format) else {
return nil
}
let mBuffers = pointee.mBuffers
guard let mData = mBuffers.mData else {
return nil
}
let data = Data(bytes: mData, count: Int(mBuffers.mDataByteSize))
let streamDesc = format.streamDescription.pointee
let frameCapacity = UInt32(data.count) / streamDesc.mBytesPerFrame
guard let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: frameCapacity) else {
return nil
}
buffer.frameLength = buffer.frameCapacity
data.withUnsafeBytes { bufferPointer in
guard let address = bufferPointer.baseAddress else {
return
}
mData.copyMemory(from: address, byteCount: Int(mBuffers.mDataByteSize))
}
return buffer
}
}
[사용방법]
//let audioBufferList: UnsafeMutablePointer<AudioBufferList>?
var streamDesc = AudioStreamBasicDescription()
let bytesPerSample: UInt32 = UInt32(MemoryLayout<Int16>.size) // 2
streamDesc.mFormatID = kAudioFormatLinearPCM
streamDesc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked //kLinearPCMFormatFlagIsPacked
streamDesc.mBytesPerPacket = bytesPerSample// 2
streamDesc.mFramesPerPacket = 1
streamDesc.mBytesPerFrame = bytesPerSample //2
streamDesc.mChannelsPerFrame = 1 // 1
streamDesc.mBitsPerChannel = 8 * bytesPerSample
streamDesc.mSampleRate = 48000 //44100
let localPcmBuffer = audioBufferList?.toPCMBuffer(format: &streamDesc)