2011-02-03 3 views
0

J'ai besoin d'aide dans les classes imbriquées. Cela est issu d'une question que j'ai posée hereVST Classes imbriquées C++ - Construction et inclusion

Essentiellement, j'ai une classe 'myPlugin'. Cette classe est l'essentiel de mon programme et inclut la fonction 'processReplacing'.

Dans processReplacing j'ai besoin de filtrer le signal en utilisant DSP, actuellement j'utilise 11 filtres et cela a conduit à 11 filtres (et tous les tampons) codés en dur dans processReplacing.

Cependant, maintenant j'ai décidé de créer une classe de filtre, donc je peux créer une nouvelle instance pour chaque filtre, appeler si nécessaire et améliorer l'efficacité de mon code.

Jusqu'ici j'ai eu peu de succès. Mais maintenant j'utilise des classes imbriquées qui, si je peux me mettre au travail, devraient signifier que tout le reste devrait suivre.

définitions de classe dans l'en-tête sont:

class myPlugin : public AudioEffectX 

{

public: myPlugin (audioMasterCallback AudioMaster); ~ monPlugin();

// Processing 
virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); 
virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames); 
virtual void midiOutNoteOn (int iKey, int iVel); 
virtual void midiOutNoteOff (int iKey, int iVel); 

// Program 
virtual void setProgramName (char* name); 
virtual void getProgramName (char* name); 

// Parameters 
virtual void setParameter (VstInt32 index, float value); 
virtual float getParameter (VstInt32 index); 
virtual void getParameterLabel (VstInt32 index, char* label); 
virtual void getParameterDisplay (VstInt32 index, char* text); 
virtual void getParameterName (VstInt32 index, char* text); 
virtual bool getEffectName (char* name); 
virtual bool getVendorString (char* text); 
virtual bool getProductString (char* text); 
virtual VstInt32 getVendorVersion(); 
virtual VstInt32 canDo (char* text); 

     class aFilterL 
    { 
    friend class myPlugin; 
    public: 
     aFilterL(); 
     ~aFilterL(); 
     float fOut1_l; 
     float filterOut1_l; 
     float Out_1_l; 
     float Out_2_l; 
     float* buffer_Out_1_l; 
     float* buffer_Out_2_l; 

    virtual float aFilterMethodL (float a0, float a1, float a2, float b1, float b2, float inputL, float prevInput1L, float prevInput2L) 
    { 

     Out_1_l = buffer_Out_1_l[0]; 
     Out_2_l = buffer_Out_2_l[0]; 
     filterOut1_l = (a0 * inputL) + (a1 * prevInput1L) + (a2 * prevInput2L) - (b1 * Out_1_l) - (b2 * Out_2_l) + 1.0E-25; 
     fOut1_l = filterOut1_l; 
     buffer_Out_2_l[0] = buffer_Out_1_l[0]; 
     buffer_Out_1_l[0] = fOut1_l; 
     return fOut1_l; 
    } 
    }; 
    class aFilterR 
    { 
    friend class myPlugin; 
    public: 
     aFilterR(); 
     ~aFilterR(); 

     float fOut1_r; 
     float filterOut1_r; 
     float Out_1_r; 
     float Out_2_r; 
     float* buffer_Out_1_r; 
     float* buffer_Out_2_r; 

    virtual float aFilterMethodR (float a0, float a1, float a2, float b1, float b2, float inputR, float prevInput1R, float prevInput2R) 
    { 
     Out_1_r = buffer_Out_1_r[0]; 
     Out_2_r = buffer_Out_2_r[0]; 
     filterOut1_r = (a0 * inputR) + (a1 * prevInput1R) + (a2 * prevInput2R) - (b1 * Out_1_r) - (b2 * Out_2_r) + 1.0E-25; 
     fOut1_r = filterOut1_r; 
     buffer_Out_2_r[0] = buffer_Out_1_r[0]; 
     buffer_Out_1_r[0] = fOut1_r; 
     return fOut1_r; 
    } 
    }; 

}; # endif

Mon problème est alors que je ne peux pas initialiser correctement la classe de filtre. Le constructeur de 'myPlugin' ressemble à ceci (S'il vous plaît garder à l'esprit que ceci est une version très simplifiée du constructeur réel)

myPlugin::myPlugin (audioMasterCallback audioMaster) 

: AudioEffectX (AudioMaster, 1, 1) // 1 programme, 1 paramètre seulement {

setNumInputs (2);  // stereo in 
setNumOutputs (2);  // stereo out 
setUniqueID ('Gain'); // identify 
canProcessReplacing(); // supports replacing output 
canDoubleReplacing(); // supports double precision processing 

myPlugin *my_aFilter1L = new aFilterL(); 
myPlugin *my_aFilter1R = new aFilterR(); 

}

myPlugin :: ~ myPlugin()

{}

Lorsque je tente ensuite et utiliser my_aFilter1L etc dans ProcessReplacing il jette l'erreur: « Erreur C2065: « my_aFilter1L »: identificateur non déclaré » et « erreur C2227: à gauche « -> aFilterMethodL » doit pointer vers la classe/struct/union/type générique "

J'ai essayé d'initialiser des valeurs stockées dans les classes de filtre du constructeur myPlugin. J'ai essayé de créer le constructeur de filtre myPlugin :: aFilter1L() ou aFilter1L :: aFilter1L() mais ceux-ci ont causé plus d'erreurs.

Vous ne savez pas exactement ce que je peux faire. J'ai déjà travaillé avec des classes/fonctions, mais jamais des classes imbriquées, donc un peu perdu. J'ai vu beaucoup de discussions en ligne et chaque réponse ne s'applique pas tout à fait; ou j'ai essayé les solutions que j'ai trouvées et elles n'ont pas fonctionné.

Répondre

2

vous devez les ajouter à une instance de votre effet, comme si (copie à votre éditeur et rechercher REGARD ICI):

class myPlugin : public AudioEffectX { 

public: 
    myPlugin (audioMasterCallback audioMaster); 
    ~myPlugin(); 

// Processing 
    virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); 
    virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames); 
    virtual void midiOutNoteOn (int iKey, int iVel); 
    virtual void midiOutNoteOff (int iKey, int iVel); 

// Program 
    virtual void setProgramName (char* name); 
    virtual void getProgramName (char* name); 

// Parameters 
    virtual void setParameter (VstInt32 index, float value); 
    virtual float getParameter (VstInt32 index); 
    virtual void getParameterLabel (VstInt32 index, char* label); 
    virtual void getParameterDisplay (VstInt32 index, char* text); 
    virtual void getParameterName (VstInt32 index, char* text); 
    virtual bool getEffectName (char* name); 
    virtual bool getVendorString (char* text); 
    virtual bool getProductString (char* text); 
    virtual VstInt32 getVendorVersion(); 
    virtual VstInt32 canDo (char* text); 

    class aFilterL 
    { 
     friend class myPlugin; 
    public: 
     aFilterL(); 
     ~aFilterL(); 
     float fOut1_l; 
     float filterOut1_l; 
     float Out_1_l; 
     float Out_2_l; 
     float* buffer_Out_1_l; 
     float* buffer_Out_2_l; 

     virtual float aFilterMethodL (float a0, float a1, float a2, float b1, float b2, float inputL, float prevInput1L, float prevInput2L) 
     { 

      Out_1_l = buffer_Out_1_l[0]; 
      Out_2_l = buffer_Out_2_l[0]; 
      filterOut1_l = (a0 * inputL) + (a1 * prevInput1L) + (a2 * prevInput2L) - (b1 * Out_1_l) - (b2 * Out_2_l) + 1.0E-25; 
      fOut1_l = filterOut1_l; 
      buffer_Out_2_l[0] = buffer_Out_1_l[0]; 
      buffer_Out_1_l[0] = fOut1_l; 
      return fOut1_l; 
     } 
    }; 

    class aFilterR 
    { 
     friend class myPlugin; 
    public: 
     aFilterR(); 
     ~aFilterR(); 

     float fOut1_r; 
     float filterOut1_r; 
     float Out_1_r; 
     float Out_2_r; 
     float* buffer_Out_1_r; 
     float* buffer_Out_2_r; 

     virtual float aFilterMethodR (float a0, float a1, float a2, float b1, float b2, float inputR, float prevInput1R, float prevInput2R) 
     { 
      Out_1_r = buffer_Out_1_r[0]; 
      Out_2_r = buffer_Out_2_r[0]; 
      filterOut1_r = (a0 * inputR) + (a1 * prevInput1R) + (a2 * prevInput2R) - (b1 * Out_1_r) - (b2 * Out_2_r) + 1.0E-25; 
      fOut1_r = filterOut1_r; 
      buffer_Out_2_r[0] = buffer_Out_1_r[0]; 
      buffer_Out_1_r[0] = fOut1_r; 
      return fOut1_r; 
     } 
    }; 
    /* LOOK HERE */ 
private: 
    aFilterL filterL; 
    aFilterR filterR; 
}; 


myPlugin::myPlugin (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 1, 1), filterL(), /* LOOK HERE */ filterR() /* LOOK HERE */ { 

    setNumInputs (2); // stereo in 
    setNumOutputs (2); // stereo out 
    setUniqueID ('Gain'); // identify 
    canProcessReplacing(); // supports replacing output 
    canDoubleReplacing(); // supports double precision processing 

    /* LOOK HERE */ 
    //myPlugin *my_aFilter1L = new aFilterL(); 
    //myPlugin *my_aFilter1R = new aFilterR(); 
} 

la classe imbriquée est seulement une déclaration (un peu comme un espace de noms, mais vous avez quelques options supplémentaires concernant la visibilité). déclarer une classe dans cette portée n'ajoute pas automatiquement de filtres à l'effet, vous devrez toujours les déclarer exactement comme n'importe quelle variable statique ou instance de la classe.

+0

merci beaucoup! cela semble l'avoir résolu! veillera à voter votre réponse une fois que j'ai la réputation! –

+0

@ Forge_13 de rien. codage heureux – justin

Questions connexes