Хранение значений в буфере, внутри метода функции класса - PullRequest
0 голосов
/ 02 февраля 2011

Я программирую плагин 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, ввод с плавающей точкой, float 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 {

Friend Class 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;

виртуальный поплавок aFilterMethodR (поплавок a0, поплавок a1, поплавок a2, поплавок b1, поплавок b2, float inputR, поплавок 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);

// Отправить выходные данные фильтрана

* out1 = returnL;

* out2 = returnR;

* in1 ++;

* in2 ++;

* out1 ++;

* out2 ++;}}

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

Вам известно о том, что return немедленно выходит из функции?Поэтому код после того, который хранит значения в ваших буферах, никогда не выполняется.

Вместо этого вы должны поместить вызов return в конец функции.

Некоторые другие примечания:

  • Мне неясно, зачем вам нужны указатели на буферы, если вы используете только первый элемент.
  • У вас есть дублирующийся код в функциях -L и -R.Вместо этого используйте два экземпляра класса «моно», чтобы хранить данные только по одному каналу для каждого класса.
  • Вам (почти) никогда не нужно использовать this->.Просто оставь это.
1 голос
/ 03 февраля 2011

После создания моего нового вопроса о найденных вложенных классах здесь решение найдено.

Классы фильтров объявлены в классе myPlugin.

Отсюда конструкторы и деструкторы строятся как:

myPlugin::aFilterL::aFilterL()
myPlugin::aFilterL::~aFilterL()

в конструкторе myPlugin создаются новые экземпляры:

aFilterL *my_aFilter1L = new aFilterL();

и последний кусок головоломки - убедиться, что они добавлены в качестве экземпляра к эффекту myPlugin:

aFilterL my_aFilter1L;
aFilterR my_aFilter1R;

my_aFilter1L и т. Д. Теперь могут быть доступны через processReplacing и, кажется, работают правильно.

Большое спасибо всем за помощь в этом вопросе.

...