2017-07-23 55 views
0

的問題

我試圖獲得新的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。

在此先感謝。

回答

1

這個問題最終與Core Audio無關,一切都與基本的語言級錯誤有關。

frequency被宣佈在這樣的文件級別範圍:

AUValue frequency = 1; 
@implementation MyAudioUnit 
@end 

我的理解是,frequency現在綁定到文件的範圍,而不是實例範圍內。因此,在不同實例上重複設置它只是覆蓋以前的值。因此,最後一項任務是呈現的頻率。