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)'Swift > 문법' 카테고리의 다른 글
| [SWIFT]Array zip (0) | 2023.07.25 |
|---|---|
| [SWIFT]enum 파라메터형 / if case 문 (0) | 2023.07.25 |
| [SWIFT]Tuples (0) | 2023.07.25 |
| [SWIFT]Array (0) | 2023.07.25 |
| [SWIFT]알고리즘 별 해시값 생성 (MD2,4,5/SHA) (0) | 2023.07.24 |