Хранение значений в буфере, внутри метода функции класса

Я программирую 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->, Просто оставь это.
Другие вопросы по тегам