我正在用C++編寫一個VST DSP插件。在類函數方法中將值存儲在緩衝區中
我在「過濾器庫」中創建了一系列帶通濾波器。我在頭文件中實現了一個過濾器類(包括函數),並在.cpp中正確構建了構造函數/析構函數。
我可以將值傳遞給方法並返回它們。但是,這些問題存在於將數據存儲在緩衝區中的功能中。似乎每次調用函數方法時,都會重置存儲在緩衝區中的值(或者,首先不能正確存儲)。因此,傳回的內容不是「完整的」。
任何建議非常感謝!
n.b.該帖子已被新的代碼更新:
這裏的類:
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,浮輸入1,浮動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;
}
} ;
類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;
虛擬浮子aFilterMethodR(浮A0,A1浮子,浮子A2,浮子B1,B2浮子,浮子inputR,浮prevInput1R,浮法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功能實現爲:
空隙爲myplugin :: processRe置(浮**輸入,浮**輸出,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;
而(--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;
//發送到用於處理
起作用returnedL = my_aFilter1L-> aFilterMethodL(0.000171f,0.0F,-0.000171f,-1.999911f,0.999943f,* IN1,In_1_l,In_2_l);
returnedR = my_aFilter1R-> aFilterMethodR(0.000171f,0.0f,-0.000171f,-1.999911f,0。999943f,* in2,In_1_r,In_2_r);
//發送過濾器輸出到外部
* out1 = returnedL;
* out2 = returnedR;
* in1 ++;
* in2 ++;
* out1 ++;
* out2 ++; }}
析構函數應該是虛擬的,如果你有虛擬方法,並且你的指針沒有被初始化......幸運的是,返回跳過了將會有未定義行爲的賦值。 – AJG85 2011-02-02 17:55:44