从主机设置AUParameter的价值应用

问题描述:

的问题

我试图获得新的AUParameterTreeAUParameter的机制在我的音频单元V3测试项目。问题是,当我从主机应用程序中获得参考并更改其值时,音频单元扩展的参数看起来不会改变。从主机设置AUParameter的价值应用

这是我的方法。

我正在使用新的音频单元V3 API。我创建了一个我AUAudioUnitinitWithComponentDescriptionAUParameter

创建参数

AUParameter *param1 = [AUParameterTree createParameterWithIdentifier:@"frequency" 
                    name:@"Frequency" 
                   address:frequencyAddress 
                    min:500 
                    max:5000 
                    unit:kAudioUnitParameterUnit_Hertz 
                   unitName:nil 
                    flags:0 
                  valueStrings:nil 
                dependentParameters:nil]; 

设置的默认值..

param1.value = 0.5; 

一些参数的参数构造函来自...

Some S泰特

我已经定义的地址作为全局常量:

const AudioUnitParameterID frequencyAddress = 0; 

和本地变量的AUValue

AUValue frequency = 1; 

在这一点请记住,我只是跟随在整个互联网上使用Audio Unit V3的三个示例项目。我发现很难拼凑出整个AU参数跳舞应该只从阅读文档开始。


与参数渲染

现在,当涉及到使用与AUParameter“参数1”相关联的AUValue,(我认为这就是它是如何工作的?)..

我再捕获这AUValue(我不清楚它如何与实际AUParameter相关联的局部变量)..在我的音频单元渲染块:

- (AUInternalRenderBlock)internalRenderBlock { 

    AUValue * param1Capture = &frequency; 

    return ^AUAudioUnitStatus(AudioUnitRenderActionFlags *actionFlags, const AudioTimeStamp *timestamp, AVAudioFrameCount frameCount, NSInteger outputBusNumber, AudioBufferList *outputData, const AURenderEvent *realtimeEventListHead, AURenderPullInputBlock pullInputBlock) { 

     // use parameter value 
     someValue = *param1Capture; 
     // more dsp stuff.. 

从主机应用

这就是问题出现控制参数。

我宣布一个本地引用到AUParameter

@interface ViewController(){ 
    AudioEngine *_audioEngine; 
    AUParameter * _param1; 
} 

当我的音频引擎类实例化我的AUAudioUnit将其传递给我:

[_audioEngine setupAUWithComponentDescription:desc andCompletion:^(AUAudioUnit * unit){ 

     _param1 = [unit.parameterTree valueForKey:@"frequency"];   
}]; 

没有影响?

现在,当我说:

[_param1 setValue: 1000];

拍摄的AUValue在我的渲染块是一样的!

我已经忽略了一个错误,一个盲目的类型(我可能在这个问题中引入了一个类型来记住我的问题,所以记住),或者我从根本上误解了这个机制。

如果我需要为这个问题提供更多的上下文,我可以轻松地将项目推送到Github。

在此先感谢。

这个问题最终与Core Audio无关,一切都与基本的语言级错误有关。

frequency被宣布在这样的文件级别范围:

AUValue frequency = 1; 
@implementation MyAudioUnit 
@end 

我的理解是,frequency现在绑定到文件的范围,而不是实例范围内。因此,在不同实例上重复设置它只是覆盖以前的值。因此,最后一项任务是呈现的频率。