Update of /cvsroot/pure-data/externals/grill/vst/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14627/src
Modified Files: Editor.h EditorWin.cpp VstHost.cpp VstHost.h main.cpp Log Message: ""
Index: Editor.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/vst/src/Editor.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Editor.h 23 Jan 2004 04:20:14 -0000 1.1 --- Editor.h 27 Jan 2004 03:41:26 -0000 1.2 *************** *** 17,20 **** --- 17,23 ---- void StopEditor(VSTPlugin *p); void ShowEditor(VSTPlugin *p,bool show); + void MoveEditor(VSTPlugin *p,int x,int y); + void SizeEditor(VSTPlugin *p,int x,int y); + bool IsEditorShown(const VSTPlugin *p);
#endif // __EDITOR_H
Index: EditorWin.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/vst/src/EditorWin.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** EditorWin.cpp 23 Jan 2004 04:20:36 -0000 1.1 --- EditorWin.cpp 27 Jan 2004 03:41:26 -0000 1.2 *************** *** 40,44 **** case WM_CREATE: // Initialize the window. ! plug->SetEditWindow(hwnd); break; case WM_CLOSE: --- 40,44 ---- case WM_CREATE: // Initialize the window. ! plug->StartEditing(hwnd); break; case WM_CLOSE: *************** *** 55,65 **** plug->EditorIdle(); break; ! case WM_MOVE: ! plug->setPos(LOWORD(lp),HIWORD(lp)); break; /* ! case WM_PAINT: // Paint the window's client area. break; case WM_SIZE: // Set the size and position of the window. --- 55,73 ---- plug->EditorIdle(); break; ! case WM_MOVE: { ! WORD x = LOWORD(lp),y = HIWORD(lp); ! plug->SetPos(reinterpret_cast<short &>(x),reinterpret_cast<short &>(y),false); break; + } /* ! case WM_PAINT: { // Paint the window's client area. + RECT rect; + GetUpdateRect(hwnd,rect,FALSE); + plug->Paint(rect); break; + } + */ + /* case WM_SIZE: // Set the size and position of the window. *************** *** 113,118 **** SetTimer(wnd,0,25,NULL);
! RECT r = plug->GetEditorRect(); ! SetWindowPos(wnd,HWND_TOPMOST,plug->getX(),plug->getY(),(r.right - r.left) + 6 , r.bottom - r.top + 26 , SWP_SHOWWINDOW); // ShowWindow( SW_SHOW ); // BringWindowToTop(wnd); --- 121,129 ---- SetTimer(wnd,0,25,NULL);
! ERect r; ! plug->GetEditorRect(r); ! // SetWindowPos(wnd,HWND_TOP,plug->getX(),plug->getY(),(r.right - r.left) + 6 , r.bottom - r.top + 26 , SWP_SHOWWINDOW); ! SetWindowPos(wnd,HWND_TOP,r.left,r.top,(r.right - r.left) + 6 , r.bottom - r.top + 26 , SWP_SHOWWINDOW); ! // ShowWindow( SW_SHOW ); // BringWindowToTop(wnd); *************** *** 178,180 **** --- 189,207 ---- }
+ void MoveEditor(VSTPlugin *p,int x,int y) + { + // the client region must be taken into account + // SetWindowPos(p->EditorHandle(),NULL,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER); + } + + void SizeEditor(VSTPlugin *p,int x,int y) + { + SetWindowPos(p->EditorHandle(),NULL,0,0,x,y,SWP_NOMOVE|SWP_NOZORDER); + } + + bool IsEditorShown(const VSTPlugin *p) + { + return IsWindowVisible(p->EditorHandle()) != FALSE; + } + #endif // FLEXT_OS_WIN
Index: VstHost.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/vst/src/VstHost.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** VstHost.cpp 23 Jan 2004 04:20:36 -0000 1.6 --- VstHost.cpp 27 Jan 2004 03:41:26 -0000 1.7 *************** *** 10,98 **** #include "Editor.h" #include "VstHost.h" - #include "vst\aeffeditor.h" #include "vst\aeffectx.h"
using namespace std;
! VstTimeInfo VSTPlugin::_timeInfo;
! float VSTPlugin::sample_rate = 44100;
- //////////////////// - // - ///////////////////// VSTPlugin::VSTPlugin(): posx(0),posy(0), ! hwnd(NULL), ! _editor(false) ! { ! queue_size=0; ! _sDllName = NULL; ! h_dll=NULL; ! instantiated=false; // Constructin' with no instance ! overwrite = false; ! // wantidle = false; ! // show_params = false; ! _midichannel = 0; ! }
VSTPlugin::~VSTPlugin() { Free(); // Call free - delete _sDllName; // if _sDllName = NULL , the operation does nothing -> it's safe. }
! int VSTPlugin::Instance( const char *dllname) { h_dll = LoadLibrary(dllname); ! ! if(!h_dll) { return VSTINSTANCE_ERR_NO_VALID_FILE; - }
- // post("Loaded library %s" , dllname); PVSTMAIN main = (PVSTMAIN)GetProcAddress(h_dll,"main"); if(!main) { FreeLibrary(h_dll); ! _pEffect=NULL; ! instantiated=false; return VSTINSTANCE_ERR_NO_VST_PLUGIN; } ! //post("Found main function - about to call it"); //This calls the "main" function and receives the pointer to the AEffect structure. ! _pEffect = main((audioMasterCallback)&(this->Master)); ! ! if(!_pEffect) { ! post("VST plugin : unable to create effect"); ! FreeLibrary(h_dll); ! _pEffect=NULL; ! instantiated=false; ! return VSTINSTANCE_ERR_REJECTED; ! } ! if( _pEffect->magic!=kEffectMagic) { ! post("VST plugin : Instance query rejected by 0x%.8X\n",(int)_pEffect); ! FreeLibrary(h_dll); ! _pEffect=NULL; ! instantiated=false; ! return VSTINSTANCE_ERR_REJECTED; ! } ! ! //post("VST plugin : Instanced at (Effect*): %.8X\n",(int)_pEffect);
//init plugin _pEffect->user = this; ! Dispatch( effOpen , 0, 0, NULL, 0.0f); ! Dispatch( effSetProgram , 0, 0, NULL, 0.0f); ! // Dispatch( effMainsChanged, 0, 1, NULL, 0.0f); ! ! //************************************set samplerate and stream size here ! // we get it when we init our DSP ! ! // Dispatch( effSetSampleRate, 0, 0, NULL, (float)Global::pConfig->_pOutputDriver->_samplesPerSec); ! // Dispatch( effSetBlockSize, 0, STREAM_SIZE, NULL, 0.0f);
- if (!Dispatch( effGetProductString, 0, 0, &_sProductName, 0.0f)) { string str1(dllname); --- 10,62 ---- #include "Editor.h" #include "VstHost.h" #include "vst\aeffectx.h"
using namespace std;
! static VstTimeInfo _timeInfo;
! typedef AEffect *(*PVSTMAIN)(audioMasterCallback audioMaster);
VSTPlugin::VSTPlugin(): + h_dll(NULL),hwnd(NULL),_pEffect(NULL), posx(0),posy(0), ! _midichannel(0),queue_size(0) ! {}
VSTPlugin::~VSTPlugin() { Free(); // Call free }
! int VSTPlugin::Instance(const char *dllname) { h_dll = LoadLibrary(dllname); ! if(!h_dll) return VSTINSTANCE_ERR_NO_VALID_FILE;
PVSTMAIN main = (PVSTMAIN)GetProcAddress(h_dll,"main"); if(!main) { FreeLibrary(h_dll); ! _pEffect = NULL; return VSTINSTANCE_ERR_NO_VST_PLUGIN; } ! //This calls the "main" function and receives the pointer to the AEffect structure. ! _pEffect = main((audioMasterCallback)Master); ! if(!_pEffect || _pEffect->magic != kEffectMagic) { ! post("VST plugin : Unable to create effect");
+ _pEffect = NULL; + FreeLibrary(h_dll); h_dll = NULL; + return VSTINSTANCE_ERR_REJECTED; + } + //init plugin _pEffect->user = this; ! FLEXT_ASSERT(Dispatch( effOpen )); ! // Dispatch( effMainsChanged, 0, 1);
if (!Dispatch( effGetProductString, 0, 0, &_sProductName, 0.0f)) { string str1(dllname); *************** *** 106,146 **** } ! if (!_pEffect->dispatcher(_pEffect, effGetVendorString, 0, 0, &_sVendorName, 0.0f)) { strcpy(_sVendorName, "Unknown vendor"); - } - - _version = _pEffect->version; - _isSynth = (_pEffect->flags & effFlagsIsSynth)?true:false; - overwrite = (_pEffect->flags & effFlagsCanReplacing)?true:false; - _editor = (_pEffect->flags & effFlagsHasEditor)?true:false;
! if ( _sDllName != NULL ) delete _sDllName; ! _sDllName = new char[strlen(dllname)+1]; ! sprintf(_sDllName,dllname); ! - //keep plugin name - instantiated=true; - return VSTINSTANCE_NO_ERROR; }
- int VSTPlugin::getNumInputs( void ) - { - return _pEffect->numInputs; - } - - int VSTPlugin::getNumOutputs( void ) - { - return _pEffect->numOutputs; - } -
void VSTPlugin::Create(VSTPlugin *plug) { ! h_dll=plug->h_dll; ! _pEffect=plug->_pEffect; ! _pEffect->user=this; ! Dispatch( effMainsChanged, 0, 1, NULL, 0.0f); // strcpy(_editName,plug->_editName); On current implementation, this replaces the right one. strcpy(_sProductName,plug->_sProductName); --- 70,90 ---- } ! if(!Dispatch( effGetVendorString, 0, 0, &_sVendorName, 0.0f)) strcpy(_sVendorName, "Unknown vendor");
! _sDllName = dllname; return VSTINSTANCE_NO_ERROR; }
+ /* void VSTPlugin::Create(VSTPlugin *plug) { ! h_dll = plug->h_dll; ! _pEffect = plug->_pEffect; ! _pEffect->user = this; ! ! Dispatch( effMainsChanged, 0, 1); // strcpy(_editName,plug->_editName); On current implementation, this replaces the right one. strcpy(_sProductName,plug->_sProductName); *************** *** 158,195 **** instantiated=true; }
void VSTPlugin::Free() // Called also in destruction { ! if(IsEdited()) StopEditor(this);
- if(instantiated) { - instantiated=false; - post("VST plugin : Free query 0x%.8X\n",(int)_pEffect); - _pEffect->user = NULL; - Dispatch( effMainsChanged, 0, 0, NULL, 0.0f); - Dispatch( effClose, 0, 0, NULL, 0.0f); // delete _pEffect; // <- Should check for the necessity of this command. ! _pEffect=NULL; ! FreeLibrary(h_dll); } }
! void VSTPlugin::Init( float samplerate , float blocksize ) { ! sample_rate = samplerate; ! Dispatch(effOpen , 0, 0, NULL, 0.f); ! Dispatch(effMainsChanged, 0, 1, NULL, 0.f); ! Dispatch(effSetSampleRate, 0, 0, 0, (float) sample_rate ); ! Dispatch(effSetBlockSize, 0, blocksize, NULL, 0.f ); }
! bool VSTPlugin::DescribeValue(int p,char* psTxt) { ! int parameter = p; ! if(instantiated) ! { ! if(parameter<_pEffect->numParams) ! { // char par_name[64]; char par_display[64]; --- 102,153 ---- instantiated=true; } + */
void VSTPlugin::Free() // Called also in destruction { ! if(Is()) { ! if(IsEdited()) StopEditor(this); ! ! // shut down plugin ! Dispatch(effMainsChanged, 0, 0); ! Dispatch(effClose);
// delete _pEffect; // <- Should check for the necessity of this command. ! _pEffect = NULL; ! if(h_dll) { FreeLibrary(h_dll); h_dll = NULL; } } }
! void VSTPlugin::DspInit(float samplerate,int blocksize) { ! // sample_rate = samplerate; ! ! Dispatch(effMainsChanged, 0, 1); ! Dispatch(effSetSampleRate, 0, 0,NULL,samplerate); ! Dispatch(effSetBlockSize, 0, blocksize); }
+ void VSTPlugin::GetParamName(int numparam,char *name) const + { + if(numparam < GetNumParams()) + Dispatch(effGetParamName,numparam,0,name,0.0f); + else + strcpy(name,"Index out of Range"); + }
! bool VSTPlugin::SetParamFloat(int parameter,float value) { ! if(Is() && parameter >= 0 && parameter < GetNumParams()) { ! _pEffect->setParameter(_pEffect,parameter,value); ! return true; ! } ! else ! return false; ! } ! ! void VSTPlugin::GetParamValue(int numparam,char *parval) const ! { ! if(Is()) { ! if(numparam < GetNumParams()) { // char par_name[64]; char par_display[64]; *************** *** 197,251 ****
// Dispatch(effGetParamName,parameter,0,par_name,0.0f); ! Dispatch(effGetParamDisplay,parameter,0,par_display,0.0f); ! Dispatch(effGetParamLabel,parameter,0,par_label,0.0f); // sprintf(psTxt,"%s:%s%s",par_name,par_display,par_label); ! sprintf(psTxt,"%s%s",par_display,par_label); ! return true; ! } ! else sprintf(psTxt,"NumParams Exeeded"); ! } ! else sprintf(psTxt,"Not loaded"); ! ! return false; }
! bool VSTPlugin::SetParameter(int parameter, float value) { ! if(instantiated) ! { ! if (( parameter >= 0 ) && (parameter<=_pEffect->numParams)) ! { ! _pEffect->setParameter(_pEffect,parameter,value); ! return true; ! } ! }
! return false; }
! bool VSTPlugin::SetParameter(int parameter, int value) { ! return SetParameter(parameter,value/65535.0f); }
! int VSTPlugin::GetCurrentProgram() ! { ! if(instantiated) ! return Dispatch(effGetProgram,0,0,NULL,0.0f); ! else ! return 0; }
! void VSTPlugin::SetCurrentProgram(int prg) ! { ! if(instantiated) ! Dispatch(effSetProgram,0,prg,NULL,0.0f); }
bool VSTPlugin::AddMIDI(unsigned char data0,unsigned char data1,unsigned char data2) { ! if (instantiated) ! { ! VstMidiEvent* pevent=&midievent[queue_size];
pevent->type = kVstMidiType; --- 155,216 ----
// Dispatch(effGetParamName,parameter,0,par_name,0.0f); ! Dispatch(effGetParamDisplay,numparam,0,par_display,0.0f); ! Dispatch(effGetParamLabel,numparam,0,par_label,0.0f); // sprintf(psTxt,"%s:%s%s",par_name,par_display,par_label); ! sprintf(parval,"%s%s",par_display,par_label); ! } ! else ! strcpy(parval,"Index out of range"); ! } ! else ! strcpy(parval,"Plugin not loaded"); }
! float VSTPlugin::GetParamValue(int numparam) const { ! if(Is() && numparam < GetNumParams()) ! return _pEffect->getParameter(_pEffect, numparam); ! else ! return -1.0; ! }
! void VSTPlugin::Edit(bool open) ! { ! if(Is()) { ! if(open) { ! if(HasEditor() && !IsEdited()) ! StartEditor(this); ! } ! else if(IsEdited()) ! StopEditor(this); ! } }
! void VSTPlugin::StartEditing(WHandle h) { ! FLEXT_ASSERT(h != NULL); ! Dispatch(effEditOpen,0,0,hwnd = h); }
! void VSTPlugin::StopEditing() ! { ! Dispatch(effEditClose); ! hwnd = NULL; }
! void VSTPlugin::Visible(bool vis) ! { ! if(Is() && IsEdited()) ShowEditor(this,vis); ! } ! ! bool VSTPlugin::IsVisible() const ! { ! return Is() && IsEdited() && IsEditorShown(this); }
bool VSTPlugin::AddMIDI(unsigned char data0,unsigned char data1,unsigned char data2) { ! if(Is()) { ! VstMidiEvent* pevent = &midievent[queue_size];
pevent->type = kVstMidiType; *************** *** 274,289 **** void VSTPlugin::SendMidi() { ! if(/*instantiated &&*/ queue_size>0) ! { // Prepare MIDI events and free queue dispatching all events events.numEvents = queue_size; events.reserved = 0; ! for(int q=0;q<queue_size;q++) events.events[q] = (VstEvent*)&midievent[q]; Dispatch(effProcessEvents, 0, 0, &events, 0.0f); ! queue_size=0; } }
void VSTPlugin::processReplacing( float **inputs, float **outputs, long sampleframes ) --- 239,310 ---- void VSTPlugin::SendMidi() { ! if(Is() && queue_size > 0) { // Prepare MIDI events and free queue dispatching all events events.numEvents = queue_size; events.reserved = 0; ! for(int q = 0; q < queue_size; q++) ! events.events[q] = (VstEvent*)&midievent[q]; Dispatch(effProcessEvents, 0, 0, &events, 0.0f); ! queue_size = 0; } }
+ static int range(int value,int mn = 0,int mx = 127) + { + return value < mn?mn:(value > mx?mx:value); + } + + bool VSTPlugin::AddNoteOn( unsigned char note,unsigned char speed,unsigned char midichannel) + { + return AddMIDI((char)MIDI_NOTEON | midichannel,note,speed); + } + + bool VSTPlugin::AddNoteOff( unsigned char note,unsigned char midichannel) + { + return AddMIDI((char)MIDI_NOTEOFF | midichannel,note,0); + } + + void VSTPlugin::AddAftertouch(int value) + { + AddMIDI( (char)MIDI_NOTEOFF | _midichannel , range(value) ); + } + + void VSTPlugin::AddPitchBend(int value) + { + AddMIDI( MIDI_PITCHBEND + (_midichannel & 0xf) , ((value>>7) & 127), (value & 127)); + } + + void VSTPlugin::AddProgramChange(int value) + { + AddMIDI( MIDI_PROGRAMCHANGE + (_midichannel & 0xf), range(value), 0); + } + + void VSTPlugin::AddControlChange(int control, int value) + { + AddMIDI( MIDI_CONTROLCHANGE + (_midichannel & 0xf), range(control), range(value)); + } + + + bool VSTPlugin::GetProgramName( int cat , int p, char *buf) const + { + int parameter = p; + if(parameter < GetNumPrograms()) { + Dispatch(effGetProgramNameIndexed,parameter,cat,buf,0.0f); + return true; + } + else + return false; + } + + void VSTPlugin::SetPos(int x,int y,bool upd) + { + if(Is()) { + posx = x; posy = y; + if(upd && IsEdited()) MoveEditor(this,posx,posy); + } + } + +
void VSTPlugin::processReplacing( float **inputs, float **outputs, long sampleframes ) *************** *** 298,311 **** }
// Host callback dispatcher long VSTPlugin::Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt) { ! #if 0 ! if(!effect) { ! FLEXT_LOG("effect = NULL"); return 0; } ! #endif
#ifdef FLEXT_DEBUG --- 319,347 ---- }
+ #if 1
// Host callback dispatcher long VSTPlugin::Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt) { ! switch (opcode) { ! case audioMasterVersion: ! return 2; ! case audioMasterCurrentId: ! return 'AASH'; ! default: ! #ifdef FLEXT_DEBUG ! post("VST -> host: Eff = 0x%.8X, Opcode = %d, Index = %d, Value = %d, PTR = %.8X, OPT = %.3f\n",(int)effect, opcode,index,value,(int)ptr,opt); ! #endif return 0; } ! } ! ! #else ! ! // Host callback dispatcher ! long VSTPlugin::Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt) ! { ! VSTPlugin *th = effect?(VSTPlugin *)effect->user:NULL; ! if(!th) FLEXT_LOG("No this");
#ifdef FLEXT_DEBUG *************** *** 332,346 **** case audioMasterPinConnected: ! if (value == 0) //input ! { ! if ( index < 2) return 0; ! else return 1; ! } ! else //output ! { ! if ( index < 2) return 0; ! else return 1; ! } ! return 0; // inquire if an input or output is beeing connected; /* case audioMasterWantMidi: --- 368,376 ---- case audioMasterPinConnected: ! if(value == 0) ! return index < 2?0:1; //input ! else ! return index < 2?0:1; //output ! /* case audioMasterWantMidi: *************** *** 353,357 **** memset(&_timeInfo, 0, sizeof(_timeInfo)); _timeInfo.samplePos = 0; ! _timeInfo.sampleRate = sample_rate; return (long)&_timeInfo; --- 383,387 ---- memset(&_timeInfo, 0, sizeof(_timeInfo)); _timeInfo.samplePos = 0; ! _timeInfo.sampleRate = th?th->sample_rate:0; return (long)&_timeInfo; *************** *** 365,369 ****
case audioMasterGetSampleRate: ! return sample_rate;
case audioMasterGetVendorString: // Just fooling version string --- 395,399 ----
case audioMasterGetSampleRate: ! return th?(long)th->sample_rate:0;
case audioMasterGetVendorString: // Just fooling version string *************** *** 375,386 ****
case audioMasterGetProductString: // Just fooling product string ! strcpy((char*)ptr,"Cubase 5.0"); return 0;
case audioMasterVendorSpecific: ! { ! return 0; ! } !
case audioMasterGetLanguage: --- 405,413 ----
case audioMasterGetProductString: // Just fooling product string ! strcpy((char *)ptr,"Cubase 5.0"); return 0;
case audioMasterVendorSpecific: ! return 0;
case audioMasterGetLanguage: *************** *** 388,401 **** case audioMasterUpdateDisplay: ! #ifdef FLEXT_DEBUG ! post("audioMasterUpdateDisplay"); ! #endif effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f); return 0;
case audioMasterCanDo: ! if (!strcmp((char*)ptr,"sendVstEvents")) return 1; ! if (!strcmp((char*)ptr,"sendVstMidiEvent")) return 1; ! if (!strcmp((char*)ptr,"sendVstTimeInfo")) return 1; // "receiveVstEvents", // "receiveVstMidiEvent", --- 415,426 ---- case audioMasterUpdateDisplay: ! FLEXT_LOG("audioMasterUpdateDisplay"); effect->dispatcher(effect, effEditIdle, 0, 0, NULL, 0.0f); return 0;
case audioMasterCanDo: ! if (!strcmp((char *)ptr,"sendVstEvents")) return 1; ! else if (!strcmp((char *)ptr,"sendVstMidiEvent")) return 1; ! else if (!strcmp((char *)ptr,"sendVstTimeInfo")) return 1; // "receiveVstEvents", // "receiveVstMidiEvent", *************** *** 404,409 **** // "reportConnectionChanges", // "acceptIOChanges", ! if (!strcmp((char*)ptr,"sizeWindow")) return 1; ! if (!strcmp((char*)ptr,"supplyIdle")) return 1; return -1; --- 429,434 ---- // "reportConnectionChanges", // "acceptIOChanges", ! // else if (!strcmp((char*)ptr,"sizeWindow")) return 1; ! else if (!strcmp((char*)ptr,"supplyIdle")) return 1; return -1; *************** *** 434,438 **** // case audioMasterUpdateDisplay: post("VST master dispatcher: audioMasterUpdateDisplay");break;
! default: post("VST master dispatcher: undefed: %d , %d",opcode , effKeysRequired ) ;break; } --- 459,466 ---- // case audioMasterUpdateDisplay: post("VST master dispatcher: audioMasterUpdateDisplay");break;
! #ifdef FLEXT_DEBUG ! default: ! post("VST master dispatcher: undefed: %d , %d",opcode , effKeysRequired ); ! #endif } *************** *** 440,569 **** }
! bool VSTPlugin::AddNoteOn( unsigned char note,unsigned char speed,unsigned char midichannel) ! { ! return AddMIDI((char)MIDI_NOTEON | midichannel,note,speed); ! } ! ! bool VSTPlugin::AddNoteOff( unsigned char note,unsigned char midichannel) ! { ! return AddMIDI((char)MIDI_NOTEOFF | midichannel,note,0); ! } ! ! ! bool VSTPlugin::replace() ! { ! return overwrite; ! } ! ! ! void VSTPlugin::edit(bool open) ! { ! if(instantiated) { ! if(open) { ! if(HasEditor() && !IsEdited()) ! StartEditor(this); ! } ! else if(IsEdited()) ! StopEditor(this); ! } ! } ! ! void VSTPlugin::visible(bool vis) ! { ! if(instantiated && IsEdited()) ShowEditor(this,vis); ! } ! ! void VSTPlugin::EditorIdle() ! { ! FLEXT_ASSERT(hwnd != NULL); ! Dispatch(effEditIdle,0,0, hwnd,0.0f); ! } ! ! RECT VSTPlugin::GetEditorRect() ! { ! RECT ret; ! ERect *r; ! Dispatch(effEditGetRect,0,0, &r,0.0f); ! ret.top = r->top; ! ret.bottom = r->bottom; ! ret.left = r->left; ! ret.right = r->right; ! return ret; ! } ! ! void VSTPlugin::SetEditWindow(HWND h) ! { ! hwnd = h; ! FLEXT_ASSERT(hwnd != NULL); ! Dispatch(effEditOpen,0,0, hwnd,0.0f); ! } ! ! void VSTPlugin::OnEditorClose() ! { ! FLEXT_ASSERT(hwnd != NULL); ! Dispatch(effEditClose,0,0, hwnd,0.0f); ! } ! ! void VSTPlugin::StopEditing() ! { ! hwnd = NULL; ! } ! ! /* ! void VSTPlugin::SetShowParameters(bool s) ! { ! show_params = s; ! } ! ! bool VSTPlugin::ShowParams() ! { ! return show_params; ! } ! */ ! ! void VSTPlugin::AddAftertouch(int value) ! { ! if (value < 0) value = 0; else if (value > 127) value = 127; ! AddMIDI( (char)MIDI_NOTEOFF | _midichannel , value ); ! } ! ! void VSTPlugin::AddPitchBend(int value) ! { ! AddMIDI( MIDI_PITCHBEND + (_midichannel & 0xf) , ((value>>7) & 127), (value & 127)); ! } ! ! void VSTPlugin::AddProgramChange(int value) ! { ! if (value < 0) value = 0; else if (value > 127) value = 127; ! AddMIDI( MIDI_PROGRAMCHANGE + (_midichannel & 0xf), value, 0); ! } ! ! void VSTPlugin::AddControlChange(int control, int value) ! { ! if (control < 0) control = 0; else if (control > 127) control = 127; ! if (value < 0) value = 0; else if (value > 127) value = 127; ! AddMIDI( MIDI_CONTROLCHANGE + (_midichannel & 0xf), control, value); ! } ! ! ! bool VSTPlugin::GetProgramName( int cat , int p, char *buf) ! { ! int parameter = p; ! if(instantiated) ! { ! if(parameter<NumPrograms()) ! { ! Dispatch(effGetProgramNameIndexed,parameter,cat,buf,0.0f); ! return true; ! } ! } ! return false; ! } ! ! int VSTPlugin::GetNumCategories() ! { ! if(instantiated) ! return Dispatch(effGetNumProgramCategories,0,0,NULL,0.0f); ! else ! return 0; ! } --- 468,470 ---- }
! #endif
Index: VstHost.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/vst/src/VstHost.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** VstHost.h 23 Jan 2004 04:20:38 -0000 1.4 --- VstHost.h 27 Jan 2004 03:41:26 -0000 1.5 *************** *** 8,23 **** */
! #ifndef _VSTPLUGIN_HOST ! #define _VSTPLUGIN_HOST
- #include "Vst\AEffectx.h" #include <flext.h>
#if FLEXT_OS == FLEXT_OS_WIN #include <windows.h> #else #error Platform not supported! #endif
#define MAX_EVENTS 64 #define MAX_INOUTS 8 --- 8,26 ---- */
! #ifndef __VSTHOST_H ! #define __VSTHOST_H
#include <flext.h> + #include "Vst\AEffectx.h" + #include "vst\aeffeditor.h"
#if FLEXT_OS == FLEXT_OS_WIN #include <windows.h> + typedef HWND WHandle; #else #error Platform not supported! #endif
+ #define MAX_EVENTS 64 #define MAX_INOUTS 8 *************** *** 36,42 **** #define MIDI_PITCHBEND 224
- typedef AEffect* (*PVSTMAIN)(audioMasterCallback audioMaster); - typedef HWND (*POPWIN)(void); - typedef HWND (*GETWIN)(void);
class VSTPlugin: --- 39,42 ---- *************** *** 44,172 **** { public: - int GetNumCategories(); - bool GetProgramName( int cat, int p , char* buf); - void AddControlChange( int control , int value ); - void AddProgramChange( int value ); - void AddPitchBend( int value ); - void AddAftertouch( int value ); - bool ShowParams(); - void SetShowParameters( bool s); - - void SetEditWindow( HWND h ); - void StopEditing(); - void OnEditorClose(); - HWND EditorHandle() { return hwnd; } - - RECT GetEditorRect(); - void EditorIdle(); - - void edit(bool open); - void visible(bool vis); - bool replace( );
VSTPlugin(); ~VSTPlugin();
void Free(); ! int Instance( const char *dllname); ! void Create(VSTPlugin *plug); ! void Init( float samplerate , float blocksize );
! virtual int GetNumParams(void) { return _pEffect->numParams; } ! virtual void GetParamName(int numparam,char* name) ! { ! if ( numparam < _pEffect->numParams ) Dispatch(effGetParamName,numparam,0,name,0.0f); ! else strcpy(name,"Out of Range");
! } ! virtual void GetParamValue(int numparam,char* parval) ! { ! if ( numparam < _pEffect->numParams ) DescribeValue(numparam,parval); ! else strcpy(parval,"Out of Range"); ! } ! virtual float GetParamValue(int numparam) ! { ! if ( numparam < _pEffect->numParams ) return (_pEffect->getParameter(_pEffect, numparam)); ! else return -1.0; ! }
! int getNumInputs( void ); ! int getNumOutputs( void );
! virtual char* GetName(void) { return _sProductName; } ! unsigned long GetVersion() { return _version; } ! char* GetVendorName(void) { return _sVendorName; } ! char* GetDllName(void) { return _sDllName; }
! long NumParameters(void) { return _pEffect->numParams; } ! float GetParameter(long parameter) { return _pEffect->getParameter(_pEffect, parameter); } ! bool DescribeValue(int parameter,char* psTxt); ! bool SetParameter(int parameter, float value); ! bool SetParameter(int parameter, int value); ! void SetCurrentProgram(int prg); ! int GetCurrentProgram(); ! int NumPrograms() { return _pEffect->numPrograms; } ! bool IsSynth() { return _isSynth; } ! bool HasEditor() const { return _editor; }
! bool AddMIDI(unsigned char data0,unsigned char data1=0,unsigned char data2=0); ! void SendMidi();
! void processReplacing( float **inputs, float **outputs, long sampleframes ); ! void process( float **inputs, float **outputs, long sampleframes );
! AEffect *_pEffect; ! long Dispatch(long opCode, long index, long value, void *ptr, float opt) ! { ! return _pEffect->dispatcher(_pEffect, opCode, index, value, ptr, opt); ! }
! static long Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt);
bool AddNoteOn( unsigned char note,unsigned char speed,unsigned char midichannel=0); bool AddNoteOff( unsigned char note,unsigned char midichannel=0);
! char _midichannel; ! bool instantiated; ! int _instance; // Remove when Changing the FileFormat. ! ! void setPos(int x,int y) { posx = x; posy = y; } ! void setX(int x) { posx = x; } ! void setY(int y) { posy = y; } ! int getX() const { return posx; } ! int getY() const { return posy; }
bool IsEdited() const { return hwnd != NULL; }
protected:
HMODULE h_dll; ! HMODULE h_winddll; ! HWND hwnd;
char _sProductName[64]; char _sVendorName[64]; ! char *_sDllName; // Contains dll name ! ULONG _version; ! bool _isSynth,_editor;
! float * inputs[MAX_INOUTS]; ! float * outputs[MAX_INOUTS]; ! float junk[256];
! static VstTimeInfo _timeInfo; VstMidiEvent midievent[MAX_EVENTS]; VstEvents events; int queue_size; - bool overwrite;
! private: int posx,posy; - bool show_params; - static float sample_rate; };
! #endif // _VSTPLUGIN_HOST --- 44,164 ---- { public:
VSTPlugin(); ~VSTPlugin();
+ int Instance(const char *dllname); + // void Create(VSTPlugin *plug); void Free(); ! void DspInit(float samplerate,int blocksize);
! bool Is() const { return _pEffect != NULL; }
! ULONG GetVersion() const { return _pEffect?_pEffect->version:0; }
! bool IsSynth() const { return HasFlags(effFlagsIsSynth); } ! bool IsReplacing() const { return HasFlags(effFlagsCanReplacing); } ! bool HasEditor() const { return HasFlags(effFlagsHasEditor); }
! const char *GetName() const { return _sProductName; } ! const char *GetVendorName() const { return _sVendorName; } ! const char *GetDllName() const { return _sDllName.c_str(); }
! int GetNumInputs() const { return _pEffect?_pEffect->numInputs:0; } ! int GetNumOutputs() const { return _pEffect?_pEffect->numOutputs:0; }
! int GetNumParams() const { return _pEffect?_pEffect->numParams:0; } ! void GetParamName(int numparam,char *name) const; ! void GetParamValue(int numparam,char *parval) const; ! float GetParamValue(int numparam) const;
+ bool SetParamFloat(int parameter, float value); + bool SetParamInt(int parameter, int value) { return SetParamFloat(parameter,value/65535.0f); }
! void SetCurrentProgram(int prg) { Dispatch(effSetProgram,0,prg); } ! int GetCurrentProgram() const { return Dispatch(effGetProgram); } ! int GetNumPrograms() const { return _pEffect->numPrograms; }
! int GetNumCategories() const { return Dispatch(effGetNumProgramCategories); } ! bool GetProgramName( int cat, int p , char* buf) const;
! ! bool AddMIDI(unsigned char data0,unsigned char data1=0,unsigned char data2=0);
bool AddNoteOn( unsigned char note,unsigned char speed,unsigned char midichannel=0); bool AddNoteOff( unsigned char note,unsigned char midichannel=0); + void AddControlChange( int control , int value ); + void AddProgramChange( int value ); + void AddPitchBend( int value ); + void AddAftertouch( int value );
! void Edit(bool open);
+ void StartEditing(WHandle h ); + void StopEditing(); bool IsEdited() const { return hwnd != NULL; } + WHandle EditorHandle() const { return hwnd; } + + void GetEditorRect(ERect &er) const { ERect *r; Dispatch(effEditGetRect,0,0,&r); er = *r; } + void EditorIdle() { Dispatch(effEditIdle); } + + void Visible(bool vis); + bool IsVisible() const; + + // void Paint(ERect &r) const { Dispatch(effEditDraw,0,0,&r); } + + void processReplacing( float **inputs, float **outputs, long sampleframes ); + void process( float **inputs, float **outputs, long sampleframes ); + + long Dispatch(long opCode, long index = 0, long value = 0, void *ptr = NULL, float opt = 0) const + { + return Is()?_pEffect->dispatcher(_pEffect, opCode, index, value, ptr, opt):0; + } + + static long Master(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); + + void SetPos(int x,int y,bool upd = true); + void SetX(int x,bool upd = true) { SetPos(x,posy,upd); } + void SetY(int y,bool upd = true) { SetPos(posx,y,upd); } + int GetX() const { return posx; } + int GetY() const { return posy; }
protected:
+ #if FLEXT_OS == FLEXT_OS_WIN HMODULE h_dll; ! #else ! #error ! #endif
+ WHandle hwnd; + + AEffect *_pEffect; + + inline long GetFlags() const { return _pEffect?_pEffect->flags:0; } + inline bool HasFlags(long msk) const { return _pEffect && (_pEffect->flags&msk); }
char _sProductName[64]; char _sVendorName[64]; ! std::string _sDllName; // Contains dll name
! /* ! float *inputs[MAX_INOUTS]; ! float *outputs[MAX_INOUTS]; ! */
! // static VstTimeInfo _timeInfo; VstMidiEvent midievent[MAX_EVENTS]; VstEvents events; int queue_size;
! // float sample_rate; ! ! void SendMidi(); ! char _midichannel; ! int posx,posy; };
! #endif
Index: main.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/vst/src/main.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** main.cpp 23 Jan 2004 04:20:40 -0000 1.12 --- main.cpp 27 Jan 2004 03:41:26 -0000 1.13 *************** *** 21,25 ****
! #define VST_VERSION "0.1.0pre8"
--- 21,25 ----
! #define VST_VERSION "0.1.0pre10"
*************** *** 41,58 **** V mg_plug(AtomList &sym) const { sym(1); SetString(sym[0],plugname.c_str()); }
- V ms_edit(BL on) { if(plug) plug->edit(on); } - V mg_edit(BL &ed) { ed = plug && plug->IsEdited(); } V mg_editor(BL &ed) { ed = plug && plug->HasEditor(); } - V ms_vis(BL vis) { if(plug) plug->visible(vis); }
! V mg_winx(I &x) const { x = plug?plug->getX():0; } ! V mg_winy(I &y) const { y = plug?plug->getY():0; } ! V ms_winx(I x) { if(plug) plug->setX(x); } ! V ms_winy(I y) { if(plug) plug->setY(y); } ! ! V mg_chnsin(I &c) const { c = plug?plug->getNumInputs():0; } ! V mg_chnsout(I &c) const { c = plug?plug->getNumOutputs():0; } V mg_params(I &p) const { p = plug?plug->GetNumParams():0; } ! V mg_programs(I &p) const { p = plug?plug->NumPrograms():0; } V mg_progcats(I &p) const { p = plug?plug->GetNumCategories():0; } V mg_plugname(const S *&s) const { s = MakeSymbol(plug?plug->GetName():""); } --- 41,60 ---- V mg_plug(AtomList &sym) const { sym(1); SetString(sym[0],plugname.c_str()); }
V mg_editor(BL &ed) { ed = plug && plug->HasEditor(); }
! V ms_edit(BL on) { if(plug) plug->Edit(on); } ! V mg_edit(BL &ed) { ed = plug && plug->IsEdited(); } ! V ms_vis(BL vis) { if(plug) plug->Visible(vis); } ! V mg_vis(BL &vis) { vis = plug && plug->IsVisible(); } ! ! V mg_winx(I &x) const { x = plug?plug->GetX():0; } ! V mg_winy(I &y) const { y = plug?plug->GetY():0; } ! V ms_winx(I x) { if(plug) plug->SetX(x); } ! V ms_winy(I y) { if(plug) plug->SetY(y); } ! ! V mg_chnsin(I &c) const { c = plug?plug->GetNumInputs():0; } ! V mg_chnsout(I &c) const { c = plug?plug->GetNumOutputs():0; } V mg_params(I &p) const { p = plug?plug->GetNumParams():0; } ! V mg_programs(I &p) const { p = plug?plug->GetNumPrograms():0; } V mg_progcats(I &p) const { p = plug?plug->GetNumCategories():0; } V mg_plugname(const S *&s) const { s = MakeSymbol(plug?plug->GetName():""); } *************** *** 105,110 **** FLEXT_CALLVAR_B(mg_edit,ms_edit) FLEXT_CALLGET_B(mg_editor) ! FLEXT_CALLSET_B(ms_vis) ! FLEXT_ATTRGET_B(visible)
// FLEXT_CALLBACK_2(m_control,t_symptr,int) --- 107,111 ---- FLEXT_CALLVAR_B(mg_edit,ms_edit) FLEXT_CALLGET_B(mg_editor) ! FLEXT_CALLVAR_B(mg_vis,ms_vis)
// FLEXT_CALLBACK_2(m_control,t_symptr,int) *************** *** 152,156 **** FLEXT_CADDATTR_VAR(c,"edit",mg_edit,ms_edit); FLEXT_CADDATTR_GET(c,"editor",mg_editor); ! FLEXT_CADDATTR_VAR(c,"vis",visible,ms_vis); FLEXT_CADDMETHOD_(c,0,"print",m_print);
--- 153,157 ---- FLEXT_CADDATTR_VAR(c,"edit",mg_edit,ms_edit); FLEXT_CADDATTR_GET(c,"editor",mg_editor); ! FLEXT_CADDATTR_VAR(c,"vis",mg_vis,ms_vis); FLEXT_CADDMETHOD_(c,0,"print",m_print);
*************** *** 171,178 ****
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_GET(c,"ins",mg_chnsin); FLEXT_CADDATTR_GET(c,"outs",mg_chnsout); FLEXT_CADDATTR_GET(c,"params",mg_params); --- 172,179 ----
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_GET(c,"ins",mg_chnsin); FLEXT_CADDATTR_GET(c,"outs",mg_chnsout); FLEXT_CADDATTR_GET(c,"params",mg_params); *************** *** 225,230 **** FLEXT_ASSERT(plug);
! vstfun = plug->replace()?VSTPlugin::processReplacing:VSTPlugin::process; ! sigmatch = plug->getNumInputs() == CntInSig() && plug->getNumOutputs() == CntOutSig();
InitBuf(); --- 226,231 ---- FLEXT_ASSERT(plug);
! vstfun = plug->IsReplacing()?VSTPlugin::processReplacing:VSTPlugin::process; ! sigmatch = plug->GetNumInputs() == CntInSig() && plug->GetNumOutputs() == CntOutSig();
InitBuf(); *************** *** 236,245 ****
if(vstin) { ! for(I i = 0; i < plug->getNumInputs(); ++i) delete[] vstin[i]; delete[] vstin; vstin = NULL; delete[] tmpin; tmpin = NULL; } if(vstout) { ! for(I i = 0; i < plug->getNumOutputs(); ++i) delete[] vstout[i]; delete[] vstout; vstout = NULL; delete[] tmpout; tmpout = NULL; --- 237,246 ----
if(vstin) { ! for(I i = 0; i < plug->GetNumInputs(); ++i) delete[] vstin[i]; delete[] vstin; vstin = NULL; delete[] tmpin; tmpin = NULL; } if(vstout) { ! for(I i = 0; i < plug->GetNumOutputs(); ++i) delete[] vstout[i]; delete[] vstout; vstout = NULL; delete[] tmpout; tmpout = NULL; *************** *** 250,263 **** { FLEXT_ASSERT(!vstin && !tmpin && !vstout && !tmpout);
I i;
! vstin = new R *[plug->getNumInputs()]; ! tmpin = new R *[plug->getNumInputs()]; ! for(i = 0; i < plug->getNumInputs(); ++i) vstin[i] = new R[Blocksize()];
! vstout = new R *[plug->getNumOutputs()]; ! tmpout = new R *[plug->getNumOutputs()]; ! for(i = 0; i < plug->getNumOutputs(); ++i) vstout[i] = new R[Blocksize()]; }
--- 251,265 ---- { FLEXT_ASSERT(!vstin && !tmpin && !vstout && !tmpout); + const int inputs = plug->GetNumInputs(),outputs = plug->GetNumOutputs();
I i;
! vstin = new R *[inputs]; ! tmpin = new R *[inputs]; ! for(i = 0; i < inputs; ++i) vstin[i] = new R[Blocksize()];
! vstout = new R *[outputs]; ! tmpout = new R *[outputs]; ! for(i = 0; i < outputs; ++i) vstout[i] = new R[Blocksize()]; }
*************** *** 398,402 **** { if(plug) { ! plug->Init(Samplerate(),(F)Blocksize()); FLEXT_ASSERT(vstfun);
--- 400,404 ---- { if(plug) { ! plug->DspInit(Samplerate(),Blocksize()); FLEXT_ASSERT(vstfun);
*************** *** 412,415 **** --- 414,419 ---- { if(plug) { + const int inputs = plug->GetNumInputs(),outputs = plug->GetNumOutputs(); + if(sigmatch) (plug->*vstfun)(const_cast<R **>(insigs),const_cast<R **>(outsigs),n); *************** *** 417,421 **** R **inv,**outv;
! if(plug->getNumInputs() <= CntInSig()) inv = const_cast<R **>(insigs); else { // more plug inputs than inlets --- 421,425 ---- R **inv,**outv;
! if(inputs <= CntInSig()) inv = const_cast<R **>(insigs); else { // more plug inputs than inlets *************** *** 425,434 **** // set dangling inputs to zero // according to mode... (e.g. set zero) ! for(; i < plug->getNumInputs(); ++i) ZeroSamples(tmpin[i] = vstin[i],n);
inv = tmpin; }
! const BL more = plug->getNumOutputs() <= CntOutSig(); if(more) // more outlets than plug outputs outv = const_cast<R **>(outsigs); --- 429,438 ---- // set dangling inputs to zero // according to mode... (e.g. set zero) ! for(; i < inputs; ++i) ZeroSamples(tmpin[i] = vstin[i],n);
inv = tmpin; }
! const BL more = outputs <= CntOutSig(); if(more) // more outlets than plug outputs outv = const_cast<R **>(outsigs); *************** *** 436,440 **** I i; for(i = 0; i < CntOutSig(); ++i) tmpout[i] = outsigs[i]; ! for(; i < plug->getNumOutputs(); ++i) tmpout[i] = vstout[i];
outv = tmpout; --- 440,444 ---- I i; for(i = 0; i < CntOutSig(); ++i) tmpout[i] = outsigs[i]; ! for(; i < outputs; ++i) tmpout[i] = vstout[i];
outv = tmpout; *************** *** 558,562 **** post("VST~ plugin: %s " , plug->GetName() ); post("made by: %s " , plug->GetVendorName() ); ! post("parameterss %d\naudio: %d in(s)/%d out(s) \nLoaded from library "%s".\n", plug->GetNumParams(), CntInSig(), --- 562,566 ---- 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(), *************** *** 565,574 ****
post("Flags"); ! if ( plug->_pEffect->flags & effFlagsHasEditor ) { ! post("Has editor"); ! } ! if ( plug->_pEffect->flags & effFlagsCanReplacing ) { ! post("Can do replacing"); ! } }
--- 569,574 ----
post("Flags"); ! if ( plug->HasEditor() ) post("Has editor"); ! if ( plug->IsReplacing() ) post("Can do replacing"); }
*************** *** 610,614 **** if(*name) { if (showparams) { ! plug->DescribeValue( j , display ); val = plug->GetParamValue( j ); post ("parameter[#%d], "%s" value=%f (%s) ", j, name, val,display); --- 610,615 ---- if(*name) { if (showparams) { ! // plug->DescribeValue( j , display ); ! plug->GetParamValue(j,display); val = plug->GetParamValue( j ); post ("parameter[#%d], "%s" value=%f (%s) ", j, name, val,display); *************** *** 631,635 **** if(true) { ! plug->SetParameter( pnum, val ); if(echoparam) display_parameter(pnum , true ); } --- 632,636 ---- if(true) { ! plug->SetParamFloat( pnum, val ); if(echoparam) display_parameter(pnum , true ); } *************** *** 670,674 ****
memset(display,0,sizeof(display)); ! plug->DescribeValue(pnum,display);
A at[2]; --- 671,675 ----
memset(display,0,sizeof(display)); ! plug->GetParamValue(pnum,display);
A at[2];