| @@ -0,0 +1 @@ | |||
| <div>Icons made by <a href="https://www.flaticon.com/authors/egor-rumyantsev" title="Egor Rumyantsev">Egor Rumyantsev</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> | |||
| @@ -0,0 +1,78 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| version="1.1" | |||
| x="0px" | |||
| y="0px" | |||
| viewBox="-7074.5 3413.5 16 16" | |||
| enable-background="new -7074.5 3413.5 24 24" | |||
| xml:space="preserve" | |||
| id="svg12" | |||
| sodipodi:docname="settings_icon_cc.svg" | |||
| width="16" | |||
| height="16" | |||
| inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata | |||
| id="metadata18"><rdf:RDF><cc:Work | |||
| rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | |||
| id="defs16"> | |||
| </defs><sodipodi:namedview | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1" | |||
| objecttolerance="10" | |||
| gridtolerance="10" | |||
| guidetolerance="10" | |||
| inkscape:pageopacity="0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:window-width="1920" | |||
| inkscape:window-height="1137" | |||
| id="namedview14" | |||
| showgrid="false" | |||
| inkscape:zoom="22.250293" | |||
| inkscape:cx="1.4996926" | |||
| inkscape:cy="9.1190487" | |||
| inkscape:window-x="-8" | |||
| inkscape:window-y="-8" | |||
| inkscape:window-maximized="1" | |||
| inkscape:current-layer="svg12" /><g | |||
| style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" | |||
| id="text1044" /><g | |||
| style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" | |||
| id="text1056" /><g | |||
| transform="matrix(0.04483133,0,0,0.04483133,-7072.6113,3415.4306)" | |||
| id="Settings" | |||
| style="fill:#b4b4b4;fill-opacity:1"><g | |||
| id="g4" | |||
| style="fill:#b4b4b4;fill-opacity:1"><path | |||
| style="clip-rule:evenodd;fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd" | |||
| d="M 267.92,119.461 C 259.7639,108.37353 237.60907,113.69022 232.38746,96.479699 224.2718,82.390868 233.00438,67.286235 241.3705,56.29375 237.43425,44.426372 225.91606,35.523227 215.98352,28.244359 203.37196,32.005085 190.10946,46.088799 174.769,37.92 157.82363,32.983341 158.89813,13.404545 152.74813,1.7591562 140.59107,-0.17972483 126.1677,-2.1756684 114.95288,3.357125 112.96944,17.007361 108.38383,33.860528 92.63896,37.926967 77.775408,44.414555 65.997604,30.615672 53.839531,27.462953 43.772588,34.725084 31.977464,43.546698 27.964375,55.510625 c 8.49164,11.040709 17.354156,26.326968 8.991024,40.499701 -5.867916,15.344484 -24.485634,13.358994 -35.2431959,20.053284 -1.60577119,12.17834 -4.4742822,27.30556 2.2519219,37.97214 12.880627,2.23194 28.500004,5.84589 33.341875,20.29625 8.393178,15.26924 -5.888965,28.31876 -9.629844,40.84962 7.224375,9.96863 15.9554,21.67539 27.825594,25.64263 11.099937,-8.35246 26.446117,-17.06929 40.584732,-8.98545 15.634258,5.69547 13.544408,24.27779 19.933428,35.16712 12.15272,1.92903 26.57763,3.94093 37.78909,-1.60092 1.97214,-13.65237 6.56399,-30.5044 22.31039,-34.56583 14.86512,-6.50972 26.63511,7.31696 38.79786,10.45844 10.07865,-7.24787 21.85234,-16.08992 25.88513,-28.04249 -8.48485,-11.03294 -17.36567,-26.29404 -9.02937,-40.47181 5.58844,-11.68796 18.70272,-16.89286 31.01071,-16.51756 9.97767,-7.68663 4.90088,-25.51607 5.13628,-36.80475 z m -133.325,60.03 c -26.4812,0.83488 -49.170092,-25.58413 -44.306628,-51.64133 3.22607,-26.2257 32.618568,-44.652523 57.621488,-35.988163 25.41298,7.086788 39.29929,38.784143 27.08161,62.222153 -7.20502,15.27134 -23.48006,25.59801 -40.39647,25.40734 z" | |||
| id="path2" | |||
| inkscape:connector-curvature="0" /></g></g></svg> | |||
| @@ -0,0 +1,27 @@ | |||
| <?xml version="1.0" encoding="iso-8859-1"?> | |||
| <!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||
| viewBox="0 0 268.765 268.765" style="enable-background:new 0 0 268.765 268.765;" xml:space="preserve" | |||
| > | |||
| <g id="Settings"> | |||
| <g> | |||
| <path style="fill-rule:evenodd;clip-rule:evenodd;" d="M267.92,119.461c-0.425-3.778-4.83-6.617-8.639-6.617 | |||
| c-12.315,0-23.243-7.231-27.826-18.414c-4.682-11.454-1.663-24.812,7.515-33.231c2.889-2.641,3.24-7.062,0.817-10.133 | |||
| c-6.303-8.004-13.467-15.234-21.289-21.5c-3.063-2.458-7.557-2.116-10.213,0.825c-8.01,8.871-22.398,12.168-33.516,7.529 | |||
| c-11.57-4.867-18.866-16.591-18.152-29.176c0.235-3.953-2.654-7.39-6.595-7.849c-10.038-1.161-20.164-1.197-30.232-0.08 | |||
| c-3.896,0.43-6.785,3.786-6.654,7.689c0.438,12.461-6.946,23.98-18.401,28.672c-10.985,4.487-25.272,1.218-33.266-7.574 | |||
| c-2.642-2.896-7.063-3.252-10.141-0.853c-8.054,6.319-15.379,13.555-21.74,21.493c-2.481,3.086-2.116,7.559,0.802,10.214 | |||
| c9.353,8.47,12.373,21.944,7.514,33.53c-4.639,11.046-16.109,18.165-29.24,18.165c-4.261-0.137-7.296,2.723-7.762,6.597 | |||
| c-1.182,10.096-1.196,20.383-0.058,30.561c0.422,3.794,4.961,6.608,8.812,6.608c11.702-0.299,22.937,6.946,27.65,18.415 | |||
| c4.698,11.454,1.678,24.804-7.514,33.23c-2.875,2.641-3.24,7.055-0.817,10.126c6.244,7.953,13.409,15.19,21.259,21.508 | |||
| c3.079,2.481,7.559,2.131,10.228-0.81c8.04-8.893,22.427-12.184,33.501-7.536c11.599,4.852,18.895,16.575,18.181,29.167 | |||
| c-0.233,3.955,2.67,7.398,6.595,7.85c5.135,0.599,10.301,0.898,15.481,0.898c4.917,0,9.835-0.27,14.752-0.817 | |||
| c3.897-0.43,6.784-3.786,6.653-7.696c-0.451-12.454,6.946-23.973,18.386-28.657c11.059-4.517,25.286-1.211,33.281,7.572 | |||
| c2.657,2.89,7.047,3.239,10.142,0.848c8.039-6.304,15.349-13.534,21.74-21.494c2.48-3.079,2.13-7.559-0.803-10.213 | |||
| c-9.353-8.47-12.388-21.946-7.529-33.524c4.568-10.899,15.612-18.217,27.491-18.217l1.662,0.043 | |||
| c3.853,0.313,7.398-2.655,7.865-6.588C269.044,139.917,269.058,129.639,267.92,119.461z M134.595,179.491 | |||
| c-24.718,0-44.824-20.106-44.824-44.824c0-24.717,20.106-44.824,44.824-44.824c24.717,0,44.823,20.107,44.823,44.824 | |||
| C179.418,159.385,159.312,179.491,134.595,179.491z"/> | |||
| </g> | |||
| </g> | |||
| </svg> | |||
| @@ -3,6 +3,7 @@ | |||
| #include "window.hpp" | |||
| #include "engine.hpp" | |||
| #include "asset.hpp" | |||
| #include "settings.hpp" | |||
| #include "global.hpp" | |||
| #include "global_ui.hpp" | |||
| @@ -14,6 +15,9 @@ extern void vst2_oversample_channels_set (int _numIn, int _numOut); | |||
| extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); | |||
| extern void vst2_idle_detect_mode_set (int _mode); | |||
| extern void vst2_idle_detect_mode_get (int *_mode); | |||
| extern void vst2_refresh_rate_set (float _hz); | |||
| extern float vst2_refresh_rate_get (void); | |||
| extern void vst2_window_size_set (int _width, int _height); | |||
| #endif // RACK_HOST | |||
| namespace rack { | |||
| @@ -320,6 +324,125 @@ struct IdleModeButton : TooltipIconButton { | |||
| } | |||
| }; | |||
| struct settings_win_size_entry_t { | |||
| int w; | |||
| int h; | |||
| }; | |||
| static settings_win_size_entry_t loc_settings_win_sizes[] = { | |||
| { 1002, 600 }, | |||
| { 1272, 820 }, | |||
| { 1408, 850 }, | |||
| { 1588, 1100 }, | |||
| { 1902, 1100 }, | |||
| { 2500, 1980 }, | |||
| { 3000, 1980 }, | |||
| }; | |||
| #define NUM_SETTINGS_WIN_SIZE (sizeof(loc_settings_win_sizes) / sizeof(settings_win_size_entry_t)) | |||
| struct SettingsWinSizeItem : MenuItem { | |||
| const settings_win_size_entry_t *setting; | |||
| void onAction(EventAction &e) override { | |||
| #ifdef RACK_HOST | |||
| global_ui->window.windowWidth = setting->w; | |||
| global_ui->window.windowHeight = setting->h; | |||
| vst2_window_size_set(setting->w, setting->h); | |||
| #endif // RACK_HOST | |||
| } | |||
| }; | |||
| struct settings_refresh_rate_entry_t { | |||
| int rate; | |||
| const char *caption; | |||
| }; | |||
| static settings_refresh_rate_entry_t loc_settings_refresh_rates[] = { | |||
| { 0, "<host fps>" }, | |||
| { 15, "15 fps" }, | |||
| { 30, "30 fps" }, | |||
| { 60, "60 fps" }, | |||
| { 75, "75 fps" }, | |||
| { 100, "100 fps" }, | |||
| }; | |||
| #define NUM_SETTINGS_REFRESH_RATE (sizeof(loc_settings_refresh_rates) / sizeof(settings_refresh_rate_entry_t)) | |||
| struct SettingsRefreshRateItem : MenuItem { | |||
| const settings_refresh_rate_entry_t *setting; | |||
| void onAction(EventAction &e) override { | |||
| #ifdef RACK_HOST | |||
| vst2_refresh_rate_set(float(setting->rate)); | |||
| #endif // RACK_HOST | |||
| } | |||
| }; | |||
| struct SettingsVsyncItem : MenuItem { | |||
| void onAction(EventAction &e) override { | |||
| lglw_swap_interval_set(global_ui->window.lglw, lglw_swap_interval_get(global_ui->window.lglw) ^ 1); | |||
| } | |||
| }; | |||
| struct SettingsSaveItem : MenuItem { | |||
| void onAction(EventAction &e) override { | |||
| settingsSave(assetLocal("settings.json")); | |||
| } | |||
| }; | |||
| struct SettingsButton : TooltipIconButton { | |||
| SettingsButton() { | |||
| setSVG(SVG::load(assetGlobal("res/icons/settings_icon_cc.svg"))); | |||
| tooltipText = "Global Settings"; | |||
| } | |||
| void onAction(EventAction &e) override { | |||
| Menu *menu = global_ui->ui.gScene->createMenu(); | |||
| menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y)); | |||
| menu->box.size.x = box.size.x; | |||
| menu->addChild(MenuLabel::create("Global Settings")); | |||
| #ifdef RACK_HOST | |||
| int cWinW = int(global_ui->window.windowWidth); | |||
| int cWinH = int(global_ui->window.windowHeight); | |||
| for(int i = 0; i < NUM_SETTINGS_WIN_SIZE; i++) | |||
| { | |||
| const settings_win_size_entry_t *en = &loc_settings_win_sizes[i]; | |||
| SettingsWinSizeItem *winSizeItem = new SettingsWinSizeItem(); | |||
| char buf[256]; | |||
| sprintf(buf, "%dx%d", en->w, en->h); | |||
| winSizeItem->text = buf; | |||
| winSizeItem->setting = en; | |||
| winSizeItem->rightText = CHECKMARK( (cWinW == en->w) && (cWinH == en->h) ); | |||
| menu->addChild(winSizeItem); | |||
| } | |||
| int cRate = int(vst2_refresh_rate_get()); | |||
| for(int i = 0; i < NUM_SETTINGS_REFRESH_RATE; i++) | |||
| { | |||
| const settings_refresh_rate_entry_t *en = &loc_settings_refresh_rates[i]; | |||
| SettingsRefreshRateItem *rateItem = new SettingsRefreshRateItem(); | |||
| rateItem->text = en->caption; | |||
| rateItem->setting = en; | |||
| rateItem->rightText = CHECKMARK( (cRate == en->rate) ); | |||
| menu->addChild(rateItem); | |||
| } | |||
| SettingsVsyncItem *vsyncItem = new SettingsVsyncItem(); | |||
| vsyncItem->text = "Vsync"; | |||
| vsyncItem->rightText = CHECKMARK( (0 != lglw_swap_interval_get(global_ui->window.lglw)) ); | |||
| menu->addChild(vsyncItem); | |||
| SettingsSaveItem *saveItem = new SettingsSaveItem(); | |||
| saveItem->text = "Save Settings (+Favourites)"; | |||
| menu->addChild(saveItem); | |||
| #endif // RACK_HOST | |||
| } | |||
| }; | |||
| struct ZoomSlider : Slider { | |||
| void onAction(EventAction &e) override { | |||
| Slider::onAction(e); | |||
| @@ -347,6 +470,7 @@ Toolbar::Toolbar() { | |||
| layout->addChild(new PowerMeterButton()); | |||
| layout->addChild(new RackLockButton()); | |||
| layout->addChild(new IdleModeButton()); | |||
| layout->addChild(new SettingsButton()); | |||
| wireOpacitySlider = new Slider(); | |||
| wireOpacitySlider->box.size.x = 150; | |||
| @@ -9,16 +9,22 @@ | |||
| #include "global_ui.hpp" | |||
| #ifdef RACK_HOST | |||
| extern void vst2_window_size_set (int _width, int _height); | |||
| extern void vst2_refresh_rate_set (float _hz); | |||
| #ifdef RACK_HOST | |||
| extern float vst2_refresh_rate_get (void); | |||
| extern void vst2_oversample_realtime_set (float _factor, int _quality); | |||
| extern void vst2_oversample_realtime_get (float *_factor, int *_quality); | |||
| extern void vst2_oversample_offline_set (float _factor, int _quality); | |||
| extern void vst2_oversample_offline_get (float *_factor, int *_quality); | |||
| extern void vst2_oversample_offline_check_set (int _bEnable); | |||
| extern int32_t vst2_oversample_offline_check_get (void); | |||
| extern void vst2_oversample_channels_set (int _numIn, int _numOut); | |||
| extern void vst2_oversample_channels_get (int *_numIn, int *_numOut); | |||
| extern void vst2_idle_detect_mode_fx_set (int _mode); | |||
| extern int vst2_idle_detect_mode_fx_get (void); | |||
| extern void vst2_idle_detect_mode_instr_set (int _mode); | |||
| extern int vst2_idle_detect_mode_instr_get (void); | |||
| #endif // RACK_HOST | |||
| namespace rack { | |||
| @@ -30,11 +36,16 @@ static json_t *settingsToJson() { | |||
| // root | |||
| json_t *rootJ = json_object(); | |||
| #ifdef RACK_HOST | |||
| // token | |||
| json_t *tokenJ = json_string(global->plugin.gToken.c_str()); | |||
| json_object_set_new(rootJ, "token", tokenJ); | |||
| if (!windowIsMaximized()) { | |||
| #if 0 | |||
| if (!windowIsMaximized()) | |||
| #endif | |||
| { | |||
| // windowSize | |||
| Vec windowSize = windowGetWindowSize(); | |||
| json_t *windowSizeJ = json_pack("[f, f]", windowSize.x, windowSize.y); | |||
| @@ -61,6 +72,86 @@ static json_t *settingsToJson() { | |||
| json_t *zoomJ = json_real(zoom); | |||
| json_object_set_new(rootJ, "zoom", zoomJ); | |||
| // refresh rate (Hz) | |||
| float refreshRate = vst2_refresh_rate_get(); | |||
| json_t *refreshRateJ = json_integer(int(refreshRate)); | |||
| json_object_set_new(rootJ, "refreshRate", refreshRateJ); | |||
| // vsync | |||
| int vsync = lglw_swap_interval_get(global_ui->window.lglw); | |||
| json_t *vsyncJ = json_boolean(vsync); | |||
| json_object_set_new(rootJ, "vsync", vsyncJ); | |||
| // touchInput | |||
| int touchInput = lglw_touchinput_get(global_ui->window.lglw); | |||
| json_t *touchInputJ = json_boolean(touchInput); | |||
| json_object_set_new(rootJ, "touchInput", touchInputJ); | |||
| // touchKbd | |||
| int touchKbd = b_touchkeyboard_enable; | |||
| json_t *touchKbdJ = json_boolean(touchKbd); | |||
| json_object_set_new(rootJ, "touchKbd", touchKbdJ); | |||
| // (realtime) oversampleFactor, oversampleQuality | |||
| { | |||
| float factor; | |||
| int quality; | |||
| vst2_oversample_realtime_get(&factor, &quality); | |||
| json_t *factorJ = json_real(factor); | |||
| json_object_set_new(rootJ, "oversampleFactor", factorJ); | |||
| json_t *qualityJ = json_integer(quality); | |||
| json_object_set_new(rootJ, "oversampleQuality", qualityJ); | |||
| } | |||
| // oversampleOfflineFactor, oversampleOfflineQuality | |||
| { | |||
| float factor; | |||
| int quality; | |||
| vst2_oversample_offline_get(&factor, &quality); | |||
| json_t *factorJ = json_real(factor); | |||
| json_object_set_new(rootJ, "oversampleOfflineFactor", factorJ); | |||
| json_t *qualityJ = json_integer(quality); | |||
| json_object_set_new(rootJ, "oversampleOfflineQuality", qualityJ); | |||
| } | |||
| // oversample offline check (oversampleOffline) | |||
| json_t *offlineJ = json_boolean(vst2_oversample_offline_check_get()); | |||
| json_object_set_new(rootJ, "oversampleOffline", offlineJ); | |||
| // oversample input channel limit (oversampleNumIn) | |||
| // oversample output channel limit (oversampleNumOut) | |||
| { | |||
| int numIn; | |||
| int numOut; | |||
| vst2_oversample_channels_get(&numIn, &numOut); | |||
| json_t *numInJ = json_real(numIn); | |||
| json_object_set_new(rootJ, "oversampleNumIn", numInJ); | |||
| json_t *numOutJ = json_real(numOut); | |||
| json_object_set_new(rootJ, "oversampleNumOut", numOutJ); | |||
| } | |||
| // idleDetectInstr | |||
| { | |||
| int idleMode = vst2_idle_detect_mode_instr_get(); | |||
| json_t *idleJ = json_integer(idleMode); | |||
| json_object_set_new(rootJ, "idleDetectInstr", idleJ); | |||
| } | |||
| // idleDetectFx | |||
| { | |||
| int idleMode = vst2_idle_detect_mode_fx_get(); | |||
| json_t *idleJ = json_integer(idleMode); | |||
| json_object_set_new(rootJ, "idleDetectFx", idleJ); | |||
| } | |||
| // allowCursorLock | |||
| json_t *allowCursorLockJ = json_boolean(global_ui->window.gAllowCursorLock); | |||
| json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); | |||
| @@ -87,6 +178,8 @@ static json_t *settingsToJson() { | |||
| // checkVersion | |||
| json_object_set_new(rootJ, "checkVersion", json_boolean(global_ui->app.gCheckVersion)); | |||
| #endif // RACK_HOST | |||
| return rootJ; | |||
| } | |||
| @@ -107,7 +200,9 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||
| { | |||
| global_ui->window.windowWidth = int(width); | |||
| global_ui->window.windowHeight = int(height); | |||
| #ifdef RACK_HOST | |||
| vst2_window_size_set((int)width, (int)height); | |||
| #endif // RACK_HOST | |||
| return; | |||
| } | |||
| #else | |||
| @@ -146,7 +241,9 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||
| // (note) <15: use DAW timer (effEditIdle) | |||
| json_t *refreshJ = json_object_get(rootJ, "refreshRate"); | |||
| if (refreshJ) { | |||
| #ifdef RACK_HOST | |||
| vst2_refresh_rate_set(clamp((float) json_number_value(refreshJ), 0.0f, 200.0f)); | |||
| #endif // RACK_HOST | |||
| } | |||
| // vsync | |||
| @@ -156,7 +253,7 @@ static void settingsFromJson(json_t *rootJ, bool bWindowSizeOnly) { | |||
| if (vsyncJ) | |||
| { | |||
| lglw_glcontext_push(global_ui->window.lglw); | |||
| lglw_swap_interval(global_ui->window.lglw, json_is_true(vsyncJ)); | |||
| lglw_swap_interval_set(global_ui->window.lglw, json_is_true(vsyncJ)); | |||
| lglw_glcontext_pop(global_ui->window.lglw); | |||
| } | |||
| } | |||
| @@ -18,7 +18,7 @@ | |||
| /// created: 25Jun2018 | |||
| /// changed: 26Jun2018, 27Jun2018, 29Jun2018, 01Jul2018, 02Jul2018, 06Jul2018, 13Jul2018 | |||
| /// 26Jul2018, 04Aug2018, 05Aug2018, 06Aug2018, 07Aug2018, 09Aug2018, 11Aug2018 | |||
| /// 18Aug2018, 19Aug2018 | |||
| /// 18Aug2018, 19Aug2018, 05Sep2018 | |||
| /// | |||
| /// | |||
| @@ -458,6 +458,8 @@ public: | |||
| bool b_check_offline; // true=ask host if it's in offline rendering mode | |||
| sUI idle_detect_mode; | |||
| sUI idle_detect_mode_fx; | |||
| sUI idle_detect_mode_instr; | |||
| sF32 idle_input_level_threshold; | |||
| sF32 idle_output_level_threshold; | |||
| sF32 idle_output_sec_threshold; | |||
| @@ -563,6 +565,8 @@ public: | |||
| editor_rect.right = EDITWIN_X + _width; | |||
| editor_rect.bottom = EDITWIN_Y + _height; | |||
| (void)lglw_window_resize(rack_global_ui.window.lglw, _width, _height); | |||
| } | |||
| void setRefreshRate(float _hz) { | |||
| @@ -570,6 +574,23 @@ public: | |||
| redraw_ival_ms = 0u; | |||
| else | |||
| redraw_ival_ms = sUI(1000.0f / _hz); | |||
| if(b_editor_open) | |||
| { | |||
| lglw_timer_stop(rack_global_ui.window.lglw); | |||
| if(0u != redraw_ival_ms) | |||
| { | |||
| lglw_timer_start(rack_global_ui.window.lglw, redraw_ival_ms); | |||
| } | |||
| } | |||
| } | |||
| float getRefreshRate(void) { | |||
| if(redraw_ival_ms > 0u) | |||
| return (1000.0f / redraw_ival_ms); | |||
| else | |||
| return 0.0f; | |||
| } | |||
| void destroyResamplerStates(void) { | |||
| @@ -891,6 +912,20 @@ public: | |||
| idle_output_framecount = 0u; | |||
| } | |||
| void setIdleDetectModeFx(uint32_t _mode) { | |||
| idle_detect_mode_fx = _mode; | |||
| #ifdef VST2_EFFECT | |||
| setIdleDetectMode(uint32_t(_mode)); | |||
| #endif // VST2_EFFECT | |||
| } | |||
| void setIdleDetectModeInstr(uint32_t _mode) { | |||
| idle_detect_mode_instr = _mode; | |||
| #ifndef VST2_EFFECT | |||
| setIdleDetectMode(uint32_t(_mode)); | |||
| #endif // VST2_EFFECT | |||
| } | |||
| sUI getProgramChunk(uint8_t**_addr) { | |||
| setGlobals(); | |||
| vst2_set_shared_plugin_tls_globals(); | |||
| @@ -1719,6 +1754,12 @@ VstIntPtr VSTPluginDispatcher(VSTPlugin *vstPlugin, | |||
| if(NULL != ptr) | |||
| { | |||
| // ... | |||
| printf("xxx vstrack_plugin: effEditGetRect: (%d; %d; %d; %d)\n", | |||
| wrapper->editor_rect.top, | |||
| wrapper->editor_rect.left, | |||
| wrapper->editor_rect.bottom, | |||
| wrapper->editor_rect.right | |||
| ); | |||
| *(void**)ptr = (void*) &wrapper->editor_rect; | |||
| r = 1; | |||
| } | |||
| @@ -1936,6 +1977,8 @@ VSTPluginWrapper::VSTPluginWrapper(audioMasterCallback vstHostCallback, | |||
| b_check_offline = false; | |||
| idle_detect_mode = IDLE_DETECT_NONE; | |||
| idle_detect_mode_fx = IDLE_DETECT_AUDIO; | |||
| idle_detect_mode_instr = IDLE_DETECT_MIDI; | |||
| b_idle = false; | |||
| idle_input_level_threshold = 0.00018f;//0.00007f; | |||
| idle_output_level_threshold = 0.00018f;//0.00003f; | |||
| @@ -1997,6 +2040,10 @@ void vst2_refresh_rate_set(float _hz) { | |||
| rack::global->vst2.wrapper->setRefreshRate(_hz); | |||
| } | |||
| float vst2_refresh_rate_get(void) { | |||
| return rack::global->vst2.wrapper->getRefreshRate(); | |||
| } | |||
| extern "C" void lglw_timer_cbk(lglw_t _lglw) { | |||
| VSTPluginWrapper *wrapper = (VSTPluginWrapper*)lglw_userdata_get(_lglw); | |||
| wrapper->queueRedraw(); | |||
| @@ -2029,6 +2076,10 @@ void vst2_oversample_offline_check_set(int _bEnable) { | |||
| rack::global->vst2.wrapper->b_check_offline = (0 != _bEnable); | |||
| } | |||
| int32_t vst2_oversample_offline_check_get(void) { | |||
| return int32_t(rack::global->vst2.wrapper->b_check_offline); | |||
| } | |||
| void vst2_oversample_channels_set(int _numIn, int _numOut) { | |||
| rack::global->vst2.wrapper->setOversampleChannels(_numIn, _numOut); | |||
| } | |||
| @@ -2039,15 +2090,19 @@ void vst2_oversample_channels_get(int *_numIn, int *_numOut) { | |||
| } | |||
| void vst2_idle_detect_mode_fx_set(int _mode) { | |||
| #ifdef VST2_EFFECT | |||
| rack::global->vst2.wrapper->setIdleDetectMode(uint32_t(_mode)); | |||
| #endif // VST2_EFFECT | |||
| rack::global->vst2.wrapper->setIdleDetectModeFx(uint32_t(_mode)); | |||
| } | |||
| int vst2_idle_detect_mode_fx_get(void) { | |||
| return rack::global->vst2.wrapper->idle_detect_mode_fx; | |||
| } | |||
| void vst2_idle_detect_mode_instr_set(int _mode) { | |||
| #ifndef VST2_EFFECT | |||
| rack::global->vst2.wrapper->setIdleDetectMode(uint32_t(_mode)); | |||
| #endif // VST2_EFFECT | |||
| rack::global->vst2.wrapper->setIdleDetectModeInstr(uint32_t(_mode)); | |||
| } | |||
| int vst2_idle_detect_mode_instr_get(void) { | |||
| return rack::global->vst2.wrapper->idle_detect_mode_instr; | |||
| } | |||
| void vst2_idle_detect_mode_set(int _mode) { | |||
| @@ -45,7 +45,7 @@ std::string QuantityWidget::getText() { | |||
| } | |||
| void QuantityWidget::onMouseLeave(EventMouseLeave &e) { | |||
| revert_val = INVALID_REVERT_VAL; | |||
| // // revert_val = INVALID_REVERT_VAL; | |||
| } | |||
| } // namespace rack | |||
| @@ -374,7 +374,7 @@ void windowInit() { | |||
| global_ui->window.lastWindowTitle = ""; | |||
| lglw_glcontext_push(global_ui->window.lglw); | |||
| lglw_swap_interval(global_ui->window.lglw, 1); // can be overridden via settings.json:"vsync" property | |||
| lglw_swap_interval_set(global_ui->window.lglw, 1); // can be overridden via settings.json:"vsync" property | |||
| lglw_mouse_callback_set (global_ui->window.lglw, &lglw_mouse_cbk); | |||
| lglw_focus_callback_set (global_ui->window.lglw, &lglw_focus_cbk); | |||
| @@ -0,0 +1 @@ | |||
| <div>Icons made by <a href="https://www.flaticon.com/authors/egor-rumyantsev" title="Egor Rumyantsev">Egor Rumyantsev</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> | |||
| @@ -0,0 +1,78 @@ | |||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
| <svg | |||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | |||
| xmlns:cc="http://creativecommons.org/ns#" | |||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | |||
| xmlns:svg="http://www.w3.org/2000/svg" | |||
| xmlns="http://www.w3.org/2000/svg" | |||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | |||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | |||
| version="1.1" | |||
| x="0px" | |||
| y="0px" | |||
| viewBox="-7074.5 3413.5 16 16" | |||
| enable-background="new -7074.5 3413.5 24 24" | |||
| xml:space="preserve" | |||
| id="svg12" | |||
| sodipodi:docname="settings_icon_cc.svg" | |||
| width="16" | |||
| height="16" | |||
| inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata | |||
| id="metadata18"><rdf:RDF><cc:Work | |||
| rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | |||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | |||
| id="defs16"> | |||
| </defs><sodipodi:namedview | |||
| pagecolor="#ffffff" | |||
| bordercolor="#666666" | |||
| borderopacity="1" | |||
| objecttolerance="10" | |||
| gridtolerance="10" | |||
| guidetolerance="10" | |||
| inkscape:pageopacity="0" | |||
| inkscape:pageshadow="2" | |||
| inkscape:window-width="1920" | |||
| inkscape:window-height="1137" | |||
| id="namedview14" | |||
| showgrid="false" | |||
| inkscape:zoom="22.250293" | |||
| inkscape:cx="1.4996926" | |||
| inkscape:cy="9.1190487" | |||
| inkscape:window-x="-8" | |||
| inkscape:window-y="-8" | |||
| inkscape:window-maximized="1" | |||
| inkscape:current-layer="svg12" /><g | |||
| style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" | |||
| id="text1044" /><g | |||
| style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" | |||
| id="text1056" /><g | |||
| transform="matrix(0.04483133,0,0,0.04483133,-7072.6113,3415.4306)" | |||
| id="Settings" | |||
| style="fill:#b4b4b4;fill-opacity:1"><g | |||
| id="g4" | |||
| style="fill:#b4b4b4;fill-opacity:1"><path | |||
| style="clip-rule:evenodd;fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd" | |||
| d="M 267.92,119.461 C 259.7639,108.37353 237.60907,113.69022 232.38746,96.479699 224.2718,82.390868 233.00438,67.286235 241.3705,56.29375 237.43425,44.426372 225.91606,35.523227 215.98352,28.244359 203.37196,32.005085 190.10946,46.088799 174.769,37.92 157.82363,32.983341 158.89813,13.404545 152.74813,1.7591562 140.59107,-0.17972483 126.1677,-2.1756684 114.95288,3.357125 112.96944,17.007361 108.38383,33.860528 92.63896,37.926967 77.775408,44.414555 65.997604,30.615672 53.839531,27.462953 43.772588,34.725084 31.977464,43.546698 27.964375,55.510625 c 8.49164,11.040709 17.354156,26.326968 8.991024,40.499701 -5.867916,15.344484 -24.485634,13.358994 -35.2431959,20.053284 -1.60577119,12.17834 -4.4742822,27.30556 2.2519219,37.97214 12.880627,2.23194 28.500004,5.84589 33.341875,20.29625 8.393178,15.26924 -5.888965,28.31876 -9.629844,40.84962 7.224375,9.96863 15.9554,21.67539 27.825594,25.64263 11.099937,-8.35246 26.446117,-17.06929 40.584732,-8.98545 15.634258,5.69547 13.544408,24.27779 19.933428,35.16712 12.15272,1.92903 26.57763,3.94093 37.78909,-1.60092 1.97214,-13.65237 6.56399,-30.5044 22.31039,-34.56583 14.86512,-6.50972 26.63511,7.31696 38.79786,10.45844 10.07865,-7.24787 21.85234,-16.08992 25.88513,-28.04249 -8.48485,-11.03294 -17.36567,-26.29404 -9.02937,-40.47181 5.58844,-11.68796 18.70272,-16.89286 31.01071,-16.51756 9.97767,-7.68663 4.90088,-25.51607 5.13628,-36.80475 z m -133.325,60.03 c -26.4812,0.83488 -49.170092,-25.58413 -44.306628,-51.64133 3.22607,-26.2257 32.618568,-44.652523 57.621488,-35.988163 25.41298,7.086788 39.29929,38.784143 27.08161,62.222153 -7.20502,15.27134 -23.48006,25.59801 -40.39647,25.40734 z" | |||
| id="path2" | |||
| inkscape:connector-curvature="0" /></g></g></svg> | |||