【问题标题】:How do you create a ConstUnsafePointer in Swift如何在 Swift 中创建 ConstUnsafePointer
【发布时间】:2014-07-10 20:42:25
【问题描述】:

一般问题:我有一个要转换为 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 我会收到错误:

'inout AUSamplerBankPresetData' 不能转换为 'ConstUnsafePointer'

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

【问题讨论】:

  • 这在 beta6 中不起作用:var bpData = AUSamplerBankPresetData(bankURL: Unmanaged(_private: soundBankURL), bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB), bankLSB: UInt8(kAUSampler_DefaultBankLSB), presetID: presetID , 保留:0)
  • 我发布了一个包含 beta 6 更新的新答案。我认为我问了这个问题 beta 3。

标签: swift


【解决方案1】:

似乎不需要中间指针常量。你应该可以这样做:

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

函数有这样的定义:

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

这一行:

inData: ConstUnsafePointer<()>,

是从这个C翻译过来的:

const void *            inData,

inData 参数是一个指向任何东西的常量指针,这就是ConstUnsafePointer&lt;()&gt; 的意思。我无法在 Core Audio 应用程序中尝试这个确切的代码,但我已经得到了类似的代码。

【讨论】:

  • 感谢您的回复,很抱歉这么久才回复您。所以,我尝试了这个并且这个工作......但我不明白为什么。如果是这种情况,那么&amp;bpData 应该是ConstUnsafePointer&lt;()&gt; 类型,所以对我来说这没有意义为什么行:let bpDataPointer: ConstUnsafePointer&lt;()&gt; = &amp;bpData 会引发错误
【解决方案2】:

在 beta 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。我不太确定这是指什么,如果有任何帮助,我们将不胜感激。但是,这应该可以让您通过一些试验和错误来解锁您的程序。

【讨论】:

  • 感谢您抽出宝贵时间回复。这是一个 AVAudio 解决方案——我猜有一天它会成为“标准”。现在我想播放一个生成的 MIDI 序列。 AudioToolbox 有 MusicSequence 和 MusicPlayer 。在 MusicSequence 上,您可以调用 MusicSequenceSetAUGraph 来设置“采样器”aunode。 AVAudioUnitSampler 不是一个 aunode。因此我尝试创建augraph。我也试过新的 AV MIDI 播放器。这就是问题所在:stackoverflow.com/questions/25550625/… 再次感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2019-02-24
  • 2014-08-18
  • 1970-01-01
  • 2018-02-22
  • 2015-07-17
  • 2015-02-15
相关资源
最近更新 更多