kAudioUnitProperty_MatrixLevels 在 Swift

kAudioUnitProperty_MatrixLevels in Swift

要查询 MatrixMixer AudioUnit,请执行以下操作:

// code from MatrixMixerTest sample project in c++

UInt32 dims[2];
UInt32 theSize =  sizeof(UInt32) * 2;
Float32 *theVols = NULL;
OSStatus result;


ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixDimensions,   
                        kAudioUnitScope_Global, 0, dims, &theSize), home);

theSize = ((dims[0] + 1) * (dims[1] + 1)) * sizeof(Float32);

theVols = static_cast<Float32*> (malloc (theSize));

ca_require_noerr (result = AudioUnitGetProperty (au, kAudioUnitProperty_MatrixLevels,   
                        kAudioUnitScope_Global, 0, theVols, &theSize), home);

AudioUnitGetPropertykAudioUnitProperty_MatrixLevels 的 return 值是(在文档和示例代码中定义的)Float32。

我正在尝试在 swift 中找到矩阵级别,并且可以毫无问题地获得矩阵维度。但是我不确定如何创建一个 UnsafeMutablePointer<Void> 的空 Float32 元素数组。这是我尝试过但没有成功的方法:

var size = ((dims[0] + 1) * (dims[1] + 1)) * UInt32(sizeof(Float32))
var vols = UnsafeMutablePointer<Float32>.alloc(Int(size))

在 MatrixMixerTest 中,数组的用法如下:theVols[0]

可能需要根据您转换其他部分的方式进行修改, 但是你的 C++ 代码的最后一部分可以用 Swift 写成这样:

    theSize = ((dims[0] + 1) * (dims[1] + 1)) * UInt32(sizeof(Float32))

    var theVols: [Float32] = Array(count: Int(theSize)/sizeof(Float32), repeatedValue: 0)

    result = AudioUnitGetProperty(au, kAudioUnitProperty_MatrixLevels,
            kAudioUnitScope_Global, 0, &theVols, &theSize)
    guard result == noErr else {
        //...
        fatalError()
    }

当基于 API 的 C 函数声明 UnsafeMutablePointer<Void> 时,您只需要一个任意类型的 Array 变量,并将其作为 inout 参数传递。