2016-07-11 53 views
0

要查詢你做下面的一個MatrixMixer AudioUnit:kAudioUnitProperty_MatrixLevels斯威夫特

// 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); 

kAudioUnitProperty_MatrixLevelsAudioUnitGetProperty返回值(在文檔和示例代碼中定義),一個浮點32。

我試圖在swift中查找矩陣級別,並且可以在沒有問題的情況下獲得矩陣維度。但我不知道如何創建一個空的Float32元素數組,它是一個UnsafeMutablePointer<Void>。這是我曾嘗試沒有成功:

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

在MatrixMixerTest陣列使用,如:theVols[0]

+0

「沒有成功」的意思是什麼? – Alexander

+0

我無法使用'vols'作爲數組,它使用'EXC_BAD_ACCESS'崩潰 – GWRodriguez

+0

您試圖在數組邊界內訪問的索引是什麼? – Alexander

回答

2

可能需要根據你如何轉化的其他部分, 但你的C的最後部分進行修改++代碼可以寫在斯威夫特這樣的:

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() 
    } 

當C函數基於API聲稱一個UnsafeMutablePointer<Void>,你只需要一個任意類型的Array變量,並通過我t作爲inout參數。

+0

這完全工作。非常感謝 – GWRodriguez