2017-07-23 7 views
0

Das Problem

Ich versuche, die neue AUParameterTree und AUParameter ‚s Mechanismus in meinem Audio Unit V3 Testprojekt arbeiten zu erhalten. Das Problem ist, dass der Parameter der Audio Unit-Erweiterung sich nicht zu ändern scheint, wenn ich von der Host-App einen Verweis darauf erhalte und dessen Wert ändere.Einstellung AUParameter Wert von Host-App

Hier ist mein Ansatz.

Ich benutze die neue Audio Unit V3 API. Ich habe eine AUParameter in meinem AUAudioUnit erstellt ‚s initWithComponentDescription:

die Parameter Erstellen

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

einen Standardwert gesetzt ..

param1.value = 0.5; 

einige der Argumente für den Parameter Erbauer kommen von ...

einige S tate

Ich habe die Adresse als globale Konstanten definiert:

const AudioUnitParameterID frequencyAddress = 0; 

Und eine lokale Variable für eine AUValue:

AUValue frequency = 1; 

an dieser Stelle Beachten Sie, ich folge nur die drei Beispielprojekte, die Audio Unit V3 im gesamten Internet verwenden. Ich finde es schwierig, zusammenzufügen, wie dieser gesamte AU-Parameter-Tanz nur durch das Lesen der Dokumente gehen sollte.


mit dem Parameter Rendering

jetzt, wenn es darum geht, die AUValue mit dem AUParameter "param1" assoziiert mit, (I, das ist übernehmen, wie es funktioniert?) ..

dann bin ich Erfassung dieser AUValue (die lokale Variable, die ich nicht klar bin, wie es mit der tatsächlichen AUParameter zugeordnet ist) .. in meinem Audio-Unit-Rendering-Block:

- (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.. 

Parameter Steuerung von Host-App

Dies ist, wo das Problem auftritt.

erkläre ich eine lokale Referenz auf ein AUParameter:

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

und wenn mein Audio Engine Klasse meine AUAudioUnit instanziiert es geht es mir:

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

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

keine Wirkung?Jetzt

, wenn ich sage:

[_param1 setValue: 1000];

Die aufgenommenen AUValue in meinem Rendering-Block bleibt gleich!

Ich habe entweder einen Fehler übersehen, einen gedankenlosen Typ (ich habe vielleicht einen Typ in diese Beschreibung meines Problems eingeführt, also behalte das im Hinterkopf), oder ich habe diesen Mechanismus grundlegend falsch verstanden.

Wenn ich mehr Kontext für dieses Problem bereitstellen muss, kann ich das Projekt einfach nach Github schieben.

Vielen Dank im Voraus.

Antwort

1

Das Problem stellte sich heraus, dass es nichts mit Core Audio zu tun hatte und alles, was mit einem grundlegenden Sprachfehler zu tun hatte.

frequency wurde auf Dateiebene Umfang wie folgt erklärt:

AUValue frequency = 1; 
@implementation MyAudioUnit 
@end 

Mein Verständnis ist, dass frequency jetzt Umfang Datei gebunden ist, und nicht die Instanzbereich. Daher überschrieb das wiederholte Einstellen auf verschiedene Instanzen einfach den vorherigen Wert. Daher war die letzte Zuweisung die Häufigkeit, die ausgegeben würde.

Verwandte Themen