首页 > 解决方案 > AUHostMusicalContextBlock “访问此属性的音频单元应在开始渲染之前将其缓存在实时安全存储中。”

问题描述

当使用 AVFoundation MusicalContextBlock 参数时,Apple 说:

“访问此属性的音频单元应在开始渲染之前将其缓存在实时安全存储中。”

这是什么意思?

我正在尝试实现允许音频单元检索时间信息的回调。然而。我得到的结果参差不齐。也就是说,如果我在几个 AudioUnits 上设置 MusicalContextBlock,只有最后一个可以成功访问回调。其他人不叫它。就好像最近的音频单元“接管”了该功能。

  public func contextBlock() -> AUHostMusicalContextBlock {
        func getMusicalContext(currentTempo : UnsafeMutablePointer<Double>?,
                               timeSignatureNumerator : UnsafeMutablePointer<Double>?,
                               timeSignatureDenominator : UnsafeMutablePointer<Int>?,
                               currentBeatPosition: UnsafeMutablePointer<Double>?,
                               sampleOffsetToNextBeat : UnsafeMutablePointer<Int>?,
                               currentMeasureDownbeatPosition: UnsafeMutablePointer<Double>?) -> Bool {
            if self.delegate == nil { return false }
            let context = self.delegate!.musicalContext
            currentTempo?.pointee = context.currentTempo
            timeSignatureNumerator?.pointee = context.timeSignatureNumerator
            timeSignatureDenominator?.pointee = context.timeSignatureDenominator
            currentBeatPosition?.pointee = context.currentBeatPosition
            sampleOffsetToNextBeat?.pointee = context.sampleOffsetToNextBeat
            currentMeasureDownbeatPosition?.pointee = context.currentMeasureDownbeatPosition
            return true
        }
        return getMusicalContext
    }

    public func instrument(description: AudioComponentDescription) -> AVAudioUnitMIDIInstrument{
        let plugin = AVAudioUnitMIDIInstrument(audioComponentDescription: description)
        plugin.auAudioUnit.musicalContextBlock = contextBlock()
        return plugin
    }

标签: swiftmacosavfoundation

解决方案


我不确定这里发生了什么。

想要使用的音频单元musicalContextBlock很可能想要使用它的渲染功能。但他们不应该直接在渲染函数中访问该属性。

AudioUnit 可以实现allocateRenderResourcesAndReturnError,主机应该在每次渲染之前调用。在那里它可以安全地检查是否musicalContextBlock已设置,如果是,则将其存储在渲染函数中以供稍后使用。

您确定allocateRenderResourcesAndReturnError在进行渲染之前调用每个 AudioUnit 吗?


推荐阅读