从 AUAudioUnit v3 上的主机使用 AUScheduleParameterBlock



我是新的AUAudioUnits,并试图了解如何使用v3 API。我正在尝试在kAudioUnitSubType_MultiChannelMixer AUAudioUnit上安排参数更改,以便我可以随着时间的推移增加增益变化。我能够直接使用滑块设置增益,并且更改会立即生效,如下所示:

/*...*/
// Inside my ViewController
  @IBAction func slider1Changed(sender: UISlider) {
    player.gainParameter.setValue(sender.value, originator: nil)
  }
// Inside my AudioPlayerClass
    guard let parameterTree = self.multichannelMixer.parameterTree else {
      print("Param Tree")
      return
    }
    self.gainParameter = parameterTree.parameterWithID(
      kMultiChannelMixerParam_Volume,
      scope: kAudioUnitScope_Input,
      element: 0)

但是当我尝试通过将其添加到上面的 AudioPlayerClass 来使用它scheduleParameterBlock执行此操作时,我希望增益在 1 秒内从 0 增加到 10,但没有变化:

    let scheduleMixerParamBlock = self.multichannelMixer.scheduleParameterBlock
    let rampTime = AUAudioFrameCount(10.secondsToSampleFrames)
    scheduleMixerParamBlock(AUEventSampleTimeImmediate, rampTime, self.gainParameter.address, 0)

我在苹果示例中看到的它的示例包括这样的代码(没有dispatch_async部分):

parameterTree.implementorValueObserver = {param, value in
  dispatch_async(dispatch_get_main_queue()) {
    print(param, value)
  }
  scheduleMixerParamBlock(AUEventSampleTimeImmediate, rampTime, param.address, value)
}

当我运行它并使用滑块更改增益参数时,该块将运行,paramvalue以正确的外观值打印到控制台,但在实际音频中增益不会改变。我看到的这些示例也在自定义AUAudioUnits上,其中实现者可以直接访问dspKernel函数,所以我可能在那里错过了一些关键的东西。另一种选择是我必须计算一系列斜坡值,然后直接为每个值设置增益参数,但由于存在scheduleParameterBlock,我似乎应该能够使用它。任何帮助都会很棒。谢谢

您必须查看在音频渲染线程上运行的internalRenderBlock中的AURenderEvent头。您的计划参数事件将显示在那里,供您响应。

例如,将头部传递给此函数:

void doEvents(AURenderEvent const* event)
    {
        while (event != nullptr) {
            switch (event->head.eventType) {
                case AURenderEventParameter:
                    doParameterEvent(event->parameter);
                    break;
                default:
                    break;
            }
            event = event->head.next;
        }
    }
void doParameterEvent(AUParameterEvent const &event) {
        switch (event.parameterAddress) {
            case FilterParameterAddressFoo:
                doFoo();
                break;
            case FilterParameterAddressBar:
                doBar();
                break;
            default:
                break;
        }
    }

相关内容

  • 没有找到相关文章

最新更新