Update of /cvsroot/pure-data/externals/grill/vst/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26798/src
Modified Files:
Editor.h EditorWin.cpp VstHost.cpp VstHost.h main.cpp
Log Message:
""
Index: main.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/vst/src/main.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** main.cpp 24 Aug 2004 02:44:38 -0000 1.17
--- main.cpp 25 Aug 2004 02:42:06 -0000 1.18
***************
*** 20,24 ****
! #define VST_VERSION "0.1.0pre14"
--- 20,24 ----
! #define VST_VERSION "0.1.0pre15"
***************
*** 51,54 ****
--- 51,58 ----
V ms_winx(I x) { if(plug) plug->SetX(x); }
V ms_winy(I y) { if(plug) plug->SetY(y); }
+ V ms_wincaption(bool c) { if(plug) plug->SetCaption(c); }
+ V mg_wincaption(bool &c) const { c = plug && plug->GetCaption(); }
+ V ms_wintitle(const t_symbol *t) { if(plug) plug->SetTitle(GetString(t)); }
+ V mg_wintitle(const t_symbol *&t) const { t = plug?MakeSymbol(plug->GetTitle()):sym__; }
V mg_chnsin(I &c) const { c = plug?plug->GetNumInputs():0; }
***************
*** 144,147 ****
--- 148,153 ----
FLEXT_CALLVAR_I(mg_winx,ms_winx)
FLEXT_CALLVAR_I(mg_winy,ms_winy)
+ FLEXT_CALLVAR_B(mg_wincaption,ms_wincaption)
+ FLEXT_CALLVAR_S(mg_wintitle,ms_wintitle)
FLEXT_CALLGET_I(mg_chnsin)
***************
*** 202,205 ****
--- 208,213 ----
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,"title",mg_wintitle,ms_wintitle);
FLEXT_CADDATTR_GET(c,"ins",mg_chnsin);
***************
*** 247,252 ****
{
if(plug) {
! ms_edit(false);
! ClearBuf();
delete plug; plug = NULL;
}
--- 255,260 ----
{
if(plug) {
! plug->Edit(false);
! ClearBuf(); // needs valid plug
delete plug; plug = NULL;
}
Index: Editor.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/vst/src/Editor.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** Editor.h 27 Jan 2004 03:41:26 -0000 1.2
--- Editor.h 25 Aug 2004 02:42:06 -0000 1.3
***************
*** 19,22 ****
--- 19,24 ----
void MoveEditor(VSTPlugin *p,int x,int y);
void SizeEditor(VSTPlugin *p,int x,int y);
+ void TitleEditor(VSTPlugin *p,const char *t);
+ void CaptionEditor(VSTPlugin *p,bool c);
bool IsEditorShown(const VSTPlugin *p);
Index: VstHost.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/vst/src/VstHost.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** VstHost.cpp 23 Aug 2004 02:42:16 -0000 1.12
--- VstHost.cpp 25 Aug 2004 02:42:06 -0000 1.13
***************
*** 14,19 ****
#include <ctype.h>
- static VstTimeInfo _timeInfo;
-
typedef AEffect *(VSTCALLBACK *PVSTMAIN)(audioMasterCallback audioMaster);
--- 14,17 ----
***************
*** 21,25 ****
VSTPlugin::VSTPlugin():
h_dll(NULL),hwnd(NULL),_pEffect(NULL),
! posx(0),posy(0),
_midichannel(0),queue_size(0),
paramnamecnt(0)
--- 19,23 ----
VSTPlugin::VSTPlugin():
h_dll(NULL),hwnd(NULL),_pEffect(NULL),
! posx(0),posy(0),caption(true),
_midichannel(0),queue_size(0),
paramnamecnt(0)
***************
*** 33,37 ****
int VSTPlugin::Instance(const char *dllname)
{
! h_dll = LoadLibrary(dllname);
if(!h_dll)
return VSTINSTANCE_ERR_NO_VALID_FILE;
--- 31,39 ----
int VSTPlugin::Instance(const char *dllname)
{
! #ifdef FLEXT_DEBUG
! flext::post("New Plugin 1 - %x",this);
! #endif
!
! h_dll = LoadLibrary(dllname);
if(!h_dll)
return VSTINSTANCE_ERR_NO_VALID_FILE;
***************
*** 89,92 ****
--- 91,102 ----
}
+ if(*_sProductName) {
+ char tmp[256];
+ sprintf(tmp,"vst~ - %s",_sProductName);
+ title = tmp;
+ }
+ else
+ title = "vst~";
+
*_sVendorName = 0;
Dispatch( effGetVendorString, 0, 0, &_sVendorName, 0.0f);
***************
*** 94,97 ****
--- 104,111 ----
_sDllName = dllname;
+ #ifdef FLEXT_DEBUG
+ flext::post("New Plugin 2 - %x",this);
+ #endif
+
return VSTINSTANCE_NO_ERROR;
}
***************
*** 132,138 ****
Dispatch(effClose);
_pEffect = NULL;
if(h_dll) { FreeLibrary(h_dll); h_dll = NULL; }
! }
}
--- 146,168 ----
Dispatch(effClose);
+ #ifdef FLEXT_DEBUG
+ flext::post("Free Plugin 1 - %x",this);
+ #endif
+
_pEffect = NULL;
+
+ // \TODO
+ // Here, we really have to wait until the editor thread has terminated
+ // otherwise WM_DESTROY etc. messages may still be pending
+ // in other words: this is a design flaw
+ // There should be a data stub accessible from the plugin object and the thread
+ // holding the necessary data, so that both can operate independently
+
if(h_dll) { FreeLibrary(h_dll); h_dll = NULL; }
!
! #ifdef FLEXT_DEBUG
! flext::post("Free Plugin 2 - %x",this);
! #endif
! }
}
***************
*** 247,252 ****
void VSTPlugin::StopEditing()
{
! Dispatch(effEditClose);
! hwnd = NULL;
}
--- 277,284 ----
void VSTPlugin::StopEditing()
{
! if(Is()) {
! Dispatch(effEditClose);
! hwnd = NULL;
! }
}
***************
*** 360,369 ****
}
void VSTPlugin::processReplacing( float **inputs, float **outputs, long sampleframes )
{
_pEffect->processReplacing( _pEffect , inputs , outputs , sampleframes );
-
}
--- 392,414 ----
}
+ void VSTPlugin::SetCaption(bool c)
+ {
+ if(Is()) {
+ caption = c;
+ if(IsEdited()) CaptionEditor(this,c);
+ }
+ }
+ void VSTPlugin::SetTitle(const char *t)
+ {
+ if(Is()) {
+ title = t;
+ if(IsEdited()) TitleEditor(this,t);
+ }
+ }
void VSTPlugin::processReplacing( float **inputs, float **outputs, long sampleframes )
{
_pEffect->processReplacing( _pEffect , inputs , outputs , sampleframes );
}
Index: VstHost.h
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/vst/src/VstHost.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** VstHost.h 23 Aug 2004 02:42:16 -0000 1.8
--- VstHost.h 25 Aug 2004 02:42:06 -0000 1.9
***************
*** 131,134 ****
--- 131,138 ----
int GetX() const { return posx; }
int GetY() const { return posy; }
+ void SetCaption(bool b);
+ bool GetCaption() const { return caption; }
+ void SetTitle(const char *t);
+ const char *GetTitle() const { return title.c_str(); }
protected:
***************
*** 176,180 ****
char _midichannel;
! int posx,posy;
};
--- 180,186 ----
char _midichannel;
! int posx,posy; // Window position
! bool caption; // Window border
! std::string title; // Window title
};
Index: EditorWin.cpp
===================================================================
RCS file: /cvsroot/pure-data/externals/grill/vst/src/EditorWin.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** EditorWin.cpp 24 Feb 2004 03:37:12 -0000 1.3
--- EditorWin.cpp 25 Aug 2004 02:42:06 -0000 1.4
***************
*** 36,42 ****
LRESULT res = 0;
- // post("Message %x",msg);
switch(msg) {
- // case WM_NCREATE: res = TRUE; break;
case WM_CREATE:
// Initialize the window.
--- 36,40 ----
***************
*** 44,51 ****
break;
case WM_CLOSE:
! plug->StopEditing();
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
--- 42,57 ----
break;
case WM_CLOSE:
! #ifdef FLEXT_DEBUG
! flext::post("WM_CLOSE");
! #endif
! // plug could already have been unloaded...
! plug->StopEditing(); // this sets plug->hwnd = NULL
DestroyWindow(hwnd);
break;
case WM_DESTROY:
+ #ifdef FLEXT_DEBUG
+ flext::post("WM_DESTROY");
+ #endif
+ // stop editor thread
PostQuitMessage(0);
break;
***************
*** 57,62 ****
break;
case WM_MOVE: {
! WORD x = LOWORD(lp),y = HIWORD(lp);
! plug->SetPos(reinterpret_cast<short &>(x),reinterpret_cast<short &>(y),false);
break;
}
--- 63,76 ----
break;
case WM_MOVE: {
! // ignore after WM_CLOSE so that x,y positions are preserved
! if(!plug->IsEdited()) break;
!
! WORD wx = LOWORD(lp),wy = HIWORD(lp);
! short x = reinterpret_cast<short &>(wx),y = reinterpret_cast<short &>(wy);
! // x and y are the coordinates of the client rect (= actual VST interface)
! plug->SetPos(x,y,false);
! #ifdef FLEXT_DEBUG
! flext::post("WM_MOVE x/y=%i/%i",x,y);
! #endif
break;
}
***************
*** 70,78 ****
}
*/
! /*
! case WM_SIZE:
! // Set the size and position of the window.
break;
! */
default:
res = DefWindowProc(hwnd,msg,wp,lp);
--- 84,97 ----
}
*/
! #if 0 //def FLEXT_DEBUG
! case WM_SIZE: {
! WORD wx = LOWORD(lp),wy = HIWORD(lp);
! short x = reinterpret_cast<short &>(wx),y = reinterpret_cast<short &>(wy);
! // x and y are the coordinates of the client rect (= actual VST interface)
! flext::post("WM_SIZE x/y=%i/%i",x,y);
break;
! }
! #endif
!
default:
res = DefWindowProc(hwnd,msg,wp,lp);
***************
*** 81,84 ****
--- 100,121 ----
}
+ static void windowsize(HWND wnd,int x,int y,int w,int h,bool caption,LONG flags = 0)
+ {
+ WINDOWINFO winfo;
+ winfo.cbSize = sizeof(winfo);
+ GetWindowInfo(wnd,&winfo);
+
+ int cy = caption?GetSystemMetrics(SM_CYCAPTION):0;
+
+ SetWindowPos(wnd,HWND_TOP,
+ x-(winfo.rcClient.left-winfo.rcWindow.left),
+ y-(winfo.rcClient.top-winfo.rcWindow.top),
+ w+winfo.cxWindowBorders*2,
+ h+cy+winfo.cyWindowBorders*2,
+ flags
+ );
+
+ }
+
static void threadfun(flext::thr_params *p)
{
***************
*** 99,103 ****
HWND wnd = CreateWindow(
WCLNAME,tmp,
! WS_BORDER|WS_CAPTION|/*WS_THICKFRAME|*/WS_POPUP|WS_SYSMENU|WS_MINIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
--- 136,140 ----
HWND wnd = CreateWindow(
WCLNAME,tmp,
! (plug->GetCaption()?WS_BORDER|WS_CAPTION:0)|WS_POPUP|WS_SYSMENU|WS_MINIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
***************
*** 122,143 ****
SetTimer(wnd,0,TIMER_INTERVAL,NULL);
- WINDOWINFO winfo;
- winfo.cbSize = sizeof(winfo);
- GetWindowInfo(wnd,&winfo);
- TITLEBARINFO tinfo;
- tinfo.cbSize = sizeof(tinfo);
- GetTitleBarInfo(wnd,&tinfo);
-
ERect r;
plug->GetEditorRect(r);
! SetWindowPos(wnd,HWND_TOP,
! r.left,
! r.top,
! (r.right-r.left)+winfo.cxWindowBorders*2,
! (r.bottom-r.top)+(tinfo.rcTitleBar.bottom-tinfo.rcTitleBar.top)+winfo.cyWindowBorders*2,
! SWP_SHOWWINDOW
! );
-
// SetFocus();
--- 159,169 ----
SetTimer(wnd,0,TIMER_INTERVAL,NULL);
ERect r;
plug->GetEditorRect(r);
! windowsize(wnd,plug->GetX(),plug->GetY(),r.right-r.left,r.bottom-r.top,plug->GetCaption(),SWP_SHOWWINDOW);
! #ifdef FLEXT_DEBUG
! flext::post("Editor rect left/top=%i/%i, right/bottom=%i/%i",r.left,r.top,r.right,r.bottom);
! #endif
// SetFocus();
***************
*** 187,197 ****
--- 213,235 ----
void StartEditor(VSTPlugin *p)
{
+ #ifdef FLEXT_DEBUG
+ flext::post("Start editor 1");
+ #endif
flext::LaunchThread(threadfun,reinterpret_cast<flext::thr_params *>(p));
+ #ifdef FLEXT_DEBUG
+ flext::post("Start editor 2");
+ #endif
}
void StopEditor(VSTPlugin *p)
{
+ #ifdef FLEXT_DEBUG
+ flext::post("Stop editor 1");
+ #endif
PostMessage(p->EditorHandle(),WM_CLOSE,0,0);
flext::StopThread(threadfun,reinterpret_cast<flext::thr_params *>(p));
+ #ifdef FLEXT_DEBUG
+ flext::post("Stop editor 2");
+ #endif
}
***************
*** 203,208 ****
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);
}
--- 241,255 ----
void MoveEditor(VSTPlugin *p,int x,int y)
{
! HWND wnd = p->EditorHandle();
!
! WINDOWINFO winfo;
! winfo.cbSize = sizeof(winfo);
! GetWindowInfo(wnd,&winfo);
!
! SetWindowPos(wnd,NULL,
! x-(winfo.rcClient.left-winfo.rcWindow.left),y-(winfo.rcClient.top-winfo.rcWindow.top),
! 0,0,
! SWP_NOSIZE|SWP_NOZORDER
! );
}
***************
*** 212,215 ****
--- 259,281 ----
}
+ void CaptionEditor(VSTPlugin *plug,bool c)
+ {
+ HWND wnd = plug->EditorHandle();
+ LONG ns,style = GetWindowLong(wnd,GWL_STYLE);
+ if(c) ns = style|WS_BORDER|WS_CAPTION;
+ else ns = style&~(WS_BORDER|WS_CAPTION);
+ if(ns != style) {
+ SetWindowLong(wnd,GWL_STYLE,ns);
+
+ ERect r; plug->GetEditorRect(r);
+ windowsize(wnd,plug->GetX(),plug->GetY(),r.right-r.left,r.bottom-r.top,c,SWP_FRAMECHANGED);
+ }
+ }
+
+ void TitleEditor(VSTPlugin *p,const char *t)
+ {
+ SetWindowText(p->EditorHandle(),t);
+ }
+
bool IsEditorShown(const VSTPlugin *p)
{