如何在Swift中创建ConstUnsafePointer

时间:2014-07-10 20:42:26

标签: swift

一般问题:我有一个对象,我想转换为ConstUnsafePointer。我尝试的一切似乎都失败了......我该怎么做?我以前在DP2中能够做到这一点,但无法在DP3中解决这个问题。

以前,我的代码看起来像这样:

var bpData = AUSamplerBankPresetData(bankURL: Unmanaged<CFURL>(_private: soundBankURL), bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB), bankLSB: UInt8(kAUSampler_DefaultBankLSB), presetID: presetID, reserved: 0)

let bpDataPointer: CConstVoidPointer = &bpData

// set the kAUSamplerProperty_LoadPresetFromBank property
result = AudioUnitSetProperty(samplerAudioUnit,
  UInt32(kAUSamplerProperty_LoadPresetFromBank),
  UInt32(kAudioUnitScope_Global),
  0, bpDataPointer, 8)

但是,现在CConstVoidPointer不再存在,并且已被ConstUnsafePointer取代。 AudioUnitSetProperty方法如下所示:

func AudioUnitSetProperty(inUnit: AudioUnit, inID: AudioUnitPropertyID, inScope: AudioUnitScope, inElement: AudioUnitElement, inData: ConstUnsafePointer<()>, inDataSize: UInt32) -> OSStatus

但是,如果我将CConstVoidPointer更改为ConstUnsafePointer&lt;()&gt;我收到错误:

&#39; inout AUSamplerBankPresetData&#39;不能转换为&#39; ConstUnsafePointer&lt;()&gt;&#39;

有人有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:1)

似乎没有必要让中间指针保持不变。你应该能够做到这一点:

result = AudioUnitSetProperty(
    samplerAudioUnit,
    UInt32(kAUSamplerProperty_LoadPresetFromBank),
    UInt32(kAudioUnitScope_Global),
    0, 
    &bpData, 
    8)

func有这个定义:

func AudioUnitSetProperty(
    inUnit: AudioUnit, 
    inID: AudioUnitPropertyID, 
    inScope: AudioUnitScope, 
    inElement: AudioUnitElement, 
    inData: ConstUnsafePointer<()>, 
    inDataSize: UInt32
        ) -> OSStatus

这一行:

inData: ConstUnsafePointer<()>,

是从这个C翻译而来:

const void *            inData,

inData参数是指向任何事物的常量指针,这是ConstUnsafePointer<()>的含义。我无法在Core Audio应用程序中尝试这个确切的代码,但我已经获得了类似的代码。

答案 1 :(得分:0)

在测试版6中,它又被改变了。值得庆幸的是,这次看起来解决方案仍然存在,并且不涉及任何C。

let description = AudioComponentDescription(componentType: OSType(kAudioUnitType_MusicDevice),
  componentSubType: OSType(kAudioUnitSubType_Sampler),
  componentManufacturer: OSType(kAudioUnitManufacturer_Apple),
  componentFlags: 0,
  componentFlagsMask: 0)

let instrument = AVAudioUnitSampler(audioComponentDescription: description)

let soundBankPath = NSBundle.mainBundle().pathForResource(fileName, ofType: "sf2")
let soundBankURL = NSURL.fileURLWithPath(soundBankPath!)

var error: NSError? = nil
instrument.loadSoundBankInstrumentAtURL(soundBankURL, program: program, bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB), bankLSB: UInt8(kAUSampler_DefaultBankLSB), error: &error)

对于我的sf2文件,程序通常是1或0.我不确定这是指什么,任何帮助表示赞赏。但是,这可以让您通过一些试验和错误解锁您的程序。