我在Swift中有一个桥接函数,C中的参数之一是AudioBufferList *。在Swift中,这会生成一个UnsafePointer<AudioBufferList>。我通过调用audioData[0] (有更好的方法吗?)来尊重指针。但我正在与接下来的2层做斗争:AudioBuffer的AudioBuffer数组及其void * / UnsafePointer<()> .mData成员。
在C语言中,它只是
Float32 *audioData = (Float 32*)abl->mBuffers[0]->mData;
output = audioData[sampleNum]...在Swift中,第一件奇怪的事情是,它不允许我访问mBuffers的元素,但是当我作为一个属性访问它时,它是非常高兴的。换句话说,这是可行的,甚至有正确的数据(对于mBuffers的第一个成员,我认为).
println(abl[0].mBuffers.mNumberChannels) // But .mBuffers should be an []!第二,让我们打印出.mData下标,但值总是()
println(abl[0].mBuffers.mData[10]) // Prints '()'我尝试过各种转换操作,并使用多个索引进行访问,但没有avail...any的想法?
以下是AudioBufferList和AudioBuffer的C和Swift定义.
// 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<()>
}发布于 2015-05-12 19:17:58
我偶然发现了这个。奇怪的是,当斯威夫特建议使用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
}发布于 2014-09-26 14:11:12
我发现这个还行。abl是通过加载16位AIFF音频文件创建的AudioBufferList。
let mBuffers=abl.memory.mBuffers
let data=UnsafePointer<Int16>(mBuffers.mData)
let dataArray=UnsafeBufferPointer<Int16>(start:data, count: Int(mBuffers.mDataByteSize)/sizeof(Int16))
//checking resulting array
let count=dataArray.count //this matches the expected number of samples in my case
for i in 0..<count
{
print(dataArray[i]) //values look OK in my case
print(" ")
}发布于 2015-05-19 04:34:28
这适用于我使用Swift 1.2
var ddata: NSData
buf = AudioBuffer(mNumberChannels: 1, mDataByteSize: numberOfFrames * UInt32(sizeof(Float32)), mData: &ddata)
var audioBuffers = AudioBufferList(mNumberBuffers: 1, mBuffers: buf!)https://stackoverflow.com/questions/24838106
复制相似问题