2017-07-23 4 views
0

Le problème

Je suis en train d'obtenir le nouveau mécanisme de AUParameterTree et AUParameter travaillant dans mon projet de test Audio Unit V3. Le problème est que lorsque j'obtiens une référence de l'application hôte et que j'en change la valeur, le paramètre de l'extension Audio Unit ne semble pas changer.Réglage de la valeur de AUParameter de Host App

Voici mon approche. J'utilise la nouvelle API Audio Unit V3. J'ai créé un AUParameter dans mes AUAudioUnit « s initWithComponentDescription:

Création du paramètre

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

Définir une valeur par défaut ..

param1.value = 0.5; 

quelques-uns des arguments au paramètre constructeur viennent de ...

Certains S tate

J'ai défini l'adresse en tant que constantes globales:

const AudioUnitParameterID frequencyAddress = 0; 

et une variable locale pour un AUValue:

AUValue frequency = 1; 

Gardez à l'esprit à ce moment, je suis juste après la trois exemples de projets qui utilisent Audio Unit V3 sur l'ensemble de l'Internet. Je trouve difficile de reconstituer la façon dont toute cette danse de paramètre AU devrait aller seulement de la lecture des docs.


Rendu avec le paramètre

maintenant en ce qui concerne l'utilisation du AUValue associé au AUParameter "param1" (je suppose thats comment cela fonctionne?) ..

Je suis alors capturant cette AUValue (la variable locale dont je ne sais pas comment il est associé à la réelle AUParameter) .. dans mon bloc de rendu Audio Unit:

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

Contrôle des paramètres de l'hôte App

C'est là que le problème se pose.

Je déclare une référence locale à un AUParameter:

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

et quand ma classe Audio Engine instancie mon AUAudioUnit il passe à moi:

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

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

aucun effet?

Quand je dis:

[_param1 setValue: 1000];

Le capturé AUValue dans mon bloc de rendu reste le même! J'ai soit ignoré un bug, un type stupide (j'ai peut-être introduit un type dans cette écriture de mon problème alors gardez cela à l'esprit), ou j'ai fondamentalement mal compris ce mécanisme.

Si j'ai besoin de fournir plus de contexte pour ce problème, je peux facilement pousser le projet vers Github.

Merci d'avance.

Répondre

1

Le problème s'est avéré n'avoir rien à voir avec Core Audio et tout à voir avec une erreur de niveau de langage basique.

frequency a été déclarée à périmètre au niveau des fichiers comme celui-ci:

AUValue frequency = 1; 
@implementation MyAudioUnit 
@end 

je crois comprendre que frequency est maintenant tenu de déposer la portée et non la portée d'instance. Par conséquent, le réglage répété sur différentes instances écrasait simplement la valeur précédente. Par conséquent, la dernière assignation était la fréquence qui serait rendue.