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

+ Recent posts