Хранение значений в буфере, внутри метода функции класса
Я программирую VST DSP плагин на C++.
Я создаю серию полосовых фильтров в банке фильтров. Я реализовал класс фильтра в своем заголовке (включая функцию) и правильно построил конструктор / деструктор в.cpp.
Я могу передать значения в метод и вернуть их также. Тем не менее, проблема лежит в области хранения данных в буферах в функции. Кажется, что каждый раз, когда вызывается метод функции, значения, сохраненные в буфере, сбрасываются (или, наоборот, не сохраняются правильно в первую очередь). Следовательно, то, что передается обратно, не является "полным".
Любой совет с благодарностью!
nb Это сообщение было обновлено с новым кодом:
Вот классы:
class aFilterL
{
класс друга Beat_to_Midi;
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;
виртуальный поплавок aFilterMethodL (поплавок a0, поплавок a1, поплавок a2, поплавок b1, поплавок b2, поплавок inputL, поплавок prevInput1L, поплавок 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 {
класс друга Beat_to_Midi;
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;
виртуальный 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;
}};
Затем он создается / уничтожается в cpp следующим образом:
aFilterL::aFilterL()
{fOut1_l = 0.f; filterOut1_l = 0.f;
Out_1_l = 0.f;
Out_2_l = 0.f;
buffer_Out_1_l = new float [1];
buffer_Out_2_l = new float [1];
buffer_Out_1_l[0] = 0.f;
buffer_Out_2_l[0] = 0.f;
}
aFilterL:: ~ aFilterL () {
if (buffer_Out_1_l)
delete[] buffer_Out_1_l;
if (buffer_Out_2_l)
delete[] buffer_Out_2_l;
}
aFilterR:: aFilterR () {fOut1_r = 0.f;
filterOut1_r = 0.f;
Out_1_r = 0.f;
Out_2_r = 0.f;
buffer_Out_1_r = new float [1];
buffer_Out_2_r = new float [1];
buffer_Out_1_r[0] = 0.f;
buffer_Out_2_r[0] = 0.f;
}
aFilterR:: ~ aFilterR () {
if (buffer_Out_1_r)
delete[] buffer_Out_1_r;
if (buffer_Out_2_r)
delete [] buffer_Out_2_r;
}
Наконец, это реализовано в функции processReplacing как:
void myPlugin:: processReplacing (плавающие ** входы, плавающие ** выходы, VstInt32 sampleFrames) {
float* in1 = inputs[0];
float* in2 = inputs[1];
float* out1 = outputs[0];
float* out2 = outputs[1];
aFilterL *my_aFilter1L = new aFilterL;
aFilterR *my_aFilter1R = new aFilterR;
while (--sampleFrames> = 0) {
// Фильтр ввода
In_1_l = buffer_In_1_l [0];
In_1_r = buffer_In_1_r [0];
In_2_l = buffer_In_2_l [0];
In_2_r = buffer_In_2_r [0];
// Фильтр в управлении
buffer_In_2_l [0] = buffer_In_1_l [0];
buffer_In_2_r [0] = buffer_In_1_r [0];
buffer_In_1_l [0] = * in1;
buffer_In_1_r [0] = * in2;
// отправить в функцию для обработки
returnL = my_aFilter1L-> aFilterMethodL (0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, * in1, In_1_l, In_2_l);
returnR = my_aFilter1R-> aFilterMethodR (0.000171f, 0.0f, -0.000171f, -1.999911f, 0.999943f, * in2, In_1_r, In_2_r);
// Отправить вывод фильтра на out
* out1 = returnL;
* out2 = returnR;
* In1 ++;
* In2 ++;
* Out1 ++;
* Out2++; }}
2 ответа
После создания моего нового вопроса о найденных здесь вложенных классах решение было найдено.
Классы фильтров объявлены в классе myPlugin.
Отсюда конструкторы и деструкторы строятся как:
myPlugin::aFilterL::aFilterL()
myPlugin::aFilterL::~aFilterL()
в конструкторе myPlugin создаются новые экземпляры:
aFilterL *my_aFilter1L = new aFilterL();
и последняя часть головоломки - убедиться, что они добавлены в качестве экземпляра к эффекту myPlugin:
aFilterL my_aFilter1L;
aFilterR my_aFilter1R;
Теперь к my_aFilter1L и т. д. можно получить доступ через processReplacing, и, похоже, он работает правильно.
Большое спасибо всем за вашу помощь в этом вопросе.
Знаете ли вы о том, что return
выход из функции немедленно? Так что код после того, что хранит значения в ваших буферах, никогда не выполняется.
Вместо этого вы должны поместить обратный вызов в конец функции.
Некоторые другие заметки:
- Мне непонятно, зачем вам нужны указатели на буферы, если вы используете только первый элемент.
- У вас есть дублирующийся код в функциях -L и -R. Вместо этого используйте два экземпляра класса "моно", чтобы хранить данные только по одному каналу для каждого класса.
- Вы (почти) никогда не должны использовать
this->
, Просто оставь это.