diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2005-03-16 04:59:36 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2005-03-16 04:59:36 +0000 |
commit | 4fe8863a1176f7fe4057d82b2844dd7127b13bca (patch) | |
tree | d46f9bb330d4686f797a426304cd58092908aff1 /externals/grill/vst/src/main.cpp | |
parent | 4d4f8d07f3341e8309c1b066263a40227664bc3d (diff) |
much cleaner Window GUI code
fixed bug with param method
updated build system
minimal
feedback attribute for parameter reporting
clean handling of plugin deletion (potentially open editor window etc.)
updated for new flext function naming
names containing spaces are now correctly dumped
added event processing (like Midi in)
more consistent MIDI functionality
trying to catch crashing plugins
svn path=/trunk/; revision=2630
Diffstat (limited to 'externals/grill/vst/src/main.cpp')
-rw-r--r-- | externals/grill/vst/src/main.cpp | 126 |
1 files changed, 64 insertions, 62 deletions
diff --git a/externals/grill/vst/src/main.cpp b/externals/grill/vst/src/main.cpp index 9a4b3a6c..d1c369c3 100644 --- a/externals/grill/vst/src/main.cpp +++ b/externals/grill/vst/src/main.cpp @@ -26,7 +26,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #endif -#define VST_VERSION "0.1.0pre21" +#define VST_VERSION "0.1.0pre23" class vst @@ -64,12 +64,19 @@ protected: void mg_winx(int &x) const { x = plug?plug->GetX():0; } void mg_winy(int &y) const { y = plug?plug->GetY():0; } + void mg_winw(int &x) const { x = plug?plug->GetW():0; } + void mg_winh(int &y) const { y = plug?plug->GetH():0; } void ms_winx(int x) { if(plug) plug->SetX(x); } void ms_winy(int y) { if(plug) plug->SetY(y); } + void ms_winw(int x) { if(plug) plug->SetW(x); } + void ms_winh(int y) { if(plug) plug->SetH(y); } void ms_wincaption(bool c) { if(plug) plug->SetCaption(c); } void mg_wincaption(bool &c) const { c = plug && plug->GetCaption(); } + void ms_winhandle(bool c) { if(plug) plug->SetHandle(c); } + void mg_winhandle(bool &c) const { c = plug && plug->GetHandle(); } void ms_wintitle(const AtomList &t); void mg_wintitle(AtomList &t) const { if(plug) { t(1); SetString(t[0],plug->GetTitle()); } } + void m_winfront() const { if(plug) plug->ToFront(); } void mg_chnsin(int &c) const { c = plug?plug->GetNumInputs():0; } void mg_chnsout(int &c) const { c = plug?plug->GetNumOutputs():0; } @@ -98,13 +105,19 @@ protected: void m_ptext(int pnum); void m_ptexts(int argc,const t_atom *argv); -// void m_control(const t_symbol *ctrl_name,int ctrl_value); - void m_pitchbend(int ctrl_value) { if(plug) plug->AddPitchBend(ctrl_value ); } - void m_programchange(int ctrl_value) { if(plug) plug->AddProgramChange(ctrl_value ); } - void m_aftertouch(int ctrl_value) { if(plug) plug->AddAftertouch(ctrl_value ); } - void m_ctrlchange(int control,int ctrl_value) { if(plug) plug->AddControlChange(control,ctrl_value ); } + void mg_channel(int &chn) const { chn = plug?plug->GetChannel():0; } + void ms_channel(int chn) { if(plug) plug->SetChannel(chn); } + void m_note(int note,int vel); void m_noteoff(int note) { m_note(note,0); } + void m_programchange(int ctrl_value) { if(plug) plug->AddProgramChange(ctrl_value); } + void m_ctrlchange(int control,int ctrl_value) { if(plug) plug->AddControlChange(control,ctrl_value); } + void m_aftertouch(int ctrl_value) { if(plug) plug->AddAftertouch(ctrl_value); } + void m_polyaftertouch(int note,int ctrl_value) { if(plug) plug->AddPolyAftertouch(note,ctrl_value); } + void m_pitchbend(int ctrl_value) { if(plug) plug->AddPitchBend(ctrl_value); } + + void mg_dumpevents(bool &ev) const { ev = plug?plug->GetEvents():false; } + void ms_dumpevents(bool ev) { if(plug) plug->SetEvents(ev); } void mg_playing(bool &p) { p = plug && plug->GetPlaying(); } void ms_playing(bool p) { if(plug) plug->SetPlaying(p); } @@ -140,7 +153,7 @@ private: VSTPlugin *plug; std::string plugname,subplug; - bool echoparam,visible,bypass,mute; + bool visible,bypass,mute; int paramnames; int blsz; @@ -171,12 +184,17 @@ private: FLEXT_ATTRVAR_B(bypass) FLEXT_ATTRVAR_B(mute) -// FLEXT_CALLBACK_2(m_control,t_symptr,int) - FLEXT_CALLBACK_I(m_pitchbend) - FLEXT_CALLBACK_I(m_aftertouch) - FLEXT_CALLBACK_I(m_programchange) + FLEXT_CALLVAR_I(mg_channel,ms_channel) + FLEXT_CALLBACK_II(m_note) + FLEXT_CALLBACK_I(m_noteoff) FLEXT_CALLBACK_II(m_ctrlchange) + FLEXT_CALLBACK_I(m_aftertouch) + FLEXT_CALLBACK_II(m_polyaftertouch) + FLEXT_CALLBACK_I(m_pitchbend) + + FLEXT_CALLVAR_B(mg_dumpevents,ms_dumpevents) + FLEXT_CALLBACK_I(m_programchange) FLEXT_CALLVAR_I(mg_program,ms_program) FLEXT_CALLBACK_V(mg_progname) @@ -190,14 +208,14 @@ private: FLEXT_CALLBACK_I(m_ptext) FLEXT_CALLBACK_V(m_ptexts) - FLEXT_CALLBACK_II(m_note) - FLEXT_CALLBACK_I(m_noteoff) - - FLEXT_ATTRVAR_B(echoparam) FLEXT_CALLVAR_I(mg_winx,ms_winx) FLEXT_CALLVAR_I(mg_winy,ms_winy) + FLEXT_CALLVAR_I(mg_winw,ms_winw) + FLEXT_CALLVAR_I(mg_winh,ms_winh) FLEXT_CALLVAR_B(mg_wincaption,ms_wincaption) + FLEXT_CALLVAR_B(mg_winhandle,ms_winhandle) FLEXT_CALLVAR_V(mg_wintitle,ms_wintitle) + FLEXT_CALLBACK(m_winfront) FLEXT_CALLGET_I(mg_chnsin) FLEXT_CALLGET_I(mg_chnsout) @@ -250,12 +268,15 @@ void vst::Setup(t_classid c) FLEXT_CADDATTR_VAR1(c,"mute",mute); FLEXT_CADDMETHOD_(c,0,"print",m_print); - FLEXT_CADDMETHOD_II(c,0,"note",m_note); + FLEXT_CADDATTR_VAR(c,"channel",mg_channel,ms_channel); FLEXT_CADDMETHOD_I(c,0,"noteoff",m_noteoff); -// FLEXT_CADDMETHOD_2(c,0,"control",m_control,t_symptr,int); - FLEXT_CADDMETHOD_(c,0,"pbend",m_pitchbend); - FLEXT_CADDMETHOD_(c,0,"atouch",m_aftertouch); + FLEXT_CADDMETHOD_II(c,0,"note",m_note); + FLEXT_CADDMETHOD_II(c,0,"patouch",m_polyaftertouch); FLEXT_CADDMETHOD_II(c,0,"ctlchg",m_ctrlchange); + FLEXT_CADDMETHOD_(c,0,"atouch",m_aftertouch); + FLEXT_CADDMETHOD_(c,0,"pbend",m_pitchbend); + + FLEXT_CADDATTR_VAR(c,"events",mg_dumpevents,ms_dumpevents); FLEXT_CADDMETHOD_(c,0,"progchg",m_programchange); FLEXT_CADDATTR_VAR(c,"program",mg_program,ms_program); @@ -270,11 +291,14 @@ void vst::Setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"getptext",m_ptext); FLEXT_CADDMETHOD_(c,0,"getptext",m_ptexts); - FLEXT_CADDATTR_VAR1(c,"echo",echoparam); FLEXT_CADDATTR_VAR(c,"x",mg_winx,ms_winx); FLEXT_CADDATTR_VAR(c,"y",mg_winy,ms_winy); - FLEXT_CADDATTR_VAR(c,"caption",mg_wincaption,ms_wincaption); + FLEXT_CADDATTR_VAR(c,"w",mg_winw,ms_winw); + FLEXT_CADDATTR_VAR(c,"h",mg_winh,ms_winh); FLEXT_CADDATTR_VAR(c,"title",mg_wintitle,ms_wintitle); + FLEXT_CADDATTR_VAR(c,"caption",mg_wincaption,ms_wincaption); + FLEXT_CADDATTR_VAR(c,"handle",mg_winhandle,ms_winhandle); + FLEXT_CADDMETHOD_(c,0,"front",m_winfront); FLEXT_CADDATTR_GET(c,"ins",mg_chnsin); FLEXT_CADDATTR_GET(c,"outs",mg_chnsout); @@ -318,7 +342,7 @@ vst::vst(int argc,const t_atom *argv): plug(NULL),visible(false), blsz(0), vstfun(NULL),vstin(NULL),vstout(NULL),tmpin(NULL),tmpout(NULL), - echoparam(false),bypass(false),mute(false),paramnames(0) + bypass(false),mute(false),paramnames(0) { #if FLEXT_OS == FLEXT_OS_WIN // this is necessary for Waveshell @@ -346,9 +370,9 @@ vst::~vst() void vst::ClearPlug() { if(plug) { - plug->Edit(false); ClearBuf(); // needs valid plug - delete plug; plug = NULL; + VSTPlugin::Delete(plug); + plug = NULL; } } @@ -440,15 +464,17 @@ static std::string findFilePath(const std::string &path,const std::string &dllna return std::string(); } - +// \todo this should be in the background, because it can take some time +// ideally vst would get a response from VSTPlugin when readily, loaded and +// vst would dump out a respective signal to the patcher bool vst::LoadPlug() { if(plug) ClearPlug(); - plug = new VSTPlugin(this); + VSTPlugin *p = VSTPlugin::New(this); // try loading the dll from the raw filename - bool ok = plug->Instance(plugname.c_str(),subplug.c_str()); + bool ok = p->Instance(plugname.c_str(),subplug.c_str()); if(ok) FLEXT_LOG("raw filename loaded fine"); else { @@ -468,7 +494,7 @@ bool vst::LoadPlug() dllname += "\\"; dllname += name; - ok = plug->Instance(dllname.c_str()); + ok = p->Instance(dllname.c_str()); } #endif } @@ -497,7 +523,7 @@ bool vst::LoadPlug() realpath += plugname; FLEXT_LOG1("trying %s",(const char *)realpath.c_str()); - ok = plug->Instance(realpath.c_str()); + ok = p->Instance(realpath.c_str()); if(ok) { FLEXT_LOG("plugin loaded via VST_PATH"); break; @@ -505,7 +531,7 @@ bool vst::LoadPlug() } tok = strtok( NULL , ";" ); - if(!tok) post("%s - couldn't find plugin",thisName()); +// if(!tok) post("%s - couldn't find plugin",thisName()); } delete[] tok_path; @@ -514,10 +540,12 @@ bool vst::LoadPlug() if(!ok) { post("%s - unable to load plugin '%s'",thisName(),plugname.c_str()); - ClearPlug(); + VSTPlugin::Delete(p); } - else + else { + plug = p; InitPlug(); + } return ok; } @@ -674,32 +702,6 @@ void vst::CbSignal() flext_dsp::CbSignal(); } - -#if 0 - -void vst::m_control(const t_symbol *ctrl_name,int ctrl_value) -{ - if(!plug) return; - - int parm_num = 0; - - if (!*GetString(ctrl_name) || !strlen(GetString(ctrl_name))) { - error ("plugin~: control messages must have a name and a value"); - return; - } - //parm_num = vst_tilde_get_parm_number (x, ctrl_name->s_name); - //if (parm_num) - //{ - //vst_tilde_set_control_input_by_index (x, parm_num - 1, ctrl_value); - //} - //else - //{ - //vst_tilde_set_control_input_by_name (x, ctrl_name->s_name, ctrl_value); - //} -} - -#endif - void vst::mg_progname(int argc,const t_atom *argv) const { if(plug) { @@ -788,8 +790,8 @@ void vst::m_print(int ac,const t_atom *av) } if ( header ) { - post("VST~ plugin: %s " , plug->GetName() ); - post("made by: %s " , plug->GetVendorName() ); + post("VST~ plugin: %s ", plug->GetName() ); + post("made by: %s ", plug->GetVendorName() ); post("parameters %d\naudio: %d in(s)/%d out(s) \nLoaded from library \"%s\".\n", plug->GetNumParams(), CntInSig(), @@ -868,12 +870,12 @@ void vst::ms_param(int pnum,float val) { if(!plug || pnum < 0 || pnum >= plug->GetNumParams()) return; - float xval = plug->GetParamValue( pnum ); +// float xval = plug->GetParamValue( pnum ); // if(xval <= 1.0f) // What's that???? if(true) { plug->SetParamFloat( pnum, val ); - if(echoparam) display_parameter(pnum , true ); +// if(echoparam) display_parameter(pnum , true ); } else FLEXT_ASSERT(false); |