首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AudioBufferList与Swift

使用AudioBufferList与Swift
EN

Stack Overflow用户
提问于 2014-07-19 07:56:31
回答 3查看 9.9K关注 0票数 21

我在Swift中有一个桥接函数,C中的参数之一是AudioBufferList *。在Swift中,这会生成一个UnsafePointer<AudioBufferList>。我通过调用audioData[0] (有更好的方法吗?)来尊重指针。但我正在与接下来的2层做斗争:AudioBufferAudioBuffer数组及其void * / UnsafePointer<()> .mData成员。

在C语言中,它只是

代码语言:javascript
复制
Float32 *audioData = (Float 32*)abl->mBuffers[0]->mData;
output = audioData[sampleNum]...

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

代码语言:javascript
复制
println(abl[0].mBuffers.mNumberChannels)  // But .mBuffers should be an []!

第二,让我们打印出.mData下标,但值总是()

代码语言:javascript
复制
println(abl[0].mBuffers.mData[10])  // Prints '()'

我尝试过各种转换操作,并使用多个索引进行访问,但没有avail...any的想法?

以下是AudioBufferListAudioBuffer的C和Swift定义.

代码语言:javascript
复制
// 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;
};

..。

代码语言:javascript
复制
// SWIFT

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

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

回答 3

Stack Overflow用户

发布于 2015-05-12 19:17:58

我偶然发现了这个。奇怪的是,当斯威夫特建议使用UnsafeMutableAudioBufferListPointer时,它实际上正在与Swift合作。可以用UnsafeMutablePointer参数初始化。此类型是一个MutableCollectionType,并提供对包含的音频缓冲区的下标和生成器访问。

例如,可以将ABL设置为使用以下代码保持沉默

代码语言:javascript
复制
func renderCallback(ioData: UnsafeMutablePointer<AudioBufferList>) -> OSStatus {

    let abl = UnsafeMutableAudioBufferListPointer(ioData)

    for buffer in abl {

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

    return noErr
}
票数 23
EN

Stack Overflow用户

发布于 2014-09-26 14:11:12

我发现这个还行。abl是通过加载16位AIFF音频文件创建的AudioBufferList。

代码语言:javascript
复制
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(" ")
}
票数 1
EN

Stack Overflow用户

发布于 2015-05-19 04:34:28

这适用于我使用Swift 1.2

代码语言:javascript
复制
        var ddata: NSData
        buf = AudioBuffer(mNumberChannels: 1, mDataByteSize: numberOfFrames * UInt32(sizeof(Float32)), mData: &ddata)
        var audioBuffers = AudioBufferList(mNumberBuffers: 1, mBuffers: buf!)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24838106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档