@@ -12,7 +12,7 @@ | |||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
struct VSTPluginWrapper; | |||||
class VSTPluginWrapper; | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
@@ -8,7 +8,6 @@ | |||||
#include "widgets.hpp" | #include "widgets.hpp" | ||||
struct GLFWwindow; | |||||
struct NVGcontext; | struct NVGcontext; | ||||
@@ -31,7 +30,7 @@ struct Model; | |||||
struct GlobalUI { | struct GlobalUI { | ||||
struct { | struct { | ||||
GLFWwindow *gWindow; | |||||
void *lglw; // lglw_t | |||||
NVGcontext *gVg; | NVGcontext *gVg; | ||||
NVGcontext *gFramebufferVg; | NVGcontext *gFramebufferVg; | ||||
std::shared_ptr<Font> gGuiFont; | std::shared_ptr<Font> gGuiFont; | ||||
@@ -92,28 +91,16 @@ struct GlobalUI { | |||||
int bnd_font; | int bnd_font; | ||||
} blendish; | } 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) { | void init(void) { | ||||
window.gWindow = NULL; | |||||
window.lglw = NULL; | |||||
window.gVg = NULL; | window.gVg = NULL; | ||||
window.gFramebufferVg = NULL; | window.gFramebufferVg = NULL; | ||||
window.gPixelRatio = 1.0; | window.gPixelRatio = 1.0; | ||||
window.gWindowRatio = 1.0; | window.gWindowRatio = 1.0; | ||||
// #ifdef USE_VST2 | |||||
// window.gAllowCursorLock = false; | |||||
// #else | |||||
window.gAllowCursorLock = true; | window.gAllowCursorLock = true; | ||||
// #endif // USE_VST2 | |||||
window.gGuiFrame = 0; | |||||
window.windowX = 0; | window.windowX = 0; | ||||
window.windowY = 0; | window.windowY = 0; | ||||
window.windowWidth = 0; | window.windowWidth = 0; | ||||
@@ -143,15 +130,6 @@ struct GlobalUI { | |||||
blendish.bnd_icon_image = -1; | blendish.bnd_icon_image = -1; | ||||
blendish.bnd_font = -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; | extern bool gSkipAutosaveOnLaunch; | ||||
void settingsSave(std::string filename); | void settingsSave(std::string filename); | ||||
void settingsLoad(std::string filename); | |||||
void settingsLoad(std::string filename, bool bWindowSizeOnly); | |||||
} // namespace rack | } // namespace rack |
@@ -2,7 +2,8 @@ | |||||
#include "widgets.hpp" | #include "widgets.hpp" | ||||
#define GLEW_STATIC | #define GLEW_STATIC | ||||
#include <GL/glew.h> | #include <GL/glew.h> | ||||
#include <GLFW/glfw3.h> | |||||
////#include <GLFW/glfw3.h> | |||||
#include <lglw/lglw.h> | |||||
#ifdef ARCH_MAC | #ifdef ARCH_MAC | ||||
@@ -12,12 +13,19 @@ | |||||
#endif | #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; | extern const char *g_program_dir; | ||||
namespace rack { | namespace rack { | ||||
extern GLFWwindow *gWindow; | |||||
// extern GLFWwindow *gWindow; | |||||
extern NVGcontext *gVg; | extern NVGcontext *gVg; | ||||
extern NVGcontext *gFramebufferVg; | extern NVGcontext *gFramebufferVg; | ||||
/** The default font to use for GUI elements */ | /** The default font to use for GUI elements */ | ||||
@@ -40,7 +40,6 @@ COMMON_OBJ= \ | |||||
src/audio.o \ | src/audio.o \ | ||||
src/dsp/minblep.o \ | src/dsp/minblep.o \ | ||||
src/engine.o \ | src/engine.o \ | ||||
src/keyboard.o \ | |||||
src/midi.o \ | src/midi.o \ | ||||
src/plugin.o \ | src/plugin.o \ | ||||
src/settings.o \ | src/settings.o \ | ||||
@@ -83,6 +82,8 @@ COMMON_OBJ= \ | |||||
src/window.o \ | src/window.o \ | ||||
src/vstmidi.o | src/vstmidi.o | ||||
# src/keyboard.o | |||||
HOST_OBJ= \ | HOST_OBJ= \ | ||||
src/Core/AudioInterface.o \ | src/Core/AudioInterface.o \ | ||||
src/Core/Blank.o \ | src/Core/Blank.o \ | ||||
@@ -98,7 +99,8 @@ LIB_OBJ= \ | |||||
$(HOST_OBJ) | $(HOST_OBJ) | ||||
LIB_OBJ_WIN= \ | LIB_OBJ_WIN= \ | ||||
src/util/dirent_win32/dirent.o | |||||
src/util/dirent_win32/dirent.o \ | |||||
dep/lglw/lglw_windows.o | |||||
SHARED_LIB_OBJ= \ | SHARED_LIB_OBJ= \ | ||||
$(COMMON_OBJ) | $(COMMON_OBJ) | ||||
@@ -23,9 +23,9 @@ vst: lib | |||||
rm -f src/vst2_main.o | rm -f src/vst2_main.o | ||||
make -f makefile_vst_effect.msvc bin -j $(NUM_JOBS) | make -f makefile_vst_effect.msvc bin -j $(NUM_JOBS) | ||||
# (note) cannot use both instrument and effect plugin at the same time! | # (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/ | 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 | @ls -l vst2_bin/veeseevstrack_effect.dll | ||||
clean: | clean: | ||||
@@ -7,7 +7,8 @@ include dep/yac/install_msvc.mk | |||||
TARGET_BASENAME=Rack | 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) | ifeq ($(BUILD_64),y) | ||||
EXTRALIBS= -LIBPATH:dep/lib/msvc/x64 | EXTRALIBS= -LIBPATH:dep/lib/msvc/x64 | ||||
@@ -7,7 +7,7 @@ include ../../../../dep/yac/install_msvc.mk | |||||
TARGET_BASENAME=$(SLUG) | 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+= | EXTRAFLAGS+= | ||||
EXTRALIBS+= | EXTRALIBS+= | ||||
@@ -23,8 +23,9 @@ ALL_OBJ= \ | |||||
src/TOCANTE.o \ | src/TOCANTE.o \ | ||||
src/VOID.o \ | src/VOID.o \ | ||||
src/ZINC.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 | # already used in AS modules | ||||
@@ -227,7 +227,7 @@ struct ACNETrimPot : BidooColoredTrimpot { | |||||
ACNEWidget *parent = dynamic_cast<ACNEWidget*>(this->parent); | ACNEWidget *parent = dynamic_cast<ACNEWidget*>(this->parent); | ||||
ACNE *module = dynamic_cast<ACNE*>(this->module); | ACNE *module = dynamic_cast<ACNE*>(this->module); | ||||
if (parent && 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); | 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; | 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 | include make.objects | ||||
define BIN_POST_FXN | |||||
cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll | |||||
endef | |||||
include ../../../build_shared_plugin_post.mk | include ../../../build_shared_plugin_post.mk |
@@ -4,4 +4,8 @@ include ../../../build_shared_plugin_pre.mk | |||||
include make.objects | include make.objects | ||||
define BIN_POST_FXN | |||||
cp -f $(SLUG).dll ../../../../vst2_bin/plugins/$(SLUG)/plugin.dll | |||||
endef | |||||
include ../../../build_shared_plugin_post.mk | include ../../../build_shared_plugin_post.mk |
@@ -5,7 +5,7 @@ | |||||
// for gVg | // for gVg | ||||
#include "window.hpp" | #include "window.hpp" | ||||
// for key codes | // for key codes | ||||
#include <GLFW/glfw3.h> | |||||
// // #include <GLFW/glfw3.h> | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
using namespace rack; | 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). | //// 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); | //bool checkKey = (this->allowedTextType != TextType::Any) && isPrintableKey(e.key); | ||||
switch (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 we have an event to fire, then do it | ||||
if (windowIsShiftPressed())//(guiIsShiftPressed()) | if (windowIsShiftPressed())//(guiIsShiftPressed()) | ||||
{ | { | ||||
@@ -297,13 +297,13 @@ void TSTextField::onKey(EventKey &e) { | |||||
} | } | ||||
} // end if next field | } // end if next field | ||||
break; | 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: | default: | ||||
// Call base method | // Call base method | ||||
TextField::onKey(e); | TextField::onKey(e); | ||||
@@ -324,58 +324,58 @@ bool isPrintableKey(int key) | |||||
bool isPrintable = false; | bool isPrintable = false; | ||||
switch (key) | 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; | return isPrintable; | ||||
} // end isPrintableKey() | } // end isPrintableKey() |
@@ -166,7 +166,8 @@ struct MidiCcChoice : GridChoice { | |||||
void onKey(EventKey &e) override { | void onKey(EventKey &e) override { | ||||
if (global_ui->widgets.gFocusedWidget == this) { | 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; | EventDefocus eDefocus; | ||||
onDefocus(eDefocus); | onDefocus(eDefocus); | ||||
global_ui->widgets.gFocusedWidget = NULL; | global_ui->widgets.gFocusedWidget = NULL; | ||||
@@ -497,32 +497,32 @@ void SearchModuleField::onTextChange() { | |||||
void SearchModuleField::onKey(EventKey &e) { | void SearchModuleField::onKey(EventKey &e) { | ||||
switch (e.key) { | switch (e.key) { | ||||
case GLFW_KEY_ESCAPE: { | |||||
case LGLW_VKEY_ESCAPE/*GLFW_KEY_ESCAPE*/: { | |||||
global_ui->ui.gScene->setOverlay(NULL); | global_ui->ui.gScene->setOverlay(NULL); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | return; | ||||
} break; | } break; | ||||
case GLFW_KEY_UP: { | |||||
case LGLW_VKEY_UP/*GLFW_KEY_UP*/: { | |||||
moduleBrowser->moduleList->incrementSelection(-1); | moduleBrowser->moduleList->incrementSelection(-1); | ||||
moduleBrowser->moduleList->scrollSelected(); | moduleBrowser->moduleList->scrollSelected(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} break; | } break; | ||||
case GLFW_KEY_DOWN: { | |||||
case LGLW_VKEY_DOWN/*GLFW_KEY_DOWN*/: { | |||||
moduleBrowser->moduleList->incrementSelection(1); | moduleBrowser->moduleList->incrementSelection(1); | ||||
moduleBrowser->moduleList->scrollSelected(); | moduleBrowser->moduleList->scrollSelected(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} break; | } break; | ||||
case GLFW_KEY_PAGE_UP: { | |||||
case LGLW_VKEY_PAGEUP/*GLFW_KEY_PAGE_UP*/: { | |||||
moduleBrowser->moduleList->incrementSelection(-5); | moduleBrowser->moduleList->incrementSelection(-5); | ||||
moduleBrowser->moduleList->scrollSelected(); | moduleBrowser->moduleList->scrollSelected(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} break; | } break; | ||||
case GLFW_KEY_PAGE_DOWN: { | |||||
case LGLW_VKEY_PAGEDOWN/*GLFW_KEY_PAGE_DOWN*/: { | |||||
moduleBrowser->moduleList->incrementSelection(5); | moduleBrowser->moduleList->incrementSelection(5); | ||||
moduleBrowser->moduleList->scrollSelected(); | moduleBrowser->moduleList->scrollSelected(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} break; | } break; | ||||
case GLFW_KEY_ENTER: { | |||||
case LGLW_VKEY_RETURN/*GLFW_KEY_ENTER*/: { | |||||
BrowserListItem *item = moduleBrowser->moduleList->getSelectedItem(); | BrowserListItem *item = moduleBrowser->moduleList->getSelectedItem(); | ||||
if (item) { | if (item) { | ||||
item->doAction(); | item->doAction(); | ||||
@@ -8,7 +8,7 @@ | |||||
#ifdef USE_VST2 | #ifdef USE_VST2 | ||||
extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||||
// // extern "C" void glfw_hack_makeContextCurrent(GLFWwindow *handle); | |||||
// #include <windows.h> | // #include <windows.h> | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
@@ -310,51 +310,81 @@ void ModuleWidget::onMouseDown(EventMouseDown &e) { | |||||
void ModuleWidget::onMouseMove(EventMouseMove &e) { | void ModuleWidget::onMouseMove(EventMouseMove &e) { | ||||
OpaqueWidget::onMouseMove(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) { | void ModuleWidget::onHoverKey(EventHoverKey &e) { | ||||
switch (e.key) { | switch (e.key) { | ||||
case GLFW_KEY_I: { | |||||
case 'i'/*GLFW_KEY_I*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
reset(); | reset(); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | return; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_R: { | |||||
break; | |||||
case 'r'/*GLFW_KEY_R*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
randomize(); | randomize(); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | return; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_D: { | |||||
break; | |||||
case 'd'/*GLFW_KEY_D*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
global_ui->app.gRackWidget->cloneModule(this); | global_ui->app.gRackWidget->cloneModule(this); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | return; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_U: { | |||||
break; | |||||
case 'u'/*GLFW_KEY_U*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
disconnect(); | disconnect(); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | 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); | Widget::onHoverKey(e); | ||||
@@ -65,19 +65,19 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||||
if (!e.consumed) { | if (!e.consumed) { | ||||
switch (e.key) { | switch (e.key) { | ||||
case GLFW_KEY_N: { | |||||
case 'n'/*GLFW_KEY_N*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
global_ui->app.gRackWidget->reset(); | global_ui->app.gRackWidget->reset(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_Q: { | |||||
break; | |||||
case 'q'/*GLFW_KEY_Q*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
windowClose(); | windowClose(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_O: { | |||||
break; | |||||
case 'o'/*GLFW_KEY_O*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
global_ui->app.gRackWidget->openDialog(); | global_ui->app.gRackWidget->openDialog(); | ||||
e.consumed = true; | e.consumed = true; | ||||
@@ -86,8 +86,8 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||||
global_ui->app.gRackWidget->revert(); | global_ui->app.gRackWidget->revert(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_S: { | |||||
break; | |||||
case 's'/*GLFW_KEY_S*/: | |||||
if (windowIsModPressed() && !windowIsShiftPressed()) { | if (windowIsModPressed() && !windowIsShiftPressed()) { | ||||
global_ui->app.gRackWidget->saveDialog(); | global_ui->app.gRackWidget->saveDialog(); | ||||
e.consumed = true; | e.consumed = true; | ||||
@@ -96,15 +96,15 @@ void RackScene::onHoverKey(EventHoverKey &e) { | |||||
global_ui->app.gRackWidget->saveAsDialog(); | global_ui->app.gRackWidget->saveAsDialog(); | ||||
e.consumed = true; | 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(); | appModuleBrowserCreate(); | ||||
e.consumed = true; | e.consumed = true; | ||||
} break; | |||||
case GLFW_KEY_F11: { | |||||
break; | |||||
case LGLW_VKEY_F11/*GLFW_KEY_F11*/: | |||||
windowSetFullScreen(!windowGetFullScreen()); | windowSetFullScreen(!windowGetFullScreen()); | ||||
} | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -21,16 +21,12 @@ | |||||
#include "global.hpp" | #include "global.hpp" | ||||
#include "global_ui.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; | 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 | #ifdef USE_VST2 | ||||
int vst2_init(int argc, char* argv[]) { | int vst2_init(int argc, char* argv[]) { | ||||
@@ -74,12 +70,13 @@ int vst2_init(int argc, char* argv[]) { | |||||
bridgeInit(); | bridgeInit(); | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
vstmidiInit(); | vstmidiInit(); | ||||
keyboardInit(); | |||||
#ifndef USE_VST2 | #ifndef USE_VST2 | ||||
keyboardInit(); | |||||
gamepadInit(); | gamepadInit(); | ||||
windowInit(); // must be done in vst2 ui thread | |||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
windowInit(); | |||||
appInit(devMode); | appInit(devMode); | ||||
settingsLoad(assetLocal("settings.json"), false/*bWindowSizeOnly*/); | |||||
#if 0 | #if 0 | ||||
if (patchFile.empty()) { | if (patchFile.empty()) { | ||||
@@ -108,20 +105,6 @@ int vst2_init(int argc, char* argv[]) { | |||||
return 0; | 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) { | void vst2_exit(void) { | ||||
// Destroy namespaces | // Destroy namespaces | ||||
// // engineStop(); | // // engineStop(); | ||||
@@ -129,26 +112,36 @@ void vst2_exit(void) { | |||||
// global_ui->app.gRackWidget->savePatch(assetLocal("autosave.vcv")); | // global_ui->app.gRackWidget->savePatch(assetLocal("autosave.vcv")); | ||||
// settingsSave(assetLocal("settings.json")); | // settingsSave(assetLocal("settings.json")); | ||||
printf("xxx vst2_exit 2\n"); | 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(); | appDestroy(); | ||||
lglw_glcontext_pop(global_ui->window.lglw); | |||||
#endif | |||||
printf("xxx vst2_exit 3\n"); | printf("xxx vst2_exit 3\n"); | ||||
windowDestroy(); | |||||
#if 0 | |||||
#ifndef USE_VST2 | #ifndef USE_VST2 | ||||
windowDestroy(); | |||||
bridgeDestroy(); | bridgeDestroy(); | ||||
#endif // USE_VST2 | #endif // USE_VST2 | ||||
printf("xxx vst2_exit 4\n"); | printf("xxx vst2_exit 4\n"); | ||||
engineDestroy(); | engineDestroy(); | ||||
printf("xxx vst2_exit 5\n"); | printf("xxx vst2_exit 5\n"); | ||||
#endif | #endif | ||||
printf("xxx vst2_exit destroy midi\n"); | printf("xxx vst2_exit destroy midi\n"); | ||||
midiDestroy(); | midiDestroy(); | ||||
printf("xxx vst2_exit destroy midi done\n"); | printf("xxx vst2_exit destroy midi done\n"); | ||||
#if 0 | |||||
#if 1 | |||||
printf("xxx vst2_exit 6\n"); | printf("xxx vst2_exit 6\n"); | ||||
pluginDestroy(); | pluginDestroy(); | ||||
printf("xxx vst2_exit 7\n"); | printf("xxx vst2_exit 7\n"); | ||||
loggerDestroy(); | loggerDestroy(); | ||||
#endif | #endif | ||||
printf("xxx vst2_exit 8 (leave)\n"); | printf("xxx vst2_exit 8 (leave)\n"); | ||||
} | } | ||||
@@ -9,6 +9,8 @@ | |||||
#include "global_ui.hpp" | #include "global_ui.hpp" | ||||
extern void vst2_window_size_set (int _width, int _height); | |||||
namespace rack { | namespace rack { | ||||
@@ -76,7 +78,7 @@ static json_t *settingsToJson() { | |||||
return rootJ; | return rootJ; | ||||
} | } | ||||
static void settingsFromJson(json_t *rootJ) { | |||||
static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||||
// token | // token | ||||
json_t *tokenJ = json_object_get(rootJ, "token"); | json_t *tokenJ = json_object_get(rootJ, "token"); | ||||
if (tokenJ) | if (tokenJ) | ||||
@@ -89,6 +91,13 @@ static void settingsFromJson(json_t *rootJ) { | |||||
json_unpack(windowSizeJ, "[F, F]", &width, &height); | json_unpack(windowSizeJ, "[F, F]", &width, &height); | ||||
#ifdef USE_VST2 | #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) | // (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 | #else | ||||
windowSetWindowSize(Vec(width, height)); | windowSetWindowSize(Vec(width, height)); | ||||
#endif // USE_VST2 | #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()); | info("Loading settings %s", filename.c_str()); | ||||
FILE *file = fopen(filename.c_str(), "r"); | FILE *file = fopen(filename.c_str(), "r"); | ||||
if (!file) | if (!file) | ||||
@@ -190,7 +199,7 @@ void settingsLoad(std::string filename) { | |||||
json_error_t error; | json_error_t error; | ||||
json_t *rootJ = json_loadf(file, 0, &error); | json_t *rootJ = json_loadf(file, 0, &error); | ||||
if (rootJ) { | if (rootJ) { | ||||
settingsFromJson(rootJ); | |||||
settingsFromJson(rootJ, bWindowSizeOnly); | |||||
json_decref(rootJ); | json_decref(rootJ); | ||||
} | } | ||||
else { | else { | ||||
@@ -27,11 +27,13 @@ void MenuOverlay::onMouseDown(EventMouseDown &e) { | |||||
void MenuOverlay::onHoverKey(EventHoverKey &e) { | void MenuOverlay::onHoverKey(EventHoverKey &e) { | ||||
switch (e.key) { | switch (e.key) { | ||||
case GLFW_KEY_ESCAPE: { | |||||
default: | |||||
break; | |||||
case LGLW_VKEY_ESCAPE/*GLFW_KEY_ESCAPE*/: | |||||
global_ui->ui.gScene->setOverlay(NULL); | global_ui->ui.gScene->setOverlay(NULL); | ||||
e.consumed = true; | e.consumed = true; | ||||
return; | return; | ||||
} break; | |||||
} | } | ||||
if (!e.consumed) { | if (!e.consumed) { | ||||
@@ -111,6 +111,7 @@ void ScrollWidget::step() { | |||||
void ScrollWidget::onMouseMove(EventMouseMove &e) { | void ScrollWidget::onMouseMove(EventMouseMove &e) { | ||||
// Scroll with arrow keys | // Scroll with arrow keys | ||||
#if 0 | |||||
if (!global_ui->widgets.gFocusedWidget) { | if (!global_ui->widgets.gFocusedWidget) { | ||||
float arrowSpeed = 30.0; | float arrowSpeed = 30.0; | ||||
if (windowIsShiftPressed() && windowIsModPressed()) | if (windowIsShiftPressed() && windowIsModPressed()) | ||||
@@ -133,7 +134,7 @@ void ScrollWidget::onMouseMove(EventMouseMove &e) { | |||||
offset.y += arrowSpeed; | offset.y += arrowSpeed; | ||||
} | } | ||||
} | } | ||||
#endif | |||||
Widget::onMouseMove(e); | Widget::onMouseMove(e); | ||||
} | } | ||||
@@ -63,7 +63,8 @@ void TextField::onText(EventText &e) { | |||||
void TextField::onKey(EventKey &e) { | void TextField::onKey(EventKey &e) { | ||||
switch (e.key) { | switch (e.key) { | ||||
case GLFW_KEY_BACKSPACE: { | |||||
case LGLW_VKEY_BACKSPACE/*GLFW_KEY_BACKSPACE*/: | |||||
if (cursor == selection) { | if (cursor == selection) { | ||||
cursor--; | cursor--; | ||||
if (cursor >= 0) { | if (cursor >= 0) { | ||||
@@ -78,8 +79,9 @@ void TextField::onKey(EventKey &e) { | |||||
onTextChange(); | onTextChange(); | ||||
cursor = selection = begin; | cursor = selection = begin; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_DELETE: { | |||||
break; | |||||
case LGLW_VKEY_DELETE/*GLFW_KEY_DELETE*/: | |||||
if (cursor == selection) { | if (cursor == selection) { | ||||
text.erase(cursor, 1); | text.erase(cursor, 1); | ||||
onTextChange(); | onTextChange(); | ||||
@@ -90,8 +92,9 @@ void TextField::onKey(EventKey &e) { | |||||
onTextChange(); | onTextChange(); | ||||
cursor = selection = begin; | cursor = selection = begin; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_LEFT: { | |||||
break; | |||||
case LGLW_VKEY_LEFT/*GLFW_KEY_LEFT*/: | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
while (--cursor > 0) { | while (--cursor > 0) { | ||||
if (text[cursor] == ' ') | if (text[cursor] == ' ') | ||||
@@ -104,8 +107,9 @@ void TextField::onKey(EventKey &e) { | |||||
if (!windowIsShiftPressed()) { | if (!windowIsShiftPressed()) { | ||||
selection = cursor; | selection = cursor; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_RIGHT: { | |||||
break; | |||||
case LGLW_VKEY_RIGHT/*GLFW_KEY_RIGHT*/: | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
while (++cursor < (int) text.size()) { | while (++cursor < (int) text.size()) { | ||||
if (text[cursor] == ' ') | if (text[cursor] == ' ') | ||||
@@ -118,21 +122,28 @@ void TextField::onKey(EventKey &e) { | |||||
if (!windowIsShiftPressed()) { | if (!windowIsShiftPressed()) { | ||||
selection = cursor; | selection = cursor; | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_HOME: { | |||||
break; | |||||
case LGLW_VKEY_HOME/*GLFW_KEY_HOME*/: | |||||
selection = cursor = 0; | selection = cursor = 0; | ||||
} break; | |||||
case GLFW_KEY_END: { | |||||
break; | |||||
case LGLW_VKEY_END/*GLFW_KEY_END*/: | |||||
selection = cursor = text.size(); | selection = cursor = text.size(); | ||||
} break; | |||||
case GLFW_KEY_V: { | |||||
break; | |||||
case 'v'/*GLFW_KEY_V*/: | |||||
#if 0 | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
const char *newText = glfwGetClipboardString(global_ui->window.gWindow); | const char *newText = glfwGetClipboardString(global_ui->window.gWindow); | ||||
if (newText) | if (newText) | ||||
insertText(newText); | insertText(newText); | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_X: { | |||||
#endif | |||||
break; | |||||
case 'x'/*GLFW_KEY_X*/: | |||||
#if 0 | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
if (cursor != selection) { | if (cursor != selection) { | ||||
int begin = min(cursor, selection); | int begin = min(cursor, selection); | ||||
@@ -141,8 +152,11 @@ void TextField::onKey(EventKey &e) { | |||||
insertText(""); | insertText(""); | ||||
} | } | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_C: { | |||||
#endif | |||||
break; | |||||
case 'c'/*GLFW_KEY_C*/: | |||||
#if 0 | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
if (cursor != selection) { | if (cursor != selection) { | ||||
int begin = min(cursor, selection); | int begin = min(cursor, selection); | ||||
@@ -150,14 +164,18 @@ void TextField::onKey(EventKey &e) { | |||||
glfwSetClipboardString(global_ui->window.gWindow, selectedText.c_str()); | glfwSetClipboardString(global_ui->window.gWindow, selectedText.c_str()); | ||||
} | } | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_A: { | |||||
#endif | |||||
break; | |||||
case 'a'/*GLFW_KEY_A*/: | |||||
if (windowIsModPressed()) { | if (windowIsModPressed()) { | ||||
selection = 0; | selection = 0; | ||||
cursor = text.size(); | cursor = text.size(); | ||||
} | } | ||||
} break; | |||||
case GLFW_KEY_ENTER: { | |||||
break; | |||||
case LGLW_VKEY_RETURN/*GLFW_KEY_ENTER*/: | |||||
// printf("xxx TextField::onKey: RETURN\n"); | |||||
if (multiline) { | if (multiline) { | ||||
insertText("\n"); | insertText("\n"); | ||||
} | } | ||||
@@ -165,7 +183,7 @@ void TextField::onKey(EventKey &e) { | |||||
EventAction e; | EventAction e; | ||||
onAction(e); | onAction(e); | ||||
} | } | ||||
} break; | |||||
break; | |||||
} | } | ||||
cursor = clamp(cursor, 0, (int) text.size()); | cursor = clamp(cursor, 0, (int) text.size()); | ||||
@@ -17,7 +17,7 @@ | |||||
/// | /// | ||||
/// created: 25Jun2018 | /// created: 25Jun2018 | ||||
/// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | /// 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.hpp" | ||||
#include "global_ui.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 int vst2_init (int argc, char* argv[]); | ||||
extern void vst2_exit (void); | 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_set_samplerate (sF32 _rate); | ||||
extern void vst2_engine_process (float *const*_in, float **_out, unsigned int _numFrames); | 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); | 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_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); | ||||
namespace rack { | |||||
extern void settingsLoad(std::string filename, bool bWindowSizeOnly); | |||||
} | |||||
#include "../include/window.hpp" | #include "../include/window.hpp" | ||||
#include "../dep/include/osdialog.h" | #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 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: | // Windows: | ||||
#define VST_EXPORT extern "C" __declspec(dllexport) | #define VST_EXPORT extern "C" __declspec(dllexport) | ||||
@@ -378,7 +384,7 @@ const VstInt32 PLUGIN_VERSION = 1000; | |||||
*/ | */ | ||||
class VSTPluginWrapper { | class VSTPluginWrapper { | ||||
public: | 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 MAX_SAMPLE_RATE = 384000u; | ||||
static const uint32_t MIN_BLOCK_SIZE = 64u; | static const uint32_t MIN_BLOCK_SIZE = 64u; | ||||
static const uint32_t MAX_BLOCK_SIZE = 65536u; | static const uint32_t MAX_BLOCK_SIZE = 65536u; | ||||
@@ -404,38 +410,13 @@ public: | |||||
bool b_processing; // true=generate output, false=suspended | bool b_processing; // true=generate output, false=suspended | ||||
ERect editor_rect; | ERect editor_rect; | ||||
sBool b_editor_open; | |||||
char *last_program_chunk_str; | char *last_program_chunk_str; | ||||
static sSI instance_count; | static sSI instance_count; | ||||
sSI instance_id; | 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]; | sF32 tmp_input_buffers[NUM_INPUTS * MAX_BLOCK_SIZE]; | ||||
public: | public: | ||||
@@ -454,13 +435,9 @@ public: | |||||
return &_vstPlugin; | return &_vstPlugin; | ||||
} | } | ||||
void startUIThread (void); | |||||
void stopUIThread (void); | |||||
void setGlobals(void) { | void setGlobals(void) { | ||||
rack::global = &rack_global; | rack::global = &rack_global; | ||||
rack::global_ui = &rack_global_ui; | rack::global_ui = &rack_global_ui; | ||||
// // glfwSetInstance((void*)glfw_internal); | |||||
} | } | ||||
sSI openEffect(void) { | sSI openEffect(void) { | ||||
@@ -468,16 +445,6 @@ public: | |||||
printf("xxx vstrack_plugin::openEffect\n"); | printf("xxx vstrack_plugin::openEffect\n"); | ||||
// (todo) use mutex | // (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; | instance_id = instance_count; | ||||
printf("xxx vstrack_plugin::openEffect: instance_id=%d\n", instance_id); | printf("xxx vstrack_plugin::openEffect: instance_id=%d\n", instance_id); | ||||
@@ -494,7 +461,6 @@ public: | |||||
rack_global.init(); | rack_global.init(); | ||||
rack_global_ui.init(); | rack_global_ui.init(); | ||||
rack::global->vst2.last_seen_instance_count = instance_count; | rack::global->vst2.last_seen_instance_count = instance_count; | ||||
// // ::memset((void*)glfw_internal, 0, sizeof(glfw_internal)); | |||||
char oldCWD[1024]; | char oldCWD[1024]; | ||||
char dllnameraw[1024]; | char dllnameraw[1024]; | ||||
@@ -518,24 +484,56 @@ public: | |||||
(void)vst2_init(argc, argv); | (void)vst2_init(argc, argv); | ||||
printf("xxx vstrack_plugin::openEffect: vst2_init() done\n"); | 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); | printf("xxx vstrack_plugin::openEffect: restore cwd=\"%s\"\n", oldCWD); | ||||
::SetCurrentDirectory(oldCWD); | ::SetCurrentDirectory(oldCWD); | ||||
setSampleRate(sample_rate); | setSampleRate(sample_rate); | ||||
b_open = 1; | |||||
b_open = true; | |||||
b_editor_open = false; | |||||
printf("xxx vstrack_plugin::openEffect: LEAVE\n"); | printf("xxx vstrack_plugin::openEffect: LEAVE\n"); | ||||
return 1; | 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) { | void closeEffect(void) { | ||||
closeEditor(); | |||||
// (todo) use mutex | // (todo) use mutex | ||||
printf("xxx vstrack_plugin::closeEffect: last_program_chunk_str=%p\n", last_program_chunk_str); | printf("xxx vstrack_plugin::closeEffect: last_program_chunk_str=%p\n", last_program_chunk_str); | ||||
if(NULL != last_program_chunk_str) | if(NULL != last_program_chunk_str) | ||||
@@ -548,32 +546,17 @@ public: | |||||
if(b_open) | if(b_open) | ||||
{ | { | ||||
b_open = 0; | |||||
b_open = false; | |||||
setGlobals(); | setGlobals(); | ||||
rack::global->vst2.last_seen_instance_count = instance_count; | 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"); | printf("xxx vstrack_plugin: call vst2_exit()\n"); | ||||
vst2_exit(); | vst2_exit(); | ||||
printf("xxx vstrack_plugin: vst2_exit() done\n"); | printf("xxx vstrack_plugin: vst2_exit() done\n"); | ||||
if(1 == instance_count) | |||||
{ | |||||
glfwTerminate(); | |||||
} | |||||
#ifdef USE_CONSOLE | #ifdef USE_CONSOLE | ||||
// FreeConsole(); | // FreeConsole(); | ||||
#endif // USE_CONSOLE | #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) { | void lockAudio(void) { | ||||
mtx_audio.lock(); | mtx_audio.lock(); | ||||
} | } | ||||
@@ -686,7 +621,7 @@ public: | |||||
return 0; | return 0; | ||||
} | } | ||||
sUI getProgramChunk(uint8_t **_addr) { | |||||
sUI getProgramChunk(uint8_t**_addr) { | |||||
setGlobals(); | setGlobals(); | ||||
if(NULL != last_program_chunk_str) | if(NULL != last_program_chunk_str) | ||||
{ | { | ||||
@@ -696,61 +631,29 @@ public: | |||||
if(NULL != last_program_chunk_str) | if(NULL != last_program_chunk_str) | ||||
{ | { | ||||
*_addr = (uint8_t*)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; | return 0; | ||||
} | } | ||||
bool setBankChunk(size_t _size, uint8_t*_addr) { | |||||
bool setBankChunk(size_t _size, uint8_t *_addr) { | |||||
bool r = false; | bool r = false; | ||||
return r; | return r; | ||||
} | } | ||||
bool setProgramChunk_Async(size_t _size, uint8_t*_addr) { | |||||
bool r = false; | |||||
bool setProgramChunk(size_t _size, uint8_t *_addr) { | |||||
setGlobals(); | 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 | #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 | #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 | #ifdef HAVE_WINDOWS | ||||
@@ -799,7 +702,7 @@ public: | |||||
if(0 != (timeInfo->flags & kVstPpqPosValid)) | if(0 != (timeInfo->flags & kVstPpqPosValid)) | ||||
{ | { | ||||
*_retSongPosPPQ = timeInfo->ppqPos; | |||||
*_retSongPosPPQ = (float)timeInfo->ppqPos; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -816,171 +719,6 @@ private: | |||||
sSI VSTPluginWrapper::instance_count = 0; | 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 | * Callbacks: Host -> Plugin | ||||
@@ -1022,7 +760,6 @@ void VSTPluginProcessReplacingFloat32(VSTPlugin *vstPlugin, | |||||
//printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: wrapper=%p\n", wrapper); | //printf("xxx vstrack_plugin: VSTPluginProcessReplacingFloat32: wrapper=%p\n", wrapper); | ||||
sUI chIdx; | sUI chIdx; | ||||
sUI i; | |||||
// (note) Cubase (tested with 9.5.30) uses the same buffer(s) for both input&output | // (note) Cubase (tested with 9.5.30) uses the same buffer(s) for both input&output | ||||
// => back up the inputs before clearing the outputs | // => 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 | * 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 | // ptr: buffer address | ||||
// r: buffer size | // r: buffer size | ||||
printf("xxx effGetChunk index=%d ptr=%p\n", index, ptr); | 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); | r = wrapper->getProgramChunk((uint8_t**)ptr); | ||||
// } | |||||
// // } | |||||
break; | break; | ||||
case effSetChunk: | case effSetChunk: | ||||
@@ -1313,14 +1010,14 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
// ptr: buffer address | // ptr: buffer address | ||||
// r: 1 | // r: 1 | ||||
printf("xxx effSetChunk index=%d size=%lld ptr=%p\n", index, value, ptr); | 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; | break; | ||||
case effShellGetNextPlugin: | case effShellGetNextPlugin: | ||||
@@ -1431,6 +1128,19 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
#endif | #endif | ||||
case effEditIdle: | 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; | break; | ||||
case effEditGetRect: | case effEditGetRect: | ||||
@@ -1439,16 +1149,6 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
if(NULL != ptr) // yeah, this should never be NULL | 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; | *(void**)ptr = (void*) &wrapper->editor_rect; | ||||
r = 1; | r = 1; | ||||
} | } | ||||
@@ -1468,16 +1168,13 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||||
case effEditOpen: | case effEditOpen: | ||||
// Show editor window | // Show editor window | ||||
// ptr: native window handle (hWnd on Windows) | // ptr: native window handle (hWnd on Windows) | ||||
#ifdef YAC_WIN32 | |||||
wrapper->openEditor((HWND)ptr); | |||||
#endif | |||||
wrapper->openEditor(ptr); | |||||
r = 1; | r = 1; | ||||
break; | break; | ||||
case effEditClose: | case effEditClose: | ||||
// Hide editor window | |||||
// // wrapper->closeEditor(); | |||||
wrapper->hideEditor(); | |||||
// Close editor window | |||||
wrapper->closeEditor(); | |||||
r = 1; | r = 1; | ||||
break; | break; | ||||
@@ -1563,7 +1260,7 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
effFlagsIsSynth | | effFlagsIsSynth | | ||||
#endif | #endif | ||||
effFlagsCanReplacing | | effFlagsCanReplacing | | ||||
(effFlagsCanDoubleReplacing & 0) | | |||||
// (effFlagsCanDoubleReplacing & 0) | | |||||
effFlagsProgramChunks | | effFlagsProgramChunks | | ||||
effFlagsHasEditor ; | effFlagsHasEditor ; | ||||
@@ -1592,8 +1289,12 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||||
last_program_chunk_str = NULL; | last_program_chunk_str = NULL; | ||||
b_open = false; | 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(); | 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) { | void vst2_handle_ui_param(int uniqueParamId, float normValue) { | ||||
// Called by engineSetParam() | // 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); | 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 | * 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 | ** July 26th, 2018 | ||||
- fix effect processing in Cubase 9.5.30 | - 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 ***** !!! | !!! ***** 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 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 host timing (audioMasterGetTime / kVstTempoValid / kVstTransportPlaying, see Core.MIDI-1 module) | ||||
+ supports VST parameters (send / recv) | + 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 | 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) | - Eureka (my own work-in-progress VST host) | ||||
- Cockos Reaper | - Cockos Reaper | ||||
- Propellerhead Reason 10 | - Propellerhead Reason 10 | ||||
- Steinberg Cubase Pro 9.5.30 | |||||
- LMMS 1.2.0-rc6 | |||||
The VST2 plugin includes the following add-on modules: | The VST2 plugin includes the following add-on modules: | ||||
- Alikins.IdleSwitch | - 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 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 AS 0.6.1 | ||||
[0.000 info src/plugin.cpp:673] vcvrack: Loaded static plugin AudibleInstruments 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 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 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 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 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 Qwelk 0.6.1 | ||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin RJModules 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 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 unless_modules 0.6.1 | ||||
[0.002 info src/plugin.cpp:673] vcvrack: Loaded static plugin Valley 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": "", | "token": "", | ||||
"windowSize": [ | "windowSize": [ | ||||
1240.0, | 1240.0, | ||||
810.0 | |||||
820.0 | |||||
], | ], | ||||
"windowPos": [ | "windowPos": [ | ||||
60.0, | 60.0, | ||||
83.0 | 83.0 | ||||
], | ], | ||||
"wireOpacity": 50.0, | "wireOpacity": 50.0, | ||||
"wireTension": 1.0, | |||||
"wireTension": 0.97, | |||||
"zoom": 1.0, | "zoom": 1.0, | ||||
"allowCursorLock": true, | "allowCursorLock": true, | ||||
"sampleRate": 44100.0, | "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 | include vst2_common_msvc_pre.mk | ||||
@@ -10,6 +10,7 @@ else | |||||
EXTRALIBS+= -LIBPATH:dep/lib/msvc/x86 | EXTRALIBS+= -LIBPATH:dep/lib/msvc/x86 | ||||
endif | 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 | plugin_lib = $(PLUGIN_DIR)/$(1)/$(1).lib |