gpt4 book ai didi

ios - 在 Swift 中使用 AudioBufferList

转载 作者:IT王子 更新时间:2023-10-29 05:16:57 24 4
gpt4 key购买 nike

我在 Swift 中有一个桥接函数,它在 C 中的参数之一是 AudioBufferList * .在 Swift 中,这会生成一个 UnsafePointer<AudioBufferList>。 .我设法通过调用 audioData[0] 来引用指针(有没有更好的办法?)。但我正在为接下来的两层而苦苦挣扎:.mBuffers AudioBuffer 的数组的和他们的 void */UnsafePointer<()> .mData成员。

在 C 中它只是

Float32 *audioData = (Float 32*)abl->mBuffers[0]->mData;
output = audioData[sampleNum]...

在 Swift 中,第一个奇怪的事情是它不允许我访问 mBuffers 的元素。但是当我将它作为属性(property)访问时,我非常高兴。换句话说,这有效,甚至有正确的数据(我认为是 mBuffers 的第一个成员)...

println(abl[0].mBuffers.mNumberChannels)  // But .mBuffers should be an []!

其次,它让我打印出 .mData下标,但值始终为 ()

println(abl[0].mBuffers.mData[10])  // Prints '()'

我尝试了各种转换操作并使用多个索引进行访问,但无济于事……有什么想法吗?

这里是 AudioBufferList 的 C 和 Swift 定义和 AudioBuffer为了方便...

// C
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
// ...and a bit more for c++
}


struct AudioBuffer
{
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
};

...

// SWIFT

struct AudioBufferList {
var mNumberBuffers: UInt32
var mBuffers: (AudioBuffer)
}

struct AudioBuffer {
var mNumberChannels: UInt32
var mDataByteSize: UInt32
var mData: UnsafePointer<()>
}

最佳答案

这是我无意中发现的。奇怪的是,当它建议使用 UnsafeMutableAudioBufferListPointer 时,前面的类型实际上是在与 Swift 一起工作。您可以使用 UnsafeMutablePointer 参数对其进行初始化。此类型是 MutableCollectionType,并提供对包含的音频缓冲区的下标和生成器访问。

例如,您可以使用以下代码将 ABL 设置为静音

func renderCallback(ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus {

let abl = UnsafeMutableAudioBufferListPointer(ioData)

for buffer in abl {

memset(buffer.mData, 0, Int(buffer.mDataByteSize))
}

return noErr
}

关于ios - 在 Swift 中使用 AudioBufferList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24838106/

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