diff --git a/dep/lglw/lglw_linux.c b/dep/lglw/lglw_linux.c index 26b79698..af18a69b 100644 --- a/dep/lglw/lglw_linux.c +++ b/dep/lglw/lglw_linux.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -52,25 +53,25 @@ // Regular log entry (low frequency) // // #define Dlog_verbose if(1);else printf -#define Dlog if(0);else printf +#define Dlog if(0);else lglw_log // // Verbose log entry // -// #define Dlog_v if(1);else printf -#define Dlog_v if(0);else printf +// #define Dlog_v if(1);else lglw_log +#define Dlog_v if(0);else lglw_log // // Very-verbose log entry // -// #define Dlog_vv if(1);else printf -#define Dlog_vv if(0);else printf +// #define Dlog_vv if(1);else lglw_log +#define Dlog_vv if(0);else lglw_log // // Very-very-verbose log entry // -#define Dlog_vvv if(1);else printf -// #define Dlog_vvv if(0);else printf +#define Dlog_vvv if(0);else lglw_log +// #define Dlog_vvv if(0);else lglw_log // // Print to stdout @@ -228,9 +229,16 @@ static uint32_t loc_millisec_delta (lglw_int_t *lglw) { static FILE *logfile; void lglw_log(const char *logData, ...) { - fprintf(logfile, logData); + static char buf[16*1024]; + va_list va; + va_start(va, logData); + vsprintf(buf, logData, va); + va_end(va); + printf(buf); + //fprintf(logfile, logData); + fputs(buf, logfile); fflush(logfile); - printf(logData); + // printf(logData); } @@ -353,6 +361,11 @@ static lglw_bool_t loc_create_hidden_window(lglw_int_t *lglw, int32_t _w, int32_ Dlog_v("lglw:loc_create_hidden_window: 5\n"); lglw->ctx = glXCreateContext(lglw->xdsp, lglw->vi, None, True); + if(NULL == lglw->ctx) + { + Dlog("lglw: FAILED to create context!!!\n"); + } + Dlog_v("lglw:loc_create_hidden_window: 6\n"); if(NULL == lglw->ctx) { @@ -431,7 +444,7 @@ static void loc_eventProc(XEvent *xev, lglw_int_t *lglw) { break; case Expose: - Dlog_v("lglw:loc_eventProc: xev Expose\n"); + Dlog_vv("lglw:loc_eventProc: xev Expose\n"); loc_handle_queued_mouse_warp(lglw); eventHandled = LGLW_FALSE; if(NULL != lglw->redraw.cbk) @@ -1172,7 +1185,7 @@ lglw_bool_t lglw_window_open (lglw_t _lglw, void *_parentHWNDOrNull, int32_t _x, if(NULL != lglw) { - Dlog_v("lglw:lglw_window_open: 1, %p, %i \n", (Window)_parentHWNDOrNull, (Window)_parentHWNDOrNull); + Dlog_v("lglw:lglw_window_open: 1, %p, %i p=(%d; %d) s=(%d; %d)\n", (Window)_parentHWNDOrNull, (Window)_parentHWNDOrNull, _x, _y, _w, _h); lglw->parent_xwnd = (0 == _parentHWNDOrNull) ? DefaultRootWindow(lglw->xdsp) : (Window)_parentHWNDOrNull; Dlog_v("lglw:lglw_window_open: 2 lglw=%p\n", lglw); @@ -1342,12 +1355,24 @@ void lglw_window_close (lglw_t _lglw) { Dlog_v("lglw:lglw_window_close: 3\n"); if(lglw->win.b_owner) { + XUnmapWindow(lglw->xdsp, lglw->win.xwnd); XDestroyWindow(lglw->xdsp, lglw->win.xwnd); lglw->win.b_owner = LGLW_FALSE; } XSync(lglw->xdsp, False); lglw->win.xwnd = 0; lglw->win.mapped = LGLW_FALSE; + + { + XEvent xev; + int queued = XPending(lglw->xdsp); + Dlog_vvv("lglw:lglw_window_close: consume %d pending events\n", queued); + while(queued) + { + XNextEvent(lglw->xdsp, &xev); + queued--; + } + } } } Dlog_v("lglw:lglw_window_close: EXIT\n"); @@ -1389,14 +1414,14 @@ lglw_bool_t lglw_window_is_visible(lglw_t _lglw) { lglw_bool_t r = LGLW_FALSE; LGLW(_lglw); - Dlog_vvv("lglw:lglw_window_is_visible: 1\n"); + // Dlog_vvv("lglw:lglw_window_is_visible: 1\n"); if(NULL != lglw && 0 != lglw->win.xwnd) { - Dlog_vvv("lglw:lglw_window_is_visible: 2\n"); + // Dlog_vvv("lglw:lglw_window_is_visible: 2\n"); r = lglw->win.mapped; } - Dlog_vvv("lglw:lglw_window_is_visible: EXIT\n"); + // Dlog_vvv("lglw:lglw_window_is_visible: EXIT\n"); return r; } @@ -1478,6 +1503,7 @@ void lglw_glcontext_push(lglw_t _lglw) { { Dlog("[---] lglw_glcontext_push: glXMakeCurrent() failed. win.xwnd=%p hidden.xwnd=%p ctx=%p glGetError()=%d\n", lglw->win.xwnd, lglw->hidden.xwnd, lglw->ctx, glGetError()); } + // Dlog_vvv("lglw:lglw_glcontext_push: LEAVE\n"); } } @@ -2142,7 +2168,8 @@ void lglw_events(lglw_t _lglw) { { XEvent xev; int queued = XPending(lglw->xdsp); - Dlog_v("lglw:lglw_events: (events: %i)\n", queued); + if(queued > 0) + Dlog_vvv("lglw:lglw_events: (events: %i)\n", queued); while(queued) { XNextEvent(lglw->xdsp, &xev); diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index f5d6fa32..1fe1feef 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -148,6 +148,23 @@ struct PluginMutex { #include #include #include // fesetround() +#include + +static FILE *logfile; +#undef Dprintf +#define Dprintf log_printf + +static void log_printf(const char *logData, ...) { + static char buf[16*1024]; + va_list va; + va_start(va, logData); + vsprintf(buf, logData, va); + va_end(va); + printf(buf); + fputs(buf, logfile); + fflush(logfile); +} + // #define _GNU_SOURCE #include @@ -689,7 +706,6 @@ public: } void closeEffect(void) { - closeEditor(); // (todo) use mutex @@ -998,18 +1014,26 @@ public: } bool setProgramChunk(size_t _size, uint8_t *_addr) { + Dprintf("xxx vstrack_plugin:setProgramChunk: 1\n"); setGlobals(); + Dprintf("xxx vstrack_plugin:setProgramChunk: 2\n"); lockAudio(); + Dprintf("xxx vstrack_plugin:setProgramChunk: 3\n"); vst2_set_shared_plugin_tls_globals(); + Dprintf("xxx vstrack_plugin:setProgramChunk: 4\n"); #if 0 Dprintf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); #endif lglw_glcontext_push(rack::global_ui->window.lglw); + Dprintf("xxx vstrack_plugin:setProgramChunk: 5\n"); bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)_addr); + Dprintf("xxx vstrack_plugin:setProgramChunk: 6\n"); rack::global_ui->ui.gScene->step(); // w/o this the patch is bypassed + Dprintf("xxx vstrack_plugin:setProgramChunk: 7\n"); lglw_glcontext_pop(rack::global_ui->window.lglw); - Dprintf("xxx vstrack_plugin:setProgramChunk: r=%d\n", r); + Dprintf("xxx vstrack_plugin:setProgramChunk: 8 r=%d\n", r); unlockAudio(); + Dprintf("xxx vstrack_plugin:setProgramChunk: 9\n"); return r; } @@ -1102,6 +1126,7 @@ public: } void redraw(void) { +#if 1 setGlobals(); if(lglw_window_is_visible(rack::global_ui->window.lglw)) @@ -1116,6 +1141,7 @@ public: // Restore the DAW's GL context lglw_glcontext_pop(rack::global_ui->window.lglw); } +#endif } #ifdef YAC_LINUX @@ -1690,6 +1716,7 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, // // { r = wrapper->setProgramChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; // // } + Dprintf("xxx vstrack_plugin: effSetChunk LEAVE\n"); break; case effShellGetNextPlugin: @@ -2205,6 +2232,11 @@ void vst2_idle_detect_mode_get(int *_mode) { * Implementation of the main entry point of the plugin */ VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) { + +#ifdef YAC_LINUX + logfile = fopen("/tmp/vst2_log.txt", "w"); +#endif + Dprintf("vstrack_plugin: called VSTPluginMain... \n"); #if 0