| @@ -12,7 +12,7 @@ | |||
| #ifdef USE_VST2 | |||
| struct VSTPluginWrapper; | |||
| class VSTPluginWrapper; | |||
| #endif // USE_VST2 | |||
| @@ -8,7 +8,6 @@ | |||
| #include "widgets.hpp" | |||
| struct GLFWwindow; | |||
| struct NVGcontext; | |||
| @@ -31,7 +30,7 @@ struct Model; | |||
| struct GlobalUI { | |||
| struct { | |||
| GLFWwindow *gWindow; | |||
| void *lglw; // lglw_t | |||
| NVGcontext *gVg; | |||
| NVGcontext *gFramebufferVg; | |||
| std::shared_ptr<Font> gGuiFont; | |||
| @@ -92,28 +91,16 @@ struct GlobalUI { | |||
| int bnd_font; | |||
| } blendish; | |||
| #ifdef USE_VST2 | |||
| struct { | |||
| volatile int b_close_window; | |||
| volatile int b_hide_window; | |||
| #ifdef WIN32 | |||
| void *parent_hwnd; | |||
| bool b_queued_maximize_window; | |||
| #endif // WIN32 | |||
| } vst2; | |||
| #endif // USE_VST2 | |||
| void init(void) { | |||
| window.gWindow = NULL; | |||
| window.lglw = NULL; | |||
| window.gVg = NULL; | |||
| window.gFramebufferVg = NULL; | |||
| window.gPixelRatio = 1.0; | |||
| window.gWindowRatio = 1.0; | |||
| // #ifdef USE_VST2 | |||
| // window.gAllowCursorLock = false; | |||
| // #else | |||
| window.gAllowCursorLock = true; | |||
| // #endif // USE_VST2 | |||
| window.gGuiFrame = 0; | |||
| window.windowX = 0; | |||
| window.windowY = 0; | |||
| window.windowWidth = 0; | |||
| @@ -143,15 +130,6 @@ struct GlobalUI { | |||
| blendish.bnd_icon_image = -1; | |||
| blendish.bnd_font = -1; | |||
| #ifdef USE_VST2 | |||
| vst2.b_close_window = 0; | |||
| vst2.b_hide_window = 0; | |||
| #ifdef WIN32 | |||
| vst2.parent_hwnd = 0; | |||
| vst2.b_queued_maximize_window = false; | |||
| #endif | |||
| #endif // USE_VST2 | |||
| } | |||
| }; | |||
| @@ -9,7 +9,7 @@ namespace rack { | |||
| extern bool gSkipAutosaveOnLaunch; | |||
| void settingsSave(std::string filename); | |||
| void settingsLoad(std::string filename); | |||
| void settingsLoad(std::string filename, bool bWindowSizeOnly); | |||
| } // namespace rack | |||
| @@ -2,7 +2,8 @@ | |||
| #include "widgets.hpp" | |||
| #define GLEW_STATIC | |||
| #include <GL/glew.h> | |||
| #include <GLFW/glfw3.h> | |||
| ////#include <GLFW/glfw3.h> | |||
| #include <lglw/lglw.h> | |||
| #ifdef ARCH_MAC | |||
| @@ -12,12 +13,19 @@ | |||
| #endif | |||
| // backwards compatibility: | |||
| // (note) currently only used by Bidoo.ACNE module | |||
| #define RACK_MOUSE_BUTTON_LEFT 0 | |||
| #define RACK_MOUSE_BUTTON_RIGHT 1 | |||
| #define RACK_MOUSE_BUTTON_MIDDLE 2 | |||
| extern const char *g_program_dir; | |||
| namespace rack { | |||
| extern GLFWwindow *gWindow; | |||
| // extern GLFWwindow *gWindow; | |||
| extern NVGcontext *gVg; | |||
| extern NVGcontext *gFramebufferVg; | |||
| /** The default font to use for GUI elements */ | |||
| @@ -40,7 +40,6 @@ COMMON_OBJ= \ | |||
| src/audio.o \ | |||
| src/dsp/minblep.o \ | |||
| src/engine.o \ | |||
| src/keyboard.o \ | |||
| src/midi.o \ | |||
| src/plugin.o \ | |||
| src/settings.o \ | |||
| @@ -83,6 +82,8 @@ COMMON_OBJ= \ | |||
| src/window.o \ | |||
| src/vstmidi.o | |||
| # src/keyboard.o | |||
| HOST_OBJ= \ | |||
| src/Core/AudioInterface.o \ | |||
| src/Core/Blank.o \ | |||
| @@ -98,7 +99,8 @@ LIB_OBJ= \ | |||
| $(HOST_OBJ) | |||
| LIB_OBJ_WIN= \ | |||
| src/util/dirent_win32/dirent.o | |||
| src/util/dirent_win32/dirent.o \ | |||
| dep/lglw/lglw_windows.o | |||
| SHARED_LIB_OBJ= \ | |||
| $(COMMON_OBJ) | |||
| @@ -23,9 +23,9 @@ vst: lib | |||
| rm -f src/vst2_main.o | |||
| make -f makefile_vst_effect.msvc bin -j $(NUM_JOBS) | |||
| # (note) cannot use both instrument and effect plugin at the same time! | |||
| mv veeseevstrack_instr.dll vst2_bin/veeseevstrack_instr.dll__ | |||
| mv veeseevstrack_instr.dll vst2_bin/ | |||
| mv veeseevstrack_effect.dll vst2_bin/ | |||
| @ls -l vst2_bin/veeseevstrack_instr.dll__ | |||
| @ls -l vst2_bin/veeseevstrack_instr.dll | |||
| @ls -l vst2_bin/veeseevstrack_effect.dll | |||
| clean: | |||
| @@ -7,7 +7,8 @@ include dep/yac/install_msvc.mk | |||
| TARGET_BASENAME=Rack | |||
| EXTRAFLAGS= -DVERSION=0.6.1 -DARCH_WIN -D_USE_MATH_DEFINES -DRACK_HOST -DUSE_VST2 -DVST2_REPARENT_WINDOW_HACK -Iinclude/ -Idep/include | |||
| EXTRAFLAGS= -DVERSION=0.6.1 -DARCH_WIN -D_USE_MATH_DEFINES -DRACK_HOST -DUSE_VST2 -Iinclude/ -Idep/include -Idep/ | |||
| #-DVST2_REPARENT_WINDOW_HACK | |||
| ifeq ($(BUILD_64),y) | |||
| EXTRALIBS= -LIBPATH:dep/lib/msvc/x64 | |||
| @@ -7,7 +7,7 @@ include ../../../../dep/yac/install_msvc.mk | |||
| TARGET_BASENAME=$(SLUG) | |||
| EXTRAFLAGS+= -DVERSION=0.6.1 -D_USE_MATH_DEFINES -DUSE_VST2 -DRACK_PLUGIN -DSLUG=$(SLUG) -I../../../../include/ -I../../../../dep/include -Idep/include | |||
| EXTRAFLAGS+= -DVERSION=0.6.1 -D_USE_MATH_DEFINES -DUSE_VST2 -DRACK_PLUGIN -DSLUG=$(SLUG) -I../../../../include/ -I../../../../dep/include -I../../../../dep/ -Idep/include | |||
| EXTRAFLAGS+= | |||
| EXTRALIBS+= | |||
| @@ -23,8 +23,9 @@ ALL_OBJ= \ | |||
| src/TOCANTE.o \ | |||
| src/VOID.o \ | |||
| src/ZINC.o \ | |||
| src/dep/kiss_fft130/kiss_fft.o \ | |||
| src/dep/minimp3/minimp3_test.o | |||
| src/dep/kiss_fft130/kiss_fft.o | |||
| # src/dep/minimp3/minimp3_test.o | |||
| # already used in AS modules | |||
| @@ -227,7 +227,7 @@ struct ACNETrimPot : BidooColoredTrimpot { | |||
| ACNEWidget *parent = dynamic_cast<ACNEWidget*>(this->parent); | |||
| ACNE *module = dynamic_cast<ACNE*>(this->module); | |||
| if (parent && module) { | |||
| if ((e.button == GLFW_MOUSE_BUTTON_MIDDLE) || ((e.button == GLFW_MOUSE_BUTTON_LEFT) && (windowIsShiftPressed()))) { | |||
| if ((e.button == RACK_MOUSE_BUTTON_MIDDLE) || ((e.button == RACK_MOUSE_BUTTON_LEFT) && (windowIsShiftPressed()))) { | |||
| this->setValue(10); | |||
| module->snapshots[module->currentSnapshot][(int)((this->paramId - ACNE::FADERS_PARAMS)/ACNE_NB_TRACKS)][(this->paramId - ACNE::FADERS_PARAMS)%ACNE_NB_TRACKS] = 10; | |||
| } | |||
| @@ -4,4 +4,8 @@ include ../../../build_shared_plugin_pre.mk | |||
| include make.objects | |||
| define BIN_POST_FXN | |||
| cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll | |||
| endef | |||
| include ../../../build_shared_plugin_post.mk | |||
| @@ -4,4 +4,8 @@ include ../../../build_shared_plugin_pre.mk | |||
| include make.objects | |||
| define BIN_POST_FXN | |||
| cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll | |||
| endef | |||
| include ../../../build_shared_plugin_post.mk | |||
| @@ -5,7 +5,7 @@ | |||
| // for gVg | |||
| #include "window.hpp" | |||
| // for key codes | |||
| #include <GLFW/glfw3.h> | |||
| // // #include <GLFW/glfw3.h> | |||
| #include "global_ui.hpp" | |||
| using namespace rack; | |||
| @@ -217,7 +217,7 @@ void TSTextField::onKey(EventKey &e) { | |||
| //// Flag if we need to validate/cleanse this character (only if printable and if we are doing validation). | |||
| //bool checkKey = (this->allowedTextType != TextType::Any) && isPrintableKey(e.key); | |||
| switch (e.key) { | |||
| case GLFW_KEY_TAB: | |||
| case LGLW_VKEY_TAB/*GLFW_KEY_TAB*/: | |||
| // If we have an event to fire, then do it | |||
| if (windowIsShiftPressed())//(guiIsShiftPressed()) | |||
| { | |||
| @@ -297,13 +297,13 @@ void TSTextField::onKey(EventKey &e) { | |||
| } | |||
| } // end if next field | |||
| break; | |||
| case GLFW_KEY_KP_ENTER: | |||
| { | |||
| // Key pad enter should also trigger event action | |||
| EventAction evt; | |||
| onAction(evt); | |||
| } | |||
| break; | |||
| // case GLFW_KEY_KP_ENTER: | |||
| // { | |||
| // // Key pad enter should also trigger event action | |||
| // EventAction evt; | |||
| // onAction(evt); | |||
| // } | |||
| // break; | |||
| default: | |||
| // Call base method | |||
| TextField::onKey(e); | |||
| @@ -324,58 +324,58 @@ bool isPrintableKey(int key) | |||
| bool isPrintable = false; | |||
| switch (key) | |||
| { | |||
| case GLFW_KEY_SPACE: | |||
| case GLFW_KEY_APOSTROPHE: | |||
| case GLFW_KEY_COMMA: | |||
| case GLFW_KEY_MINUS: | |||
| case GLFW_KEY_PERIOD: | |||
| case GLFW_KEY_SLASH: | |||
| case GLFW_KEY_0: | |||
| case GLFW_KEY_1: | |||
| case GLFW_KEY_2: | |||
| case GLFW_KEY_3: | |||
| case GLFW_KEY_4: | |||
| case GLFW_KEY_5: | |||
| case GLFW_KEY_6: | |||
| case GLFW_KEY_7: | |||
| case GLFW_KEY_8: | |||
| case GLFW_KEY_9: | |||
| case GLFW_KEY_SEMICOLON: | |||
| case GLFW_KEY_EQUAL: | |||
| case GLFW_KEY_A: | |||
| case GLFW_KEY_B: | |||
| case GLFW_KEY_C: | |||
| case GLFW_KEY_D: | |||
| case GLFW_KEY_E: | |||
| case GLFW_KEY_F: | |||
| case GLFW_KEY_G: | |||
| case GLFW_KEY_H: | |||
| case GLFW_KEY_I: | |||
| case GLFW_KEY_J: | |||
| case GLFW_KEY_K: | |||
| case GLFW_KEY_L: | |||
| case GLFW_KEY_M: | |||
| case GLFW_KEY_N: | |||
| case GLFW_KEY_O: | |||
| case GLFW_KEY_P: | |||
| case GLFW_KEY_Q: | |||
| case GLFW_KEY_R: | |||
| case GLFW_KEY_S: | |||
| case GLFW_KEY_T: | |||
| case GLFW_KEY_U: | |||
| case GLFW_KEY_V: | |||
| case GLFW_KEY_W: | |||
| case GLFW_KEY_X: | |||
| case GLFW_KEY_Y: | |||
| case GLFW_KEY_Z: | |||
| case GLFW_KEY_LEFT_BRACKET: | |||
| case GLFW_KEY_BACKSLASH: | |||
| case GLFW_KEY_RIGHT_BRACKET: | |||
| case GLFW_KEY_GRAVE_ACCENT: | |||
| case GLFW_KEY_WORLD_1: | |||
| case GLFW_KEY_WORLD_2: | |||
| isPrintable = true; | |||
| break; | |||
| case ' '/*GLFW_KEY_SPACE*/: | |||
| case '\''/*GLFW_KEY_APOSTROPHE*/: | |||
| case ','/*GLFW_KEY_COMMA*/: | |||
| case '-'/*GLFW_KEY_MINUS*/: | |||
| case '.'/*GLFW_KEY_PERIOD*/: | |||
| case '/'/*GLFW_KEY_SLASH*/: | |||
| case '0'/*GLFW_KEY_0*/: | |||
| case '1'/*GLFW_KEY_1*/: | |||
| case '2'/*GLFW_KEY_2*/: | |||
| case '3'/*GLFW_KEY_3*/: | |||
| case '4'/*GLFW_KEY_4*/: | |||
| case '5'/*GLFW_KEY_5*/: | |||
| case '6'/*GLFW_KEY_6*/: | |||
| case '7'/*GLFW_KEY_7*/: | |||
| case '8'/*GLFW_KEY_8*/: | |||
| case '9'/*GLFW_KEY_9*/: | |||
| case ';'/*GLFW_KEY_SEMICOLON*/: | |||
| case '='/*GLFW_KEY_EQUAL*/: | |||
| case 'a'/*GLFW_KEY_A*/: | |||
| case 'b'/*GLFW_KEY_B*/: | |||
| case 'c'/*GLFW_KEY_C*/: | |||
| case 'd'/*GLFW_KEY_D*/: | |||
| case 'e'/*GLFW_KEY_E*/: | |||
| case 'f'/*GLFW_KEY_F*/: | |||
| case 'g'/*GLFW_KEY_G*/: | |||
| case 'h'/*GLFW_KEY_H*/: | |||
| case 'i'/*GLFW_KEY_I*/: | |||
| case 'j'/*GLFW_KEY_J*/: | |||
| case 'k'/*GLFW_KEY_K*/: | |||
| case 'l'/*GLFW_KEY_L*/: | |||
| case 'm'/*GLFW_KEY_M*/: | |||
| case 'n'/*GLFW_KEY_N*/: | |||
| case 'o'/*GLFW_KEY_O*/: | |||
| case 'p'/*GLFW_KEY_P*/: | |||
| case 'q'/*GLFW_KEY_Q*/: | |||
| case 'r'/*GLFW_KEY_R*/: | |||
| case 's'/*GLFW_KEY_S*/: | |||
| case 't'/*GLFW_KEY_T*/: | |||
| case 'u'/*GLFW_KEY_U*/: | |||
| case 'v'/*GLFW_KEY_V*/: | |||
| case 'w'/*GLFW_KEY_W*/: | |||
| case 'x'/*GLFW_KEY_X*/: | |||
| case 'y'/*GLFW_KEY_Y*/: | |||
| case 'z'/*GLFW_KEY_Z*/: | |||
| case '['/*GLFW_KEY_LEFT_BRACKET*/: | |||
| case '\\'/*GLFW_KEY_BACKSLASH*/: | |||
| case ']'/*GLFW_KEY_RIGHT_BRACKET*/: | |||
| case '^'/*GLFW_KEY_GRAVE_ACCENT*/: | |||
| // case GLFW_KEY_WORLD_1: | |||
| // case GLFW_KEY_WORLD_2: | |||
| isPrintable = true; | |||
| break; | |||
| } | |||
| return isPrintable; | |||
| } // end isPrintableKey() | |||
| @@ -166,7 +166,8 @@ struct MidiCcChoice : GridChoice { | |||
| void onKey(EventKey &e) override { | |||
| if (global_ui->widgets.gFocusedWidget == this) { | |||
| if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | |||
| // if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) { | |||
| if(LGLW_VKEY_RETURN == e.key) { | |||
| EventDefocus eDefocus; | |||
| onDefocus(eDefocus); | |||
| global_ui->widgets.gFocusedWidget = NULL; | |||
| @@ -497,32 +497,32 @@ void SearchModuleField::onTextChange() { | |||
| void SearchModuleField::onKey(EventKey &e) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_ESCAPE: { | |||
| case LGLW_VKEY_ESCAPE/*GLFW_KEY_ESCAPE*/: { | |||
| global_ui->ui.gScene->setOverlay(NULL); | |||
| e.consumed = true; | |||
| return; | |||
| } break; | |||
| case GLFW_KEY_UP: { | |||
| case LGLW_VKEY_UP/*GLFW_KEY_UP*/: { | |||
| moduleBrowser->moduleList->incrementSelection(-1); | |||
| moduleBrowser->moduleList->scrollSelected(); | |||
| e.consumed = true; | |||
| } break; | |||
| case GLFW_KEY_DOWN: { | |||
| case LGLW_VKEY_DOWN/*GLFW_KEY_DOWN*/: { | |||
| moduleBrowser->moduleList->incrementSelection(1); | |||
| moduleBrowser->moduleList->scrollSelected(); | |||
| e.consumed = true; | |||
| } break; | |||
| case GLFW_KEY_PAGE_UP: { | |||
| case LGLW_VKEY_PAGEUP/*GLFW_KEY_PAGE_UP*/: { | |||
| moduleBrowser->moduleList->incrementSelection(-5); | |||
| moduleBrowser->moduleList->scrollSelected(); | |||
| e.consumed = true; | |||
| } break; | |||
| case GLFW_KEY_PAGE_DOWN: { | |||
| case LGLW_VKEY_PAGEDOWN/*GLFW_KEY_PAGE_DOWN*/: { | |||
| moduleBrowser->moduleList->incrementSelection(5); | |||
| moduleBrowser->moduleList->scrollSelected(); | |||
| e.consumed = true; | |||
| } break; | |||
| case GLFW_KEY_ENTER: { | |||
| case LGLW_VKEY_RETURN/*GLFW_KEY_ENTER*/: { | |||
| BrowserListItem *item = moduleBrowser->moduleList->getSelectedItem(); | |||
| if (item) { | |||
| item->doAction(); | |||
| @@ -8,7 +8,7 @@ | |||
| #ifdef USE_VST2 | |||
| extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||
| // // extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||
| // #include <windows.h> | |||
| #endif // USE_VST2 | |||
| @@ -310,51 +310,81 @@ void ModuleWidget::onMouseDown(EventMouseDown &e) { | |||
| void ModuleWidget::onMouseMove(EventMouseMove &e) { | |||
| OpaqueWidget::onMouseMove(e); | |||
| // Don't delete the ModuleWidget if a TextField is focused | |||
| if (!global_ui->widgets.gFocusedWidget) { | |||
| // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | |||
| if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | |||
| if (!windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->deleteModule(this); | |||
| this->finalizeEvents(); | |||
| delete this; | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } | |||
| } | |||
| // // #if 0 | |||
| // // // Don't delete the ModuleWidget if a TextField is focused | |||
| // // if (!global_ui->widgets.gFocusedWidget) { | |||
| // // // Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget. | |||
| // // if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { | |||
| // // if (!windowIsModPressed() && !windowIsShiftPressed()) { | |||
| // // global_ui->app.gRackWidget->deleteModule(this); | |||
| // // this->finalizeEvents(); | |||
| // // delete this; | |||
| // // e.consumed = true; | |||
| // // return; | |||
| // // } | |||
| // // } | |||
| // // } | |||
| // // #endif | |||
| } | |||
| void ModuleWidget::onHoverKey(EventHoverKey &e) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_I: { | |||
| case 'i'/*GLFW_KEY_I*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| reset(); | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_R: { | |||
| break; | |||
| case 'r'/*GLFW_KEY_R*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| randomize(); | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_D: { | |||
| break; | |||
| case 'd'/*GLFW_KEY_D*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->cloneModule(this); | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_U: { | |||
| break; | |||
| case 'u'/*GLFW_KEY_U*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| disconnect(); | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } break; | |||
| break; | |||
| case LGLW_VKEY_DELETE: | |||
| case LGLW_VKEY_BACKSPACE: | |||
| if (!global_ui->widgets.gFocusedWidget) { | |||
| if (!windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->deleteModule(this); | |||
| this->finalizeEvents(); | |||
| delete this; | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| } | |||
| break; | |||
| case 'w': | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->deleteModule(this); | |||
| this->finalizeEvents(); | |||
| delete this; | |||
| e.consumed = true; | |||
| return; | |||
| } | |||
| break; | |||
| } | |||
| Widget::onHoverKey(e); | |||
| @@ -65,19 +65,19 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||
| if (!e.consumed) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_N: { | |||
| case 'n'/*GLFW_KEY_N*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->reset(); | |||
| e.consumed = true; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_Q: { | |||
| break; | |||
| case 'q'/*GLFW_KEY_Q*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| windowClose(); | |||
| e.consumed = true; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_O: { | |||
| break; | |||
| case 'o'/*GLFW_KEY_O*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->openDialog(); | |||
| e.consumed = true; | |||
| @@ -86,8 +86,8 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||
| global_ui->app.gRackWidget->revert(); | |||
| e.consumed = true; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_S: { | |||
| break; | |||
| case 's'/*GLFW_KEY_S*/: | |||
| if (windowIsModPressed() && !windowIsShiftPressed()) { | |||
| global_ui->app.gRackWidget->saveDialog(); | |||
| e.consumed = true; | |||
| @@ -96,15 +96,15 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||
| global_ui->app.gRackWidget->saveAsDialog(); | |||
| e.consumed = true; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_ENTER: | |||
| case GLFW_KEY_KP_ENTER: { | |||
| break; | |||
| case LGLW_VKEY_RETURN/*GLFW_KEY_ENTER*/: | |||
| // case GLFW_KEY_KP_ENTER: | |||
| appModuleBrowserCreate(); | |||
| e.consumed = true; | |||
| } break; | |||
| case GLFW_KEY_F11: { | |||
| break; | |||
| case LGLW_VKEY_F11/*GLFW_KEY_F11*/: | |||
| windowSetFullScreen(!windowGetFullScreen()); | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| @@ -21,16 +21,12 @@ | |||
| #include "global.hpp" | |||
| #include "global_ui.hpp" | |||
| // #if defined(YAC_WIN32) && defined(VST2_REPARENT_WINDOW_HACK) | |||
| // #include <windows.h> | |||
| // extern "C" extern HWND __hack__glfwGetHWND (GLFWwindow *window); | |||
| // #endif | |||
| using namespace rack; | |||
| /*__declspec(dllexport) won't link*/ YAC_TLS rack::Global *rack::global; | |||
| /*__declspec(dllexport) won't link*/ YAC_TLS rack::GlobalUI *rack::global_ui; | |||
| YAC_TLS rack::Global *rack::global; | |||
| YAC_TLS rack::GlobalUI *rack::global_ui; | |||
| #ifdef USE_VST2 | |||
| int vst2_init(int argc, char* argv[]) { | |||
| @@ -74,12 +70,13 @@ int vst2_init(int argc, char* argv[]) { | |||
| bridgeInit(); | |||
| #endif // USE_VST2 | |||
| vstmidiInit(); | |||
| keyboardInit(); | |||
| #ifndef USE_VST2 | |||
| keyboardInit(); | |||
| gamepadInit(); | |||
| windowInit(); // must be done in vst2 ui thread | |||
| #endif // USE_VST2 | |||
| windowInit(); | |||
| appInit(devMode); | |||
| settingsLoad(assetLocal("settings.json"), false/*bWindowSizeOnly*/); | |||
| #if 0 | |||
| if (patchFile.empty()) { | |||
| @@ -108,20 +105,6 @@ int vst2_init(int argc, char* argv[]) { | |||
| return 0; | |||
| } | |||
| void vst2_editor_create(void) { | |||
| windowInit(); | |||
| settingsLoad(assetLocal("settings.json")); | |||
| glfwHideWindow(rack::global_ui->window.gWindow); | |||
| } | |||
| void vst2_editor_destroy(void) { | |||
| windowDestroy(); | |||
| } | |||
| void vst2_editor_loop(void) { | |||
| windowRun(); | |||
| } | |||
| void vst2_exit(void) { | |||
| // Destroy namespaces | |||
| // // engineStop(); | |||
| @@ -129,26 +112,36 @@ void vst2_exit(void) { | |||
| // global_ui->app.gRackWidget->savePatch(assetLocal("autosave.vcv")); | |||
| // settingsSave(assetLocal("settings.json")); | |||
| printf("xxx vst2_exit 2\n"); | |||
| #if 0 // (note) setting this to 1 seems to work fine (and it fixes the obvious mem leaks) | |||
| #if 1 | |||
| lglw_glcontext_push(global_ui->window.lglw); | |||
| appDestroy(); | |||
| lglw_glcontext_pop(global_ui->window.lglw); | |||
| #endif | |||
| printf("xxx vst2_exit 3\n"); | |||
| windowDestroy(); | |||
| #if 0 | |||
| #ifndef USE_VST2 | |||
| windowDestroy(); | |||
| bridgeDestroy(); | |||
| #endif // USE_VST2 | |||
| printf("xxx vst2_exit 4\n"); | |||
| engineDestroy(); | |||
| printf("xxx vst2_exit 5\n"); | |||
| #endif | |||
| printf("xxx vst2_exit destroy midi\n"); | |||
| midiDestroy(); | |||
| printf("xxx vst2_exit destroy midi done\n"); | |||
| #if 0 | |||
| #if 1 | |||
| printf("xxx vst2_exit 6\n"); | |||
| pluginDestroy(); | |||
| printf("xxx vst2_exit 7\n"); | |||
| loggerDestroy(); | |||
| #endif | |||
| printf("xxx vst2_exit 8 (leave)\n"); | |||
| } | |||
| @@ -9,6 +9,8 @@ | |||
| #include "global_ui.hpp" | |||
| extern void vst2_window_size_set (int _width, int _height); | |||
| namespace rack { | |||
| @@ -76,7 +78,7 @@ static json_t *settingsToJson() { | |||
| return rootJ; | |||
| } | |||
| static void settingsFromJson(json_t *rootJ) { | |||
| static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||
| // token | |||
| json_t *tokenJ = json_object_get(rootJ, "token"); | |||
| if (tokenJ) | |||
| @@ -89,6 +91,13 @@ static void settingsFromJson(json_t *rootJ) { | |||
| json_unpack(windowSizeJ, "[F, F]", &width, &height); | |||
| #ifdef USE_VST2 | |||
| // (note) calling windowSetWindowSize() causes the window to be not resizable initially, and when it is moved, it reverts to a default size (TBI) | |||
| if(bWindowSizeOnly) | |||
| { | |||
| global_ui->window.windowWidth = int(width); | |||
| global_ui->window.windowHeight = int(height); | |||
| vst2_window_size_set((int)width, (int)height); | |||
| return; | |||
| } | |||
| #else | |||
| windowSetWindowSize(Vec(width, height)); | |||
| #endif // USE_VST2 | |||
| @@ -181,7 +190,7 @@ void settingsSave(std::string filename) { | |||
| } | |||
| } | |||
| void settingsLoad(std::string filename) { | |||
| void settingsLoad(std::string filename, bool bWindowSizeOnly) { | |||
| info("Loading settings %s", filename.c_str()); | |||
| FILE *file = fopen(filename.c_str(), "r"); | |||
| if (!file) | |||
| @@ -190,7 +199,7 @@ void settingsLoad(std::string filename) { | |||
| json_error_t error; | |||
| json_t *rootJ = json_loadf(file, 0, &error); | |||
| if (rootJ) { | |||
| settingsFromJson(rootJ); | |||
| settingsFromJson(rootJ, bWindowSizeOnly); | |||
| json_decref(rootJ); | |||
| } | |||
| else { | |||
| @@ -27,11 +27,13 @@ void MenuOverlay::onMouseDown(EventMouseDown &e) { | |||
| void MenuOverlay::onHoverKey(EventHoverKey &e) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_ESCAPE: { | |||
| default: | |||
| break; | |||
| case LGLW_VKEY_ESCAPE/*GLFW_KEY_ESCAPE*/: | |||
| global_ui->ui.gScene->setOverlay(NULL); | |||
| e.consumed = true; | |||
| return; | |||
| } break; | |||
| } | |||
| if (!e.consumed) { | |||
| @@ -111,6 +111,7 @@ void ScrollWidget::step() { | |||
| void ScrollWidget::onMouseMove(EventMouseMove &e) { | |||
| // Scroll with arrow keys | |||
| #if 0 | |||
| if (!global_ui->widgets.gFocusedWidget) { | |||
| float arrowSpeed = 30.0; | |||
| if (windowIsShiftPressed() && windowIsModPressed()) | |||
| @@ -133,7 +134,7 @@ void ScrollWidget::onMouseMove(EventMouseMove &e) { | |||
| offset.y += arrowSpeed; | |||
| } | |||
| } | |||
| #endif | |||
| Widget::onMouseMove(e); | |||
| } | |||
| @@ -63,7 +63,8 @@ void TextField::onText(EventText &e) { | |||
| void TextField::onKey(EventKey &e) { | |||
| switch (e.key) { | |||
| case GLFW_KEY_BACKSPACE: { | |||
| case LGLW_VKEY_BACKSPACE/*GLFW_KEY_BACKSPACE*/: | |||
| if (cursor == selection) { | |||
| cursor--; | |||
| if (cursor >= 0) { | |||
| @@ -78,8 +79,9 @@ void TextField::onKey(EventKey &e) { | |||
| onTextChange(); | |||
| cursor = selection = begin; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_DELETE: { | |||
| break; | |||
| case LGLW_VKEY_DELETE/*GLFW_KEY_DELETE*/: | |||
| if (cursor == selection) { | |||
| text.erase(cursor, 1); | |||
| onTextChange(); | |||
| @@ -90,8 +92,9 @@ void TextField::onKey(EventKey &e) { | |||
| onTextChange(); | |||
| cursor = selection = begin; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_LEFT: { | |||
| break; | |||
| case LGLW_VKEY_LEFT/*GLFW_KEY_LEFT*/: | |||
| if (windowIsModPressed()) { | |||
| while (--cursor > 0) { | |||
| if (text[cursor] == ' ') | |||
| @@ -104,8 +107,9 @@ void TextField::onKey(EventKey &e) { | |||
| if (!windowIsShiftPressed()) { | |||
| selection = cursor; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_RIGHT: { | |||
| break; | |||
| case LGLW_VKEY_RIGHT/*GLFW_KEY_RIGHT*/: | |||
| if (windowIsModPressed()) { | |||
| while (++cursor < (int) text.size()) { | |||
| if (text[cursor] == ' ') | |||
| @@ -118,21 +122,28 @@ void TextField::onKey(EventKey &e) { | |||
| if (!windowIsShiftPressed()) { | |||
| selection = cursor; | |||
| } | |||
| } break; | |||
| case GLFW_KEY_HOME: { | |||
| break; | |||
| case LGLW_VKEY_HOME/*GLFW_KEY_HOME*/: | |||
| selection = cursor = 0; | |||
| } break; | |||
| case GLFW_KEY_END: { | |||
| break; | |||
| case LGLW_VKEY_END/*GLFW_KEY_END*/: | |||
| selection = cursor = text.size(); | |||
| } break; | |||
| case GLFW_KEY_V: { | |||
| break; | |||
| case 'v'/*GLFW_KEY_V*/: | |||
| #if 0 | |||
| if (windowIsModPressed()) { | |||
| const char *newText = glfwGetClipboardString(global_ui->window.gWindow); | |||
| if (newText) | |||
| insertText(newText); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_X: { | |||
| #endif | |||
| break; | |||
| case 'x'/*GLFW_KEY_X*/: | |||
| #if 0 | |||
| if (windowIsModPressed()) { | |||
| if (cursor != selection) { | |||
| int begin = min(cursor, selection); | |||
| @@ -141,8 +152,11 @@ void TextField::onKey(EventKey &e) { | |||
| insertText(""); | |||
| } | |||
| } | |||
| } break; | |||
| case GLFW_KEY_C: { | |||
| #endif | |||
| break; | |||
| case 'c'/*GLFW_KEY_C*/: | |||
| #if 0 | |||
| if (windowIsModPressed()) { | |||
| if (cursor != selection) { | |||
| int begin = min(cursor, selection); | |||
| @@ -150,14 +164,18 @@ void TextField::onKey(EventKey &e) { | |||
| glfwSetClipboardString(global_ui->window.gWindow, selectedText.c_str()); | |||
| } | |||
| } | |||
| } break; | |||
| case GLFW_KEY_A: { | |||
| #endif | |||
| break; | |||
| case 'a'/*GLFW_KEY_A*/: | |||
| if (windowIsModPressed()) { | |||
| selection = 0; | |||
| cursor = text.size(); | |||
| } | |||
| } break; | |||
| case GLFW_KEY_ENTER: { | |||
| break; | |||
| case LGLW_VKEY_RETURN/*GLFW_KEY_ENTER*/: | |||
| // printf("xxx TextField::onKey: RETURN\n"); | |||
| if (multiline) { | |||
| insertText("\n"); | |||
| } | |||
| @@ -165,7 +183,7 @@ void TextField::onKey(EventKey &e) { | |||
| EventAction e; | |||
| onAction(e); | |||
| } | |||
| } break; | |||
| break; | |||
| } | |||
| cursor = clamp(cursor, 0, (int) text.size()); | |||
| @@ -17,7 +17,7 @@ | |||
| /// | |||
| /// created: 25Jun2018 | |||
| /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | |||
| /// 26Jul2018 | |||
| /// 26Jul2018, 04Aug2018, 05Aug2018 | |||
| /// | |||
| /// | |||
| /// | |||
| @@ -45,11 +45,16 @@ YAC_Host *yac_host; // not actually used, just to satisfy the linker | |||
| #include "global.hpp" | |||
| #include "global_ui.hpp" | |||
| #define EDITWIN_X 0 | |||
| #define EDITWIN_Y 0 | |||
| #define EDITWIN_W 1200 | |||
| #define EDITWIN_H 800 | |||
| extern int vst2_init (int argc, char* argv[]); | |||
| extern void vst2_exit (void); | |||
| extern void vst2_editor_create (void); | |||
| extern void vst2_editor_loop (void); | |||
| extern void vst2_editor_destroy (void); | |||
| namespace rack { | |||
| extern void vst2_editor_redraw (void); | |||
| } | |||
| extern void vst2_set_samplerate (sF32 _rate); | |||
| extern void vst2_engine_process (float *const*_in, float **_out, unsigned int _numFrames); | |||
| extern void vst2_process_midi_input_event (sU8 _a, sU8 _b, sU8 _c); | |||
| @@ -59,6 +64,10 @@ 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); | |||
| namespace rack { | |||
| extern void settingsLoad(std::string filename, bool bWindowSizeOnly); | |||
| } | |||
| #include "../include/window.hpp" | |||
| #include "../dep/include/osdialog.h" | |||
| @@ -76,9 +85,6 @@ extern void vst2_set_shared_plugin_tls_globals (void); | |||
| EXTERN_C IMAGE_DOS_HEADER __ImageBase; | |||
| extern "C" extern HWND g_glfw_vst2_parent_hwnd; // read by modified version of GLFW (see glfw/src/win32_window.c) | |||
| extern "C" extern HWND __hack__glfwGetHWND (GLFWwindow *window); | |||
| // Windows: | |||
| #define VST_EXPORT extern "C" __declspec(dllexport) | |||
| @@ -378,7 +384,7 @@ const VstInt32 PLUGIN_VERSION = 1000; | |||
| */ | |||
| class VSTPluginWrapper { | |||
| public: | |||
| static const uint32_t MIN_SAMPLE_RATE = 8192u; // (note) cannot be float in C++ | |||
| static const uint32_t MIN_SAMPLE_RATE = 8192u; | |||
| static const uint32_t MAX_SAMPLE_RATE = 384000u; | |||
| static const uint32_t MIN_BLOCK_SIZE = 64u; | |||
| static const uint32_t MAX_BLOCK_SIZE = 65536u; | |||
| @@ -404,38 +410,13 @@ public: | |||
| bool b_processing; // true=generate output, false=suspended | |||
| ERect editor_rect; | |||
| sBool b_editor_open; | |||
| char *last_program_chunk_str; | |||
| static sSI instance_count; | |||
| sSI instance_id; | |||
| // // sU8 glfw_internal[64*1024]; // far larger than it needs to be, must be >=sizeof(_GLFWlibrary) | |||
| public: | |||
| #ifdef YAC_LINUX | |||
| pthread_t pthread_id; | |||
| #endif | |||
| #ifdef YAC_WIN32 | |||
| HANDLE hThread; | |||
| DWORD dwThreadId; | |||
| #endif | |||
| sBool b_thread_created; | |||
| volatile sBool b_thread_started; | |||
| volatile sBool b_thread_running; | |||
| volatile sBool b_thread_done; | |||
| volatile sBool b_queued_open_editor; | |||
| volatile sBool b_queued_destroy_editor; | |||
| volatile sBool b_editor_open; | |||
| volatile sBool b_editor_created; | |||
| struct { | |||
| volatile uint32_t size; | |||
| volatile uint8_t *addr; | |||
| volatile bool b_ret; | |||
| } queued_load_patch; | |||
| sF32 tmp_input_buffers[NUM_INPUTS * MAX_BLOCK_SIZE]; | |||
| public: | |||
| @@ -454,13 +435,9 @@ public: | |||
| return &_vstPlugin; | |||
| } | |||
| void startUIThread (void); | |||
| void stopUIThread (void); | |||
| void setGlobals(void) { | |||
| rack::global = &rack_global; | |||
| rack::global_ui = &rack_global_ui; | |||
| // // glfwSetInstance((void*)glfw_internal); | |||
| } | |||
| sSI openEffect(void) { | |||
| @@ -468,16 +445,6 @@ public: | |||
| printf("xxx vstrack_plugin::openEffect\n"); | |||
| // (todo) use mutex | |||
| if(1 == instance_count) | |||
| { | |||
| int err = glfwInit(); | |||
| if (err != GLFW_TRUE) { | |||
| osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Could not initialize GLFW."); | |||
| return 0; | |||
| } | |||
| } | |||
| instance_id = instance_count; | |||
| printf("xxx vstrack_plugin::openEffect: instance_id=%d\n", instance_id); | |||
| @@ -494,7 +461,6 @@ public: | |||
| rack_global.init(); | |||
| rack_global_ui.init(); | |||
| rack::global->vst2.last_seen_instance_count = instance_count; | |||
| // // ::memset((void*)glfw_internal, 0, sizeof(glfw_internal)); | |||
| char oldCWD[1024]; | |||
| char dllnameraw[1024]; | |||
| @@ -518,24 +484,56 @@ public: | |||
| (void)vst2_init(argc, argv); | |||
| printf("xxx vstrack_plugin::openEffect: vst2_init() done\n"); | |||
| queued_load_patch.size = 0u; | |||
| queued_load_patch.addr = NULL; | |||
| queued_load_patch.b_ret = false; | |||
| startUIThread(); | |||
| vst2_set_shared_plugin_tls_globals(); | |||
| printf("xxx vstrack_plugin::openEffect: restore cwd=\"%s\"\n", oldCWD); | |||
| ::SetCurrentDirectory(oldCWD); | |||
| setSampleRate(sample_rate); | |||
| b_open = 1; | |||
| b_open = true; | |||
| b_editor_open = false; | |||
| printf("xxx vstrack_plugin::openEffect: LEAVE\n"); | |||
| return 1; | |||
| } | |||
| void setWindowSize(int _width, int _height) { | |||
| if(_width < 640) | |||
| _width = 640; | |||
| if(_height < 480) | |||
| _height = 480; | |||
| editor_rect.right = EDITWIN_X + _width; | |||
| editor_rect.bottom = EDITWIN_Y + _height; | |||
| } | |||
| void openEditor(void *_hwnd) { | |||
| printf("xxx vstrack_plugin: openEditor() parentHWND=%p\n", _hwnd); | |||
| setGlobals(); | |||
| (void)lglw_window_open(rack_global_ui.window.lglw, | |||
| _hwnd, | |||
| 0/*x*/, 0/*y*/, | |||
| (editor_rect.right - editor_rect.left), | |||
| (editor_rect.bottom - editor_rect.top) | |||
| ); | |||
| b_editor_open = true; | |||
| } | |||
| void closeEditor(void) { | |||
| printf("xxx vstrack_plugin: closeEditor() b_editor_open=%d\n", b_editor_open); | |||
| if(b_editor_open) | |||
| { | |||
| setGlobals(); | |||
| lglw_window_close(rack_global_ui.window.lglw); | |||
| b_editor_open = false; | |||
| } | |||
| } | |||
| void closeEffect(void) { | |||
| closeEditor(); | |||
| // (todo) use mutex | |||
| printf("xxx vstrack_plugin::closeEffect: last_program_chunk_str=%p\n", last_program_chunk_str); | |||
| if(NULL != last_program_chunk_str) | |||
| @@ -548,32 +546,17 @@ public: | |||
| if(b_open) | |||
| { | |||
| b_open = 0; | |||
| b_open = false; | |||
| setGlobals(); | |||
| rack::global->vst2.last_seen_instance_count = instance_count; | |||
| b_queued_destroy_editor = true; | |||
| rack::global_ui->vst2.b_close_window = 1; | |||
| while(b_queued_destroy_editor) | |||
| { | |||
| printf("[dbg] vstrack_plugin: wait until editor's been destroyed\n"); | |||
| sleepMillisecs(100); // (todo) condition | |||
| } | |||
| stopUIThread(); | |||
| printf("xxx vstrack_plugin: call vst2_exit()\n"); | |||
| vst2_exit(); | |||
| printf("xxx vstrack_plugin: vst2_exit() done\n"); | |||
| if(1 == instance_count) | |||
| { | |||
| glfwTerminate(); | |||
| } | |||
| #ifdef USE_CONSOLE | |||
| // FreeConsole(); | |||
| #endif // USE_CONSOLE | |||
| @@ -581,54 +564,6 @@ public: | |||
| } | |||
| #ifdef YAC_WIN32 | |||
| void openEditor(HWND _hwnd) { | |||
| //g_glfw_vst2_parent_hwnd = _hwnd; | |||
| g_glfw_vst2_parent_hwnd = 0; | |||
| #else | |||
| #error implement me (openEditor) | |||
| #endif | |||
| printf("xxx vstrack_plugin: openEditor()\n"); | |||
| b_queued_open_editor = true; | |||
| #ifdef YAC_WIN32 | |||
| rack::global_ui->vst2.parent_hwnd = (void*)_hwnd; | |||
| printf("xxx vstrack_plugin: DAW parent hwnd=%p\n", rack::global_ui->vst2.parent_hwnd); | |||
| #endif // YAC_WIN32 | |||
| int iter = 0; | |||
| while(iter++ < 50) | |||
| { | |||
| if(b_editor_open) | |||
| break; | |||
| sleepMillisecs(100); // (todo) condition | |||
| } | |||
| if(100 == iter) | |||
| printf("xxx vstrack_plugin: failed to show editor after %d milliseconds!!\n", (iter*100)); | |||
| else | |||
| printf("xxx vstrack_plugin: editor opened after %d milliseconds\n", (iter*100)); | |||
| // // vst2_show_editor(); | |||
| } | |||
| void hideEditor(void) { | |||
| printf("xxx vstrack_plugin: hideEditor() b_editor_open=%d\n", b_editor_open); | |||
| if(b_editor_open) | |||
| { | |||
| setGlobals(); | |||
| rack::global_ui->vst2.b_hide_window = 1; | |||
| } | |||
| } | |||
| void closeEditor(void) { | |||
| printf("xxx vstrack_plugin: closeEditor() b_editor_open=%d\n", b_editor_open); | |||
| if(b_editor_open) | |||
| { | |||
| setGlobals(); | |||
| rack::global_ui->vst2.b_close_window = 1; | |||
| } | |||
| } | |||
| void lockAudio(void) { | |||
| mtx_audio.lock(); | |||
| } | |||
| @@ -686,7 +621,7 @@ public: | |||
| return 0; | |||
| } | |||
| sUI getProgramChunk(uint8_t **_addr) { | |||
| sUI getProgramChunk(uint8_t**_addr) { | |||
| setGlobals(); | |||
| if(NULL != last_program_chunk_str) | |||
| { | |||
| @@ -696,61 +631,29 @@ public: | |||
| if(NULL != last_program_chunk_str) | |||
| { | |||
| *_addr = (uint8_t*)last_program_chunk_str; | |||
| return strlen(last_program_chunk_str) + 1/*ASCIIZ*/; | |||
| return (sUI)strlen(last_program_chunk_str) + 1/*ASCIIZ*/; | |||
| } | |||
| return 0; | |||
| } | |||
| bool setBankChunk(size_t _size, uint8_t*_addr) { | |||
| bool setBankChunk(size_t _size, uint8_t *_addr) { | |||
| bool r = false; | |||
| return r; | |||
| } | |||
| bool setProgramChunk_Async(size_t _size, uint8_t*_addr) { | |||
| bool r = false; | |||
| bool setProgramChunk(size_t _size, uint8_t *_addr) { | |||
| setGlobals(); | |||
| if(NULL != _addr) | |||
| { | |||
| queued_load_patch.b_ret = false; | |||
| queued_load_patch.size = _size; | |||
| queued_load_patch.addr = _addr; // triggers loader in UI thread | |||
| int iter = 0; | |||
| for(;;) | |||
| { | |||
| if(NULL == queued_load_patch.addr) | |||
| { | |||
| queued_load_patch.b_ret = r; | |||
| break; | |||
| } | |||
| else if(++iter > 500) | |||
| { | |||
| printf("[---] vstrack_plugin:queueSetProgramChunk: timeout while waiting for UI thread.\n"); | |||
| break; | |||
| } | |||
| sleepMillisecs(10); | |||
| } | |||
| } | |||
| return r; | |||
| } | |||
| void handleSetQueuedProgramChunk(void) { | |||
| if(NULL != queued_load_patch.addr) | |||
| { | |||
| setGlobals(); | |||
| lockAudio(); | |||
| lockAudio(); | |||
| #if 0 | |||
| printf("xxx vstrack_plugin:setProgramChunk: size=%u str=\n-------------------%s\n------------------\n", queued_load_patch.size, (const char*)queued_load_patch.addr); | |||
| #else | |||
| printf("xxx vstrack_plugin:setProgramChunk: size=%u\n", queued_load_patch.size); | |||
| printf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); | |||
| #endif | |||
| bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)queued_load_patch.addr); | |||
| printf("xxx vstrack_plugin:setProgramChunk: r=%d\n", r); | |||
| queued_load_patch.b_ret = r; | |||
| queued_load_patch.addr = NULL; | |||
| unlockAudio(); | |||
| } | |||
| lglw_glcontext_push(rack::global_ui->window.lglw); | |||
| bool r = rack::global_ui->app.gRackWidget->loadPatchFromString((const char*)_addr); | |||
| rack::global_ui->ui.gScene->step(); // w/o this the patch is bypassed | |||
| lglw_glcontext_pop(rack::global_ui->window.lglw); | |||
| printf("xxx vstrack_plugin:setProgramChunk: r=%d\n", r); | |||
| unlockAudio(); | |||
| return r; | |||
| } | |||
| #ifdef HAVE_WINDOWS | |||
| @@ -799,7 +702,7 @@ public: | |||
| if(0 != (timeInfo->flags & kVstPpqPosValid)) | |||
| { | |||
| *_retSongPosPPQ = timeInfo->ppqPos; | |||
| *_retSongPosPPQ = (float)timeInfo->ppqPos; | |||
| } | |||
| } | |||
| } | |||
| @@ -816,171 +719,6 @@ private: | |||
| sSI VSTPluginWrapper::instance_count = 0; | |||
| #ifdef YAC_LINUX | |||
| static void *vst2_ui_thread_entry(VSTPluginWrapper *_wrapper) { | |||
| #elif defined(YAC_WIN32) | |||
| static DWORD WINAPI vst2_ui_thread_entry(VSTPluginWrapper *_wrapper) { | |||
| #endif | |||
| printf("xxx vstrack_plugin: UI thread started\n"); | |||
| _wrapper->setGlobals(); | |||
| printf("xxx vstrack_plugin<ui>: global=%p global_ui=%p\n", rack::global, rack::global_ui); | |||
| printf("xxx vstrack_plugin<ui>: call vst2_editor_create()\n"); | |||
| _wrapper->lockAudio(); | |||
| vst2_editor_create(); | |||
| printf("xxx vstrack_plugin<ui>: vst2_editor_create() done\n"); | |||
| _wrapper->b_editor_created = YAC_TRUE; | |||
| _wrapper->unlockAudio(); | |||
| _wrapper->b_thread_started = YAC_TRUE; | |||
| vst2_set_shared_plugin_tls_globals(); | |||
| while(_wrapper->b_thread_running || _wrapper->b_queued_destroy_editor || _wrapper->queued_load_patch.addr) | |||
| { | |||
| // printf("xxx vstrack_plugin<ui>: idle loop\n"); | |||
| if(_wrapper->b_queued_open_editor && !_wrapper->b_editor_open) | |||
| { | |||
| if(!_wrapper->b_editor_created) | |||
| { | |||
| } | |||
| _wrapper->b_queued_open_editor = YAC_FALSE; | |||
| // Show previously hidden window | |||
| #if defined(YAC_WIN32) && defined(VST2_REPARENT_WINDOW_HACK) | |||
| #if 0 | |||
| HWND glfwHWND = __hack__glfwGetHWND(rack::global_ui->window.gWindow); | |||
| ::SetParent(glfwHWND, | |||
| (HWND)rack::global_ui->vst2.parent_hwnd | |||
| ); | |||
| printf("xxx vstrack: SetParent(glfwHWND=%p, dawParentHWND=%p)\n", (void*)glfwHWND, rack::global_ui->vst2.parent_hwnd); | |||
| #endif | |||
| #endif // YAC_WIN32 | |||
| glfwShowWindow(rack::global_ui->window.gWindow); | |||
| #ifdef VST2_REPARENT_WINDOW_HACK | |||
| // maximize window once it starts to receive events (see window.cpp) | |||
| rack::global_ui->vst2.b_queued_maximize_window = true; | |||
| #endif // VST2_REPARENT_WINDOW_HACK | |||
| _wrapper->b_editor_open = YAC_TRUE; | |||
| rack::global_ui->vst2.b_close_window = 0; | |||
| printf("xxx vstrack_plugin[%d]: entering editor_loop\n", _wrapper->instance_id); | |||
| vst2_editor_loop(); // sets b_editor_open=true and b_queued_open_editor=false (must be delayed until window is actually visible or window create/focus tracking will not work) | |||
| _wrapper->b_editor_open = YAC_FALSE; | |||
| printf("xxx vstrack_plugin[%d]: editor_loop finished\n", _wrapper->instance_id); | |||
| // if(!_wrapper->b_window_created) | |||
| // { | |||
| // ShowUIWindow(); | |||
| // use metahost_onTimer for SDL.onTimer; | |||
| // b_window_created = true; | |||
| // trace "[dbg] eureka: entering eventloop 2"; | |||
| // b_editor_open = true; | |||
| // UI.Run(); | |||
| // } | |||
| } | |||
| else if(_wrapper->b_queued_destroy_editor) | |||
| { | |||
| printf("xxx vstrack<ui>: _wrapper->b_queued_destroy_editor is 1, b_editor_created=%d\n", _wrapper->b_editor_created); | |||
| if(_wrapper->b_editor_created) | |||
| { | |||
| #if 0 | |||
| #if defined(YAC_WIN32) && defined(VST2_REPARENT_WINDOW_HACK) | |||
| ::SetParent(__hack__glfwGetHWND(rack::global_ui->window.gWindow), NULL); // [bsp 04Jul2018] reparent hack (fix hang up when DAW editor is closed) | |||
| #endif // VST2_REPARENT_WINDOW_HACK | |||
| #endif | |||
| vst2_editor_destroy(); | |||
| _wrapper->b_editor_created = YAC_FALSE; | |||
| } | |||
| _wrapper->b_queued_destroy_editor = YAC_FALSE; | |||
| } | |||
| else if(NULL != _wrapper->queued_load_patch.addr) | |||
| { | |||
| _wrapper->handleSetQueuedProgramChunk(); | |||
| } | |||
| else | |||
| { | |||
| _wrapper->sleepMillisecs(100); | |||
| } | |||
| } | |||
| printf("xxx vstrack_plugin: UI thread finished\n"); | |||
| _wrapper->b_thread_done = YAC_TRUE; | |||
| return 0; | |||
| } | |||
| void VSTPluginWrapper::startUIThread(void) { | |||
| b_queued_open_editor = false; | |||
| b_queued_destroy_editor = false; | |||
| b_editor_open = false; | |||
| b_editor_created = false; | |||
| queued_load_patch.b_ret = false; | |||
| queued_load_patch.size = 0u; | |||
| queued_load_patch.addr = NULL; | |||
| b_thread_created = YAC_FALSE; | |||
| b_thread_running = YAC_TRUE; | |||
| b_thread_done = YAC_FALSE; | |||
| #ifdef YAC_LINUX | |||
| b_thread_created = (pthread_create( &pthread_id, NULL, vst2_ui_thread_entry, (void*) this ) == 0); | |||
| if(b_thread_created) | |||
| { | |||
| /* wait for lwp_id field to become valid */ | |||
| while(!b_thread_started) | |||
| { | |||
| pthread_yield(); | |||
| } | |||
| } | |||
| #endif // YAC_POSIX | |||
| #ifdef YAC_WIN32 | |||
| hThread = CreateThread( | |||
| NULL, // default security attributes | |||
| 0, // use default stack size | |||
| (LPTHREAD_START_ROUTINE)vst2_ui_thread_entry,// thread function | |||
| (LPVOID)this, // argument to thread function | |||
| 0, // use default creation flags | |||
| &dwThreadId); // returns the thread identifier | |||
| b_thread_created = (hThread != NULL); | |||
| while(!b_thread_started) | |||
| sleepMillisecs(10); // (todo) use condition | |||
| #endif | |||
| } | |||
| void VSTPluginWrapper::stopUIThread(void) { | |||
| b_thread_running = YAC_FALSE; | |||
| while(!b_thread_done) | |||
| { | |||
| sleepMillisecs(10); // (todo) use condition | |||
| } | |||
| #ifdef YAC_LINUX | |||
| ///pthread_join( pthread_id, NULL); | |||
| pthread_detach( pthread_id ); | |||
| pthread_cancel( pthread_id ); | |||
| pthread_id = 0; | |||
| #endif | |||
| #ifdef YAC_WIN32 | |||
| SuspendThread( hThread ); | |||
| TerminateThread( hThread, 10 ); // 10 = exit code | |||
| WaitForMultipleObjects(1, &hThread, TRUE, 5000 /*INFINITE*/); // wait max. 5sec | |||
| CloseHandle(hThread); | |||
| hThread = NULL; | |||
| #endif | |||
| } | |||
| /******************************************* | |||
| * Callbacks: Host -> Plugin | |||
| @@ -1022,7 +760,6 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||
| //printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: wrapper=%p\n", wrapper); | |||
| sUI chIdx; | |||
| sUI i; | |||
| // (note) Cubase (tested with 9.5.30) uses the same buffer(s) for both input&output | |||
| // => back up the inputs before clearing the outputs | |||
| @@ -1061,46 +798,6 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||
| } | |||
| #if 0 | |||
| /** | |||
| * This is the callback that will be called to process the samples in the case of double precision. This is where the | |||
| * meat of the logic happens! | |||
| * | |||
| * @param vstPlugin the object returned by VSTPluginMain | |||
| * @param inputs an array of array of input samples. You read from it. First dimension is for inputs, second dimension is for samples: inputs[numInputs][sampleFrames] | |||
| * @param outputs an array of array of output samples. You write to it. First dimension is for outputs, second dimension is for samples: outputs[numOuputs][sampleFrames] | |||
| * @param sampleFrames the number of samples (second dimension in both arrays) | |||
| */ | |||
| void VSTPluginProcessReplacingFloat64(VSTPlugin *vstPlugin, | |||
| double **inputs, | |||
| double **outputs, | |||
| VstInt32 sampleFrames | |||
| ) { | |||
| // 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(); | |||
| if(wrapper->b_processing) | |||
| { | |||
| // code speaks for itself: for each input (2 when stereo input), iterating over every sample and writing the | |||
| // result in the outputs array after multiplying by 0.5 (which result in a 3dB attenuation of the sound) | |||
| for(int i = 0; i < wrapper->getNumInputs(); i++) | |||
| { | |||
| auto inputSamples = inputs[i]; | |||
| auto outputSamples = outputs[i]; | |||
| for(int j = 0; j < sampleFrames; j++) | |||
| { | |||
| outputSamples[j] = inputSamples[j] * 0.5; | |||
| } | |||
| } | |||
| } | |||
| wrapper->unlockAudio(); | |||
| } | |||
| #endif // 0 | |||
| /** | |||
| * This is the plugin called by the host to communicate with the plugin, mainly to request information (like the | |||
| @@ -1297,14 +994,14 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| // ptr: buffer address | |||
| // r: buffer size | |||
| printf("xxx effGetChunk index=%d ptr=%p\n", index, ptr); | |||
| // if(0 == index) | |||
| // { | |||
| // r = wrapper->getBankChunk((uint8_t**)ptr); | |||
| // } | |||
| // else | |||
| // { | |||
| // // if(0 == index) | |||
| // // { | |||
| // // r = wrapper->getBankChunk((uint8_t**)ptr); | |||
| // // } | |||
| // // else | |||
| // // { | |||
| r = wrapper->getProgramChunk((uint8_t**)ptr); | |||
| // } | |||
| // // } | |||
| break; | |||
| case effSetChunk: | |||
| @@ -1313,14 +1010,14 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| // ptr: buffer address | |||
| // r: 1 | |||
| printf("xxx effSetChunk index=%d size=%lld ptr=%p\n", index, value, ptr); | |||
| // if(0 == index) | |||
| // { | |||
| // r = wrapper->setBankChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; | |||
| // } | |||
| // else | |||
| // { | |||
| r = wrapper->setProgramChunk_Async(size_t(value), (uint8_t*)ptr) ? 1 : 0; | |||
| // } | |||
| // // if(0 == index) | |||
| // // { | |||
| // // r = wrapper->setBankChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; | |||
| // // } | |||
| // // else | |||
| // // { | |||
| r = wrapper->setProgramChunk(size_t(value), (uint8_t*)ptr) ? 1 : 0; | |||
| // // } | |||
| break; | |||
| case effShellGetNextPlugin: | |||
| @@ -1431,6 +1128,19 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| #endif | |||
| case effEditIdle: | |||
| wrapper->setGlobals(); | |||
| if(lglw_window_is_visible(rack::global_ui->window.lglw)) | |||
| { | |||
| vst2_set_shared_plugin_tls_globals(); | |||
| // Save DAW GL context and bind our own | |||
| lglw_glcontext_push(rack::global_ui->window.lglw); | |||
| rack::vst2_editor_redraw(); | |||
| // Restore the DAW's GL context | |||
| lglw_glcontext_pop(rack::global_ui->window.lglw); | |||
| } | |||
| break; | |||
| case effEditGetRect: | |||
| @@ -1439,16 +1149,6 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| if(NULL != ptr) // yeah, this should never be NULL | |||
| { | |||
| // ... | |||
| #define EDITWIN_X 20 | |||
| #define EDITWIN_Y 20 | |||
| // #define EDITWIN_W 1200 | |||
| // #define EDITWIN_H 800 | |||
| #define EDITWIN_W 60 | |||
| #define EDITWIN_H 21 | |||
| wrapper->editor_rect.left = EDITWIN_X; | |||
| wrapper->editor_rect.top = EDITWIN_Y; | |||
| wrapper->editor_rect.right = EDITWIN_X + EDITWIN_W; | |||
| wrapper->editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | |||
| *(void**)ptr = (void*) &wrapper->editor_rect; | |||
| r = 1; | |||
| } | |||
| @@ -1468,16 +1168,13 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| case effEditOpen: | |||
| // Show editor window | |||
| // ptr: native window handle (hWnd on Windows) | |||
| #ifdef YAC_WIN32 | |||
| wrapper->openEditor((HWND)ptr); | |||
| #endif | |||
| wrapper->openEditor(ptr); | |||
| r = 1; | |||
| break; | |||
| case effEditClose: | |||
| // Hide editor window | |||
| // // wrapper->closeEditor(); | |||
| wrapper->hideEditor(); | |||
| // Close editor window | |||
| wrapper->closeEditor(); | |||
| r = 1; | |||
| break; | |||
| @@ -1563,7 +1260,7 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||
| effFlagsIsSynth | | |||
| #endif | |||
| effFlagsCanReplacing | | |||
| (effFlagsCanDoubleReplacing & 0) | | |||
| // (effFlagsCanDoubleReplacing & 0) | | |||
| effFlagsProgramChunks | | |||
| effFlagsHasEditor ; | |||
| @@ -1592,8 +1289,12 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||
| last_program_chunk_str = NULL; | |||
| b_open = false; | |||
| b_editor_open = false; | |||
| // script_context = NULL; | |||
| editor_rect.left = EDITWIN_X; | |||
| editor_rect.top = EDITWIN_Y; | |||
| editor_rect.right = EDITWIN_X + EDITWIN_W; | |||
| editor_rect.bottom = EDITWIN_Y + EDITWIN_H; | |||
| } | |||
| /** | |||
| @@ -1615,9 +1316,9 @@ void vst2_unlock_midi_device() { | |||
| rack::global->vst2.wrapper->mtx_mididev.unlock(); | |||
| } | |||
| void vst2_handle_queued_set_program_chunk(void) { | |||
| (void)rack::global->vst2.wrapper->handleSetQueuedProgramChunk(); | |||
| } | |||
| // void vst2_handle_queued_set_program_chunk(void) { | |||
| // (void)rack::global->vst2.wrapper->handleSetQueuedProgramChunk(); | |||
| // } | |||
| void vst2_handle_ui_param(int uniqueParamId, float normValue) { | |||
| // Called by engineSetParam() | |||
| @@ -1629,24 +1330,15 @@ void vst2_get_timing_info(int *_retPlaying, float *_retBPM, float *_retSongPosPP | |||
| rack::global->vst2.wrapper->getTimingInfo(_retPlaying, _retBPM, _retSongPosPPQ); | |||
| } | |||
| #ifdef VST2_REPARENT_WINDOW_HACK | |||
| #ifdef YAC_WIN32 | |||
| void vst2_maximize_reparented_window(void) { | |||
| #if 0 | |||
| HWND glfwHWND = __hack__glfwGetHWND(rack::global_ui->window.gWindow); | |||
| HWND parentHWND = (HWND)rack::global_ui->vst2.parent_hwnd; | |||
| printf("xxx vstrack_plugin:vst2_maximize_reparented_window: hwnd=%p\n", (void*)glfwHWND); | |||
| RECT rect; | |||
| (void)::GetClientRect(parentHWND, &rect); | |||
| ///(void)::AdjustWindowRect(..) | |||
| printf("xxx vstrack_plugin:vst2_maximize_reparented_window: new size=(%d; %d)\n", rect.right-rect.left, rect.bottom-rect.top); | |||
| ::MoveWindow(glfwHWND, 0, 0, rect.right-rect.left, rect.bottom-rect.top, TRUE/*bRepaint*/); | |||
| // ::ShowWindow(glfwHWND, SW_MAXIMIZE); | |||
| // // ::ShowWindow(glfwHWND, SW_SHOWMAXIMIZED); | |||
| #endif // 0 | |||
| void vst2_set_globals(void *_wrapper) { | |||
| VSTPluginWrapper *wrapper = (VSTPluginWrapper *)_wrapper; | |||
| wrapper->setGlobals(); | |||
| } | |||
| #endif // YAC_WIN32 | |||
| #endif // VST2_REPARENT_WINDOW_HACK | |||
| void vst2_window_size_set(int _width, int _height) { | |||
| rack::global->vst2.wrapper->setWindowSize(_width, _height); | |||
| } | |||
| /** | |||
| * Implementation of the main entry point of the plugin | |||
| @@ -1,3 +1,11 @@ | |||
| ** August 5th, 2018 | |||
| - replace GLFW window / input event handling by LGLW library | |||
| => no more "dummy" windows | |||
| => automation should now work in all DAWs | |||
| => effect and instrument plugins may now be used in the same DAW project | |||
| - window size can now be configured via settings.json "windowSize" property | |||
| ** July 26th, 2018 | |||
| - fix effect processing in Cubase 9.5.30 | |||
| @@ -1,5 +1,5 @@ | |||
| VeeSeeVST Rack VST 2.4 Plugin -- July 26th, 2018 | |||
| ================================================ | |||
| VeeSeeVST Rack VST 2.4 Plugin -- August 5th, 2018 | |||
| ================================================= | |||
| !!!------------------------------------------------------------------------------ | |||
| !!! ***** THIS IS NOT AN OFFICIAL VCV RACK RELEASE ***** !!! | |||
| @@ -16,8 +16,6 @@ This is a quick'n'dirty adaption of VCV Rack 0.6.1 for the VST2 format. | |||
| + supports VST program chunks (=> patches are saved with the DAW's project file or as .fxp files) | |||
| + supports VST host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) | |||
| + supports VST parameters (send / recv) | |||
| - does not support plugin DLLs due to VCV Rack's architecture which prevents this when it is run as a plugin itself | |||
| - future releases will contain additional (open source) add-ons modules | |||
| Here's a demo video of it: https://vimeo.com/277703414 | |||
| @@ -25,6 +23,8 @@ Tested in | |||
| - Eureka (my own work-in-progress VST host) | |||
| - Cockos Reaper | |||
| - Propellerhead Reason 10 | |||
| - Steinberg Cubase Pro 9.5.30 | |||
| - LMMS 1.2.0-rc6 | |||
| The VST2 plugin includes the following add-on modules: | |||
| - Alikins.IdleSwitch | |||
| @@ -1,6 +1,6 @@ | |||
| [0.000 info src/main.cpp:63] VeeSeeVST Rack 0.6.1 | |||
| [0.000 info src/main.cpp:66] Global directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||
| [0.000 info src/main.cpp:67] Local directory: f:\git\VeeSeeVSTRack\vst2_bin\/ | |||
| [0.000 info src/main.cpp:59] VeeSeeVST Rack 0.6.1 | |||
| [0.000 info src/main.cpp:62] Global directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||
| [0.000 info src/main.cpp:63] Local directory: F:\git\VeeSeeVSTRack\vst2_bin\/ | |||
| [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin Alikins 0.6.1 | |||
| [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AS 0.6.1 | |||
| [0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 0.6.1 | |||
| @@ -22,12 +22,12 @@ | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin LindenbergResearch 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin LOGinstruments 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||
| [0.001 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin ML_modules 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin moDllz 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin modular80 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin mscHack 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin mtsch-plugins 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin NauModular 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Ohmer 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Qwelk 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 0.6.1 | |||
| @@ -40,74 +40,58 @@ | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin trowaSoft 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin unless_modules 0.6.1 | |||
| [0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 0.6.1 | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist | |||
| [0.002 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist | |||
| [0.003 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file f:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist | |||
| [0.003 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||
| [0.003 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||
| [0.004 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||
| [0.186 info src/window.cpp:711] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||
| [0.187 info src/settings.cpp:185] Loading settings f:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||
| [0.191 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| [0.288 info src/app/RackWidget.cpp:196] Loading patch from string | |||
| [0.290 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/MIDIToCVInterface.svg | |||
| [0.290 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg | |||
| [0.290 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/PJ301M.svg | |||
| [0.290 info src/window.cpp:711] Loaded font f:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf | |||
| [0.291 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/ADSR.svg | |||
| [0.291 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg | |||
| [0.292 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCO-1.svg | |||
| [0.292 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_0.svg | |||
| [0.292 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/CKSS_1.svg | |||
| [0.292 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg | |||
| [0.293 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\plugins/Fundamental/res/VCA.svg | |||
| [0.294 info src/window.cpp:764] Loaded SVG f:\git\VeeSeeVSTRack\vst2_bin\/res/Core/AudioInterface.svg | |||
| [61.404 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| [62.652 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| [65.283 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| [72.333 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Alikins/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AS/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/AudibleInstruments/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BaconMusic/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Befaco/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bidoo/plugin.dll does not exist | |||
| [0.002 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Bogaudio/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/BOKONTEPByteBeatMachine/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/cf/plugin.dll does not exist | |||
| [0.003 info src/plugin.cpp:155] Loaded plugin dBiz 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/dBiz/plugin.dll | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DHE-Modules/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/DrumKit/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ErraticInstruments/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ESeries/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/FrozenWasteland/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Fundamental/plugin.dll does not exist | |||
| [0.003 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Gratrix/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/HetrickCV/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/huaba/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/JW-Modules/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Koralfx-Modules/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LindenbergResearch/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/LOGinstruments/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/ML_modules/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/moDllz/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/modular80/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mscHack/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/mtsch-plugins/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/NauModular/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Ohmer/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Qwelk/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/RJModules/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SerialRacker/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SonusModular/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Southpole-parasites/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/squinkylabs-plug1/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/SubmarineFree/plugin.dll does not exist | |||
| [0.004 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template/plugin.dll does not exist | |||
| [0.005 info src/plugin.cpp:155] Loaded plugin Template_shared 0.6.1 from F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Template_shared/plugin.dll | |||
| [0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/trowaSoft/plugin.dll does not exist | |||
| [0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/unless_modules/plugin.dll does not exist | |||
| [0.005 warn src/plugin.cpp:86] Plugin file F:\git\VeeSeeVSTRack\vst2_bin\/plugins/Valley/plugin.dll does not exist | |||
| [0.005 info src/settings.cpp:194] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||
| [0.030 info src/window.cpp:973] Loaded font F:\git\VeeSeeVSTRack\vst2_bin\/res/fonts/DejaVuSans.ttf | |||
| [0.030 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_146097_cc.svg | |||
| [0.030 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_31859_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343816_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1343811_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1084369_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1745061_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_1240789_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_305536_cc.svg | |||
| [0.031 info src/window.cpp:1028] Loaded SVG F:\git\VeeSeeVSTRack\vst2_bin\/res/icons/noun_468341_cc.svg | |||
| [0.031 info src/settings.cpp:194] Loading settings F:\git\VeeSeeVSTRack\vst2_bin\/settings.json | |||
| [0.032 info src/app/RackWidget.cpp:158] Saving patch to string | |||
| @@ -2,14 +2,14 @@ | |||
| "token": "", | |||
| "windowSize": [ | |||
| 1240.0, | |||
| 810.0 | |||
| 820.0 | |||
| ], | |||
| "windowPos": [ | |||
| 60.0, | |||
| 83.0 | |||
| ], | |||
| "wireOpacity": 50.0, | |||
| "wireTension": 1.0, | |||
| "wireTension": 0.97, | |||
| "zoom": 1.0, | |||
| "allowCursorLock": true, | |||
| "sampleRate": 44100.0, | |||
| @@ -3,7 +3,7 @@ | |||
| # | |||
| # | |||
| EXTRAFLAGS+= -DVERSION=0.6.1 -D_USE_MATH_DEFINES -Iinclude/ -Idep/include -DUSE_VST2 | |||
| EXTRAFLAGS+= -DVERSION=0.6.1 -D_USE_MATH_DEFINES -Iinclude/ -Idep/include -Idep/ -DUSE_VST2 | |||
| include vst2_common_msvc_pre.mk | |||
| @@ -10,6 +10,7 @@ else | |||
| EXTRALIBS+= -LIBPATH:dep/lib/msvc/x86 | |||
| endif | |||
| EXTRALIBS+= libspeexdsp.lib glew.lib glfw.lib opengl32.lib gdi32.lib user32.lib kernel32.lib Comdlg32.lib Shell32.lib ws2_32.lib winmm.lib | |||
| EXTRALIBS+= libspeexdsp.lib glew.lib opengl32.lib gdi32.lib user32.lib kernel32.lib Comdlg32.lib Shell32.lib ws2_32.lib winmm.lib | |||
| #glfw.lib | |||
| plugin_lib = $(PLUGIN_DIR)/$(1)/$(1).lib | |||