2011-02-03 108 views
0

我需要一些嵌套類的幫助。這是從我問的問題出現的hereVST C++嵌套類 - 構造和包含

基本上我有一個類'myPlugin'。這個類是我的程序的主體,並且包含'processReplacing'函數。

內部進程替換我需要使用DSP過濾信號,目前我使用11個過濾器,並導致11個過濾器(以及所有緩衝區)被硬編碼到processReplacing中。

但是,現在我決定創建一個過濾器類,因此我可以爲每個過濾器創建一個新實例,根據需要調用並提高代碼效率。

到目前爲止,我一直沒有成功。但是現在我正在使用嵌套類,如果我可以開始工作,應該意味着所有其他應該效仿。

在報頭中的類定義是:

class myPlugin : public AudioEffectX 

{

公共: 爲myplugin(audioMasterCallback audioMaster); 〜myPlugin();

// Processing 
virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); 
virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames); 
virtual void midiOutNoteOn (int iKey, int iVel); 
virtual void midiOutNoteOff (int iKey, int iVel); 

// Program 
virtual void setProgramName (char* name); 
virtual void getProgramName (char* name); 

// Parameters 
virtual void setParameter (VstInt32 index, float value); 
virtual float getParameter (VstInt32 index); 
virtual void getParameterLabel (VstInt32 index, char* label); 
virtual void getParameterDisplay (VstInt32 index, char* text); 
virtual void getParameterName (VstInt32 index, char* text); 
virtual bool getEffectName (char* name); 
virtual bool getVendorString (char* text); 
virtual bool getProductString (char* text); 
virtual VstInt32 getVendorVersion(); 
virtual VstInt32 canDo (char* text); 

     class aFilterL 
    { 
    friend class myPlugin; 
    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; 

    virtual float aFilterMethodL (float a0, float a1, float a2, float b1, float b2, float inputL, float prevInput1L, float 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 myPlugin; 
    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; 

    virtual 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; 
    } 
    }; 

};#ENDIF

我的問題,那麼就是我不能正確初始化過濾器類。對於 '爲myplugin' 的構造看起來像這樣(請記住,這是實際的構造非常簡化的版本)

myPlugin::myPlugin (audioMasterCallback audioMaster) 

:AudioEffectX(audioMaster,1,1)// 1個項目,1個參數僅 {

setNumInputs (2);  // stereo in 
setNumOutputs (2);  // stereo out 
setUniqueID ('Gain'); // identify 
canProcessReplacing(); // supports replacing output 
canDoubleReplacing(); // supports double precision processing 

myPlugin *my_aFilter1L = new aFilterL(); 
myPlugin *my_aFilter1R = new aFilterR(); 

}

爲myplugin ::〜爲myplugin()

{ }

當我再嘗試和processReplacing它使用my_aFilter1L等引發錯誤:「錯誤C2065:my_aFilter1L「:未聲明的標識符」 「錯誤C2227:左‘ - > aFilterMethodL’必須指向類/結構/ union/generic type「

我嘗試初始化存儲在myPlugin構造函數中的過濾器類中的值。我曾嘗試創建過濾器構造函數,即myPlugin :: aFilter1L() aFilter1L :: aFilter1L(),但是這些引發了更多錯誤。

不太確定我能做些什麼。我以前曾使用類/函數,但從未嵌套過類,因此有點丟失。我在網上看到很多線索,每個答案都不太適用;或者我嘗試了我找到的解決方案,但他們沒有工作。

回答

2

你必須將它們添加到您的效果的情況下,像這樣(複製到你的編輯器和搜索看這裏):

class myPlugin : public AudioEffectX { 

public: 
    myPlugin (audioMasterCallback audioMaster); 
    ~myPlugin(); 

// Processing 
    virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); 
    virtual void processDoubleReplacing (double** inputs, double** outputs, VstInt32 sampleFrames); 
    virtual void midiOutNoteOn (int iKey, int iVel); 
    virtual void midiOutNoteOff (int iKey, int iVel); 

// Program 
    virtual void setProgramName (char* name); 
    virtual void getProgramName (char* name); 

// Parameters 
    virtual void setParameter (VstInt32 index, float value); 
    virtual float getParameter (VstInt32 index); 
    virtual void getParameterLabel (VstInt32 index, char* label); 
    virtual void getParameterDisplay (VstInt32 index, char* text); 
    virtual void getParameterName (VstInt32 index, char* text); 
    virtual bool getEffectName (char* name); 
    virtual bool getVendorString (char* text); 
    virtual bool getProductString (char* text); 
    virtual VstInt32 getVendorVersion(); 
    virtual VstInt32 canDo (char* text); 

    class aFilterL 
    { 
     friend class myPlugin; 
    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; 

     virtual float aFilterMethodL (float a0, float a1, float a2, float b1, float b2, float inputL, float prevInput1L, float 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 myPlugin; 
    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; 

     virtual 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; 
     } 
    }; 
    /* LOOK HERE */ 
private: 
    aFilterL filterL; 
    aFilterR filterR; 
}; 


myPlugin::myPlugin (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 1, 1), filterL(), /* LOOK HERE */ filterR() /* LOOK HERE */ { 

    setNumInputs (2); // stereo in 
    setNumOutputs (2); // stereo out 
    setUniqueID ('Gain'); // identify 
    canProcessReplacing(); // supports replacing output 
    canDoubleReplacing(); // supports double precision processing 

    /* LOOK HERE */ 
    //myPlugin *my_aFilter1L = new aFilterL(); 
    //myPlugin *my_aFilter1R = new aFilterR(); 
} 

嵌套類只是一個聲明(有點像一個命名空間,但你有一些關於可見性的附加選項)。在這個範圍內聲明一個類不會自動爲過濾器添加效果,您仍然必須將它們完全聲明爲該類的任何靜態或實例變量。

+0

非常感謝你!這似乎解決了它!一旦我有了名譽,就會確保你的答案投票! – 2011-02-03 11:35:48