2011-02-02 56 views
0

我正在用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 ++; }}

+0

析構函數應該是虛擬的,如果你有虛擬方法,並且你的指針沒有被初始化......幸運的是,返回跳過了將會有未定義行爲的賦值。 – AJG85 2011-02-02 17:55:44

回答

1

在嵌套類here上創建我的新問題後,找到了解決方案。

過濾器類在myPlugin類中聲明。

從這裏構造函數和析構函數被構建爲:

myPlugin::aFilterL::aFilterL() 
myPlugin::aFilterL::~aFilterL() 
在爲myplugin構造

新的實例被創建:

aFilterL *my_aFilter1L = new aFilterL(); 

,並在拼圖的最後一塊是那麼確保他們作爲實例添加到myPlugin效果中:

aFilterL my_aFilter1L; 
aFilterR my_aFilter1R; 

my_aFilter1L等現在可以通過processReplacing訪問,似乎是正常工作。

非常感謝大家對此事的全力幫助。

3

您是否知道return立即退出該功能?因此,將值存儲到緩衝區之後的代碼永遠不會執行。

相反,您應該將返回調用放在函數的結尾處。

其他一些注意事項:

  • 這是我不清楚爲什麼你需要的指針,如果你只使用過的第一個元素來緩衝。
  • 在-L和-R函數中有重複的代碼。相反,使用「mono」類的兩個實例,因此您只能爲每個類的單個通道存儲數據。
  • 您(幾乎)不需要使用this->。只是把它留下。
+0

這發生在`aFilterMethodR`和`aFilterMethodL` – Muggen 2011-02-02 15:40:30

相關問題