Browse Source

fix critical multi-instancing (mixed instr+fx) issue

pull/1639/head
bsp2 6 years ago
parent
commit
7e8b33f19b
8 changed files with 47 additions and 34 deletions
  1. +2
    -1
      include/plugin.hpp
  2. +2
    -1
      plugins/community/repos/Template_shared/makefile.msvc
  3. +2
    -1
      plugins/community/repos/dBiz/makefile.msvc
  4. +0
    -11
      src/engine.cpp
  5. +2
    -2
      src/main.cpp
  6. +14
    -8
      src/plugin.cpp
  7. +21
    -9
      src/vst2_main.cpp
  8. +4
    -1
      src/window.cpp

+ 2
- 1
include/plugin.hpp View File

@@ -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();


+ 2
- 1
plugins/community/repos/Template_shared/makefile.msvc View File

@@ -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

+ 2
- 1
plugins/community/repos/dBiz/makefile.msvc View File

@@ -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

+ 0
- 11
src/engine.cpp View File

@@ -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


+ 2
- 2
src/main.cpp View File

@@ -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();


+ 14
- 8
src/plugin.cpp View File

@@ -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");
}
}
}


+ 21
- 9
src/vst2_main.cpp View File

@@ -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<VSTPluginWrapper *>(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


+ 4
- 1
src/window.cpp View File

@@ -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) {


Loading…
Cancel
Save