我是新的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)
}
当我运行它并使用滑块更改增益参数时,该块将运行,param
和value
以正确的外观值打印到控制台,但在实际音频中增益不会改变。我看到的这些示例也在自定义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;
}
}