diff --git a/include/plugin.hpp b/include/plugin.hpp index 97707872..96225b16 100644 --- a/include/plugin.hpp +++ b/include/plugin.hpp @@ -70,6 +70,7 @@ namespace rack { \ plugin = p; \ global = plugin->global; \ global_ui = plugin->global_ui; \ + /*printf("xxx plugin:loc_set_tls_globals: &global=%p global=%p\n", &global, plugin->global);*/ \ hashtable_seed = p->json.hashtable_seed; \ seed_initialized = p->json.seed_initialized; \ } \ @@ -235,7 +236,7 @@ struct Model { }; -void pluginInit(bool devMode); +void pluginInit(bool devMode, bool _bFX); void pluginDestroy(); void pluginLogIn(std::string email, std::string password); void pluginLogOut(); diff --git a/plugins/community/repos/Template_shared/makefile.msvc b/plugins/community/repos/Template_shared/makefile.msvc index 4c04b8d1..3952ecfc 100644 --- a/plugins/community/repos/Template_shared/makefile.msvc +++ b/plugins/community/repos/Template_shared/makefile.msvc @@ -5,7 +5,8 @@ include ../../../build_shared_plugin_pre.mk include make.objects define BIN_POST_FXN - cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll + cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll.fx + cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll.instr endef include ../../../build_shared_plugin_post.mk diff --git a/plugins/community/repos/dBiz/makefile.msvc b/plugins/community/repos/dBiz/makefile.msvc index eaeb0380..2b130b6d 100644 --- a/plugins/community/repos/dBiz/makefile.msvc +++ b/plugins/community/repos/dBiz/makefile.msvc @@ -5,7 +5,8 @@ include ../../../build_shared_plugin_pre.mk include make.objects define BIN_POST_FXN - cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll + cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll.fx + cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll.instr endef include ../../../build_shared_plugin_post.mk diff --git a/src/engine.cpp b/src/engine.cpp index d97aabab..0ae53802 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -313,17 +313,6 @@ void engineSetParam(Module *module, int paramId, float value) { } } } - // else - // { - // // Should not be reachable - // // (note) [bsp] this scale+bias hack should work for most parameters, though - // // (note) [bsp] => automation curves will look a bit strange, though - // // (note) [bsp] => this may potentially crash modules which cannot deal with params outside the expected range - // float normValue = value / 2.0f; - // normValue += 0.5f; - // // Call host audioMasterAutomate - // vst2_handle_ui_param(uniqueParamId, normValue); - // } } } #endif // USE_VST2 diff --git a/src/main.cpp b/src/main.cpp index 3ef19b25..9254a158 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,7 @@ YAC_TLS rack::GlobalUI *rack::global_ui; #ifdef USE_VST2 -int vst2_init(int argc, char* argv[]) { +int vst2_init(int argc, char* argv[], bool _bFX) { bool devMode = false; std::string patchFile; @@ -63,7 +63,7 @@ int vst2_init(int argc, char* argv[]) { info("Local directory: %s", assetLocal("").c_str()); // Initialize app - pluginInit(devMode); + pluginInit(devMode, _bFX); engineInit(); #ifndef USE_VST2 rtmidiInit(); diff --git a/src/plugin.cpp b/src/plugin.cpp index e6b13212..99e6a9f9 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -70,13 +70,13 @@ void Plugin::addModel(Model *model) { // private API //////////////////// -static bool loadPlugin(std::string path) { +static bool loadPlugin(std::string path, bool _bFX) { #ifdef RACK_HOST std::string libraryFilename; #if ARCH_LIN libraryFilename = path + "/" + "plugin.so"; #elif ARCH_WIN - libraryFilename = path + "/" + "plugin.dll"; + libraryFilename = path + "/" + "plugin.dll" + (_bFX ? ".fx" : ".instr"); #elif ARCH_MAC libraryFilename = path + "/" + "plugin.dylib"; #endif @@ -138,6 +138,7 @@ static bool loadPlugin(std::string path) { plugin->vst2_queue_param_sync_fxn = &vst2_queue_param_sync; plugin->global = global; plugin->global_ui = global_ui; + printf("xxx vstrack_plugin: loadPlugin: global=%p plugin->global=%p\n", global, plugin->global); #endif // RACK_HOST #endif // USE_VST2 initCallback(plugin); @@ -252,13 +253,13 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) { #endif // USE_VST2 } -static void loadPlugins(std::string path) { +static void loadPlugins(std::string path, bool _bFX) { #ifdef RACK_HOST std::string message; for (std::string pluginPath : systemListEntries(path)) { if (!systemIsDirectory(pluginPath)) continue; - if (!loadPlugin(pluginPath)) { + if (!loadPlugin(pluginPath, _bFX)) { #ifndef USE_VST2 // (note) skip message (some plugins are linked statically in VST2 build) message += stringf("Could not load plugin %s\n", pluginPath.c_str()); @@ -376,7 +377,7 @@ static void extractPackages(std::string path) { // public API //////////////////// -void pluginInit(bool devMode) { +void pluginInit(bool devMode, bool _bFX) { tagsInit(); #ifdef RACK_HOST @@ -411,7 +412,7 @@ void pluginInit(bool devMode) { #endif // USE_VST2 // Load/init dynamically loaded plugins - loadPlugins(localPlugins); + loadPlugins(localPlugins, _bFX); #endif // RACK_HOST } @@ -775,11 +776,16 @@ void vst2_set_shared_plugin_tls_globals(void) { // Called in audio thread (see vst2_main.cpp:VSTPluginProcessReplacingFloat32()) for(Plugin *p : global->plugin.gPlugins) { if(NULL != p->set_tls_globals_fxn) { - // printf("xxx vcvrack: calling p->set_tls_globals_fxn() global=%p\n", p->global); + if(0) + { + static int xxx = 0; + if(0 == (++xxx & 255)) + printf("xxx vstrack_plugin: calling p->set_tls_globals_fxn() global=%p p->global=%p\n", global, p->global); + } p->json.hashtable_seed = hashtable_seed; p->json.seed_initialized = seed_initialized; p->set_tls_globals_fxn(p); - // printf("xxx vcvrack: calling p->set_tls_globals_fxn() OK\n"); + // printf("xxx vstrack_plugin: calling p->set_tls_globals_fxn() OK\n"); } } } diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index fd19135e..7392b656 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -18,7 +18,7 @@ /// created: 25Jun2018 /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 /// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018, 07Aug2018, 09Aug2018, 11Aug2018 -/// 18Aug2018, 19Aug2018, 05Sep2018 +/// 18Aug2018, 19Aug2018, 05Sep2018, 06Sep2018 /// /// @@ -69,7 +69,7 @@ typedef union mem_u { sF32 f32; } mem_t; -extern int vst2_init (int argc, char* argv[]); +extern int vst2_init (int argc, char* argv[], bool _bFX); extern void vst2_exit (void); namespace rack { extern void vst2_editor_redraw (void); @@ -81,7 +81,7 @@ extern void vst2_queue_param (int uniqueParamId, float value, bool bNormalized); extern void vst2_handle_queued_params (void); extern float vst2_get_param (int uniqueParamId); extern void vst2_get_param_name (int uniqueParamId, char *s, int sMaxLen); -extern void vst2_set_shared_plugin_tls_globals (void); +extern void vst2_set_shared_plugin_tls_globals (void); // see plugin.cpp extern "C" extern int vst2_handle_effeditkeydown (unsigned int _vkey); namespace rack { @@ -540,7 +540,13 @@ public: //argv[0] = (char*)cwd.chars; argv[0] = (char*)dllnameraw; Dprintf("xxx vstrack_plugin::openEffect: dllname=\"%s\"\n", argv[0]); - (void)vst2_init(argc, argv); + (void)vst2_init(argc, argv, +#ifdef VST2_EFFECT + true/*bFX*/ +#else + false/*bFX*/ +#endif // VST2_EFFECT + ); Dprintf("xxx vstrack_plugin::openEffect: vst2_init() done\n"); vst2_set_shared_plugin_tls_globals(); @@ -1869,10 +1875,12 @@ void VSTPluginSetParameter(VSTPlugin *vstPlugin, // we can get a hold to our C++ class since we stored it in the `object` field (see constructor) VSTPluginWrapper *wrapper = static_cast(vstPlugin->object); - wrapper->lockAudio(); + // // wrapper->lockAudio(); wrapper->setGlobals(); + rack::global_ui->app.mtx_param.lock(); vst2_queue_param(index, parameter, true/*bNormalized*/); - wrapper->unlockAudio(); + rack::global_ui->app.mtx_param.unlock(); + // // wrapper->unlockAudio(); } void vst2_queue_param_sync(int _uniqueParamId, float _value, bool _bNormalized) { @@ -1880,9 +1888,11 @@ void vst2_queue_param_sync(int _uniqueParamId, float _value, bool _bNormalized) printf("xxx vst2_queue_param_sync ENTER: uniqueParamId=%d value=%f bNormalized=%d\n", _uniqueParamId, _value, _bNormalized); VSTPluginWrapper *wrapper = rack::global->vst2.wrapper; - wrapper->lockAudio(); + // // wrapper->lockAudio(); + rack::global_ui->app.mtx_param.lock(); vst2_queue_param(_uniqueParamId, _value, _bNormalized); - wrapper->unlockAudio(); + rack::global_ui->app.mtx_param.unlock(); + // // wrapper->unlockAudio(); printf("xxx vst2_queue_param_sync LEAVE\n"); } @@ -2019,6 +2029,7 @@ void vst2_unlock_midi_device() { void vst2_handle_ui_param(int uniqueParamId, float normValue) { // Called by engineSetParam() + // printf("xxx vst2_handle_ui_param: uniqueParamId=%d &global=%p global=%p wrapper=%p\n", uniqueParamId, &rack::global, rack::global, rack::global->vst2.wrapper); rack::global->vst2.wrapper->handleUIParam(uniqueParamId, normValue); } @@ -2030,6 +2041,7 @@ void vst2_get_timing_info(int *_retPlaying, float *_retBPM, float *_retSongPosPP void vst2_set_globals(void *_wrapper) { VSTPluginWrapper *wrapper = (VSTPluginWrapper *)_wrapper; wrapper->setGlobals(); + vst2_set_shared_plugin_tls_globals(); } void vst2_window_size_set(int _width, int _height) { @@ -2135,7 +2147,7 @@ VST_EXPORT VSTPlugin *VSTPluginMain(VSTHostCallback vstHostCallback) { CCONST('g', 'v', 'g', 'y'), #else CCONST('v', '5', 'k', 'v'), -#endif +#endif // VST2_EFFECT PLUGIN_VERSION, // version VST2_MAX_UNIQUE_PARAM_IDS, // num params 1, // one program diff --git a/src/window.cpp b/src/window.cpp index b652bff4..9ec5d3c2 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -54,8 +54,9 @@ namespace rack { extern "C" { static void lglw_mouse_cbk(lglw_t _lglw, int32_t _x, int32_t _y, uint32_t _buttonState, uint32_t _changedButtonState) { - // printf("xxx lglw_mouse_cbk: lglw=%p p=(%d; %d) bt=0x%08x changedBt=0x%08x\n", _lglw, _x, _y, _buttonState, _changedButtonState); + // printf("xxx lglw_mouse_cbk: lglw=%p wrapper=%p p=(%d; %d) bt=0x%08x changedBt=0x%08x\n", _lglw, lglw_userdata_get(_lglw), _x, _y, _buttonState, _changedButtonState); vst2_set_globals(lglw_userdata_get(_lglw)); + // printf("xxx lglw_mouse_cbk: &global=%p global=%p\n", &rack::global, rack::global); // (note) assumes that GL context is never touched during regular mouse move // (note) mouse clicks may cause new SVGs to be loaded, which in turn may cause new GL textures to be created @@ -249,6 +250,8 @@ static void lglw_mouse_cbk(lglw_t _lglw, int32_t _x, int32_t _y, uint32_t _butto // if(0u != _changedButtonState) lglw_glcontext_pop(global_ui->window.lglw); + + // printf("xxx lglw_mouse_cbk: LEAVE global=%p\n", rack::global); } static void lglw_focus_cbk(lglw_t _lglw, uint32_t _focusState, uint32_t _changedFocusState) {