Вложенные классы VST C++ - конструкция и включение
Мне нужна помощь во вложенных классах. Это возникло из вопроса, который я задал здесь
По сути, у меня есть класс "myPlugin". Этот класс является основной частью моей программы и включает функцию 'processReplacing'.
В рамках processReplacing мне нужно отфильтровать сигнал с использованием DSP, в настоящее время я использую 11 фильтров, что привело к жесткому кодированию 11 фильтров (и всех буферов) в processReplacing.
Однако теперь я решил создать класс фильтра, чтобы я мог создать новый экземпляр для каждого фильтра, вызывать его по мере необходимости и повышать эффективность моего кода.
До сих пор у меня был небольшой успех. Но сейчас я использую вложенные классы, которые, если я смогу приступить к работе, должны означать, что все остальное должно последовать их примеру.
Определения классов в заголовке:
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;
}
};
}; # 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' должно указывать на тип class/struct/union/generic type"
Я попытался инициализировать значения, хранящиеся в классах фильтра в конструкторе myPlugin. Я попытался создать конструктор фильтра, т.е. myPlugin::aFilter1L() ИЛИ aFilter1L::aFilter1L(), но они вызвали больше ошибок.
Не совсем уверен, что я могу сделать. Я работал с классами / функциями раньше, но никогда не вкладывал классы, поэтому немного потерян. Я видел много тем в Интернете, и каждый ответ не совсем подходит; или я попробовал решения, которые нашел, и они не сработали.
1 ответ
Вы должны добавить их к экземпляру вашего эффекта, например, так (скопируйте в ваш редактор и найдите LOOK ЗДЕСЬ):
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();
}
вложенный класс - это только объявление (вроде как пространство имен, но у вас есть несколько дополнительных опций, касающихся видимости). объявление класса в этой области автоматически не добавляет фильтры к эффекту, вам все равно придется объявить их в точности как любая статическая переменная или переменная экземпляра класса.