gpt4 book ai didi

swift - 为立体声音频流分配一个带有两个缓冲区的 AudioBufferList

转载 作者:搜寻专家 更新时间:2023-10-31 22:10:06 25 4
gpt4 key购买 nike

我在 C 中有以下代码,它分配了一个具有适当长度的 AudioBufferList。

  UInt32 bufferSizeBytes = bufferSizeFrames * sizeof(Float32);
propertySize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * mRecordSBD.mChannelsPerFrame);

mBufferList = (AudioBufferList *) malloc(propertySize);
mBufferList->mNumberBuffers = mRecordSBD.mChannelsPerFrame;
for(UInt32 i = 0; i < mBufferList->mNumberBuffers; ++i)
{
mBufferList->mBuffers[i].mNumberChannels = 1;
mBufferList->mBuffers[i].mDataByteSize = bufferSizeBytes;
mBufferList->mBuffers[i].mData = malloc(bufferSizeBytes);
}

大多数时候,mChannelsPerFrame 是 2,所以上面的代码创建了两个缓冲区,一个用于每个 channel 。每个缓冲区都有一个保留的内存值 bufferSizeBytes

如何在 Swift 中复制相同的行为?

最佳答案

不幸的是,在 Swift 中,一个 C 数组被视为一个元组,因此 AudioBufferList.mBuffers 被导入一个具有单个 AudioBuffer 的元组。 C 允许您通过使用指针数学(或本例中的数组下标)访问相邻内存以创建可变长度结构,而 Swift 则不允许。

AudioBufferList 不能很好地转换为 Swift。 Apple 已经通过一些辅助函数和类型缓解了这个问题。他们创建了一个静态的 allocate返回 UnsafeMutableAudioBufferListPointer 的函数这是一种特殊类型,其中下标返回 audioBuffers。

let bufferSizeBytes = MemoryLayout<Float>.size * 1234

var bufferlist = AudioBufferList.allocate(maximumBuffers: 2)
bufferlist[0] = AudioBuffer(mNumberChannels: 1,
mDataByteSize: UInt32(bufferSizeBytes),
mData: malloc(bufferSizeBytes))
bufferlist[1] = AudioBuffer(mNumberChannels: 1,
mDataByteSize: UInt32(bufferSizeBytes),
mData: malloc(bufferSizeBytes))

// Free your buffers and the pointer when you're done.
for buffer in bufferlist {
free(buffer.mData)
}
free(&bufferlist)

关于swift - 为立体声音频流分配一个带有两个缓冲区的 AudioBufferList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com