一般问题:我有一个对象,我想转换为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;
有人有什么想法吗?感谢。
答案 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.我不确定这是指什么,任何帮助表示赞赏。但是,这可以让您通过一些试验和错误解锁您的程序。