Вложенные классы VST C ++ - конструкция и включение - PullRequest
0 голосов
/ 03 февраля 2011

Мне нужна помощь во вложенных классах. Это произошло из вопроса, который я задал здесь

По сути, у меня есть класс 'myPlugin'. Этот класс является основной частью моей программы и включает функцию 'processReplacing'.

В рамках processReplacing мне нужно отфильтровать сигнал с использованием DSP, в настоящее время я использую 11 фильтров, что привело к жесткому кодированию 11 фильтров (и всех буферов) в processReplacing.

Однако теперь я решил создать класс фильтра, чтобы я мог создавать новый экземпляр для каждого фильтра, вызывать его по мере необходимости и повышать эффективность моего кода.

До сих пор у меня был небольшой успех. Но сейчас я использую вложенные классы, которые, если я смогу приступить к работе, должны означать, что все остальное должно последовать их примеру.

Определения классов в заголовке:

class myPlugin : public AudioEffectX

{

общественность: 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;
    }
    };

}; # ENDIF

Моя проблема в том, что я не могу правильно инициализировать класс фильтра. Конструктор для myPlugin выглядит следующим образом (имейте в виду, что это очень упрощенная версия фактического конструктора)

myPlugin::myPlugin (audioMasterCallback audioMaster)

: AudioEffectX (audioMaster, 1, 1) // 1 программа, только 1 параметр {

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

{ }

Когда я тогда пытаюсь использовать my_aFilter1L и т. Д. В processReplacing, выдается ошибка: «ошибка C2065:« my_aFilter1L »: необъявленный идентификатор» и »ошибка C2227: слева от '-> aFilterMethodL' должны указывать на класс / структура / объединение / универсальный тип "

Я попытался инициализировать значения, хранящиеся в классах фильтров в конструкторе myPlugin. Я попытался создать конструктор фильтра, т.е. myPlugin :: aFilter1L () ИЛИ aFilter1L :: aFilter1L (), но это вызвало больше ошибок.

Не совсем уверен, что я могу сделать. Я работал с классами / функциями раньше, но никогда не вкладывал классы, поэтому немного потерян Я видел много тем в Интернете, и каждый ответ не совсем подходит; или я попробовал найденные решения, но они не сработали.

1 Ответ

2 голосов
/ 03 февраля 2011

вы должны добавить их к экземпляру вашего эффекта, вот так (скопируйте в ваш редактор и найдите СМОТРИ ЗДЕСЬ ):

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();
}

вложенный класс является только объявлением (вроде как пространство имен, но у вас есть несколько дополнительных опций, касающихся видимости). объявление класса в этой области автоматически не добавляет фильтры к эффекту, вам все равно придется объявить их точно так же, как любую статическую переменную или переменную экземпляра класса.

...