diff options
83 files changed, 9717 insertions, 8232 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f84ee7cf4b..235a620616 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2118,7 +2118,14 @@ endif() # Locale Aware Compare for SQLite find_package(SQLite3) -cmake_dependent_option(LOCALECOMPARE "Locale Aware Compare support for SQLite" ON "SQLite3_FOUND" OFF) +# FIXME +# It is difficult to get qmake to link Qt to a custom built SQLite on macOS instead of the system SQLite, +# which results in a crash on startup when LOCALECOMPARE is enabled. +if(APPLE) + cmake_dependent_option(LOCALECOMPARE "Locale Aware Compare support for SQLite" OFF "SQLite3_FOUND" OFF) +else() + cmake_dependent_option(LOCALECOMPARE "Locale Aware Compare support for SQLite" ON "SQLite3_FOUND" OFF) +endif() if(LOCALECOMPARE) if(NOT SQLite3_FOUND) message(FATAL_ERROR "Locale Aware Compare for SQLite requires libsqlite and its development headers.") diff --git a/appveyor.yml b/appveyor.yml index 22af726cb8..d6bc12c1bb 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -165,7 +165,13 @@ for: ENVIRONMENTS_PATH: C:\mixxx-buildserver MSVC_PATH: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community" PATH: 'C:\Python37-x64;C:\Python37-x64\Scripts;%PATH%' - + CODESIGN_CERTIFICATE_PATH: build\certificates\windows_sectigo_codesign_certificate.pfx + CODESIGN_CERTIFICATE_SECURE_FILE_SECRET: + secure: 1xzNVbLop/5/ySSgZxPzyOz5cm8nVMLEIEW4x0XOJjI= + CODESIGN_CERTIFICATE_SECURE_FILE_SALT: + secure: tw+bg3qfia7+WQdBdXtC301Z9Dv7yQ6SwpWcFJav9YC4zwyyGztev6pAbGE93sln4VO0WRCJ+4/KTviBMPXvXQ== + CODESIGN_CERTIFICATE_PASSWORD: + secure: EiAsLAgrsS+N3rr71AAkXPCrxIe2vLvlOvCipnTw6pg= install: - set /P ENVIRONMENT_NAME=<build/windows/golden_environment @@ -183,6 +189,13 @@ for: ) - choco install ninja - python -m pip install git+https://github.com/frerich/clcache.git + # Decrypt the code signing certificate. + - ps: iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/appveyor/secure-file/master/install.ps1')) + - IF [%APPVEYOR_PULL_REQUEST_NUMBER%] == [] ( + appveyor-tools\secure-file -decrypt %CODESIGN_CERTIFICATE_PATH%.enc -secret %CODESIGN_CERTIFICATE_SECURE_FILE_SECRET% -salt %CODESIGN_CERTIFICATE_SECURE_FILE_SALT% + ) else ( + echo "Skipping certificate decryption because we are in a pull request." + ) before_build: - FOR /D %%G IN (%WINLIB_PATH%\Qt-*) DO SET QT_PATH=%%G @@ -235,8 +248,18 @@ for: .. - cmake --build . - cmake --build . --target install + - IF [%APPVEYOR_PULL_REQUEST_NUMBER%] == [] ( + signtool sign /f ..\%CODESIGN_CERTIFICATE_PATH% /p %CODESIGN_CERTIFICATE_PASSWORD% *.exe + ) else ( + echo "Skipping codesigning *.exe because we are in a pull request." + ) # Generate WIX installer - cpack -G "WIX" + - IF [%APPVEYOR_PULL_REQUEST_NUMBER%] == [] ( + signtool sign /f ..\%CODESIGN_CERTIFICATE_PATH% /p %CODESIGN_CERTIFICATE_PASSWORD% *.msi + ) else ( + echo "Skipping codesigning *.msi because we are in a pull request." + ) test_script: # Calling mixxx-test under bash to have standard output and use stdbuf to @@ -291,7 +314,5 @@ notifications: headers: Authorization: secure: 95cbVBcC4rogjE5VNdhuYm8cnjPF8+7SeQXySqcxAqrFZxK+/Kcn3Q2hRb2iZfUEKZ+EdCYwx7EbpZdSiZc5goAuJT+/QXXT/Ls+fzc+eSy4Sz1Ic5t2BjLhmYZLdnBL3uIVceNSb8GzYPQx0+xy7g== - on_build_success: true - on_build_failure: true on_build_status_changed: true body: "type=stream&to=appveyor&subject={{projectName}} Build {{buildVersion}} {{status}}&content=Build {{buildVersion}} {{status}}{{#isPullRequest}} (PR #{{pullRequestId}}) {{/isPullRequest}}{{#failed}} :cross_mark:{{/failed}}{{#passed}} :check_mark:{{/passed}} {{buildUrl}}" diff --git a/build/certificates/windows_sectigo_codesign_certificate.pfx.enc b/build/certificates/windows_sectigo_codesign_certificate.pfx.enc Binary files differnew file mode 100644 index 0000000000..732161ec5a --- /dev/null +++ b/build/certificates/windows_sectigo_codesign_certificate.pfx.enc diff --git a/res/controllers/Akai-LPD8-RK-scripts.js b/res/controllers/Akai-LPD8-RK-scripts.js index 35950bb273..f93d4b010a 100644 --- a/res/controllers/Akai-LPD8-RK-scripts.js +++ b/res/controllers/Akai-LPD8-RK-scripts.js @@ -251,7 +251,7 @@ LPD8RK.init = function (id, debug) { // called when the device is opened & set u engine.softTakeover("[Sampler1]","rate",true); engine.softTakeover("[Sampler2]","volume",true); engine.softTakeover("[Sampler2]","rate",true); - + //set LED timer LPD8RK.ledTimer = engine.beginTimer(LPD8RK.LEDinterval, "LPD8RK.setLeds()"); }; @@ -282,11 +282,11 @@ LPD8RK.setLeds = function () { var state = engine.getValue(LPD8RK.hotcues[id][LPD8RK.hotcueBank][0], "hotcue_"+LPD8RK.hotcues[id][LPD8RK.hotcueBank][1]+"_enabled"); //if (LPD8RK.debug){print("midi.sendShortMsg("+status+", "+ctrl+", "+state+")")}; - + LPD8RK.lightLED(status, ctrl, state); }; }; - + //loops for (var id in LPD8RK.loops){ //iterate through hotcues, set hotcue leds @@ -295,15 +295,15 @@ LPD8RK.setLeds = function () { var state = engine.getValue(LPD8RK.loops[id][0], "beatloop_"+LPD8RK.loops[id][1]+"_enabled"); //if (LPD8RK.debug){print("midi.sendShortMsg("+status+", "+ctrl+", "+state+")")}; - + LPD8RK.lightLED(status, ctrl, state); }; - + //reloop buttons - LPD8RK.lightLED(0xb0, 0x01, engine.getValue("[Channel1]", "loop_enabled")); - LPD8RK.lightLED(0xb1, 0x01, engine.getValue("[Channel2]", "loop_enabled")); - LPD8RK.lightLED(0xb2, 0x01, engine.getValue("[Sampler1]", "loop_enabled")); - LPD8RK.lightLED(0xb3, 0x01, engine.getValue("[Sampler2]", "loop_enabled")); + LPD8RK.lightLED(0xb0, 0x01, engine.getValue("[Channel1]", "loop_enabled")); + LPD8RK.lightLED(0xb1, 0x01, engine.getValue("[Channel2]", "loop_enabled")); + LPD8RK.lightLED(0xb2, 0x01, engine.getValue("[Sampler1]", "loop_enabled")); + LPD8RK.lightLED(0xb3, 0x01, engine.getValue("[Sampler2]", "loop_enabled")); }; LPD8RK.lightLED = function (status, ctrl, state){ @@ -316,8 +316,8 @@ LPD8RK.lightLED = function (status, ctrl, state){ if (state > 0 || state === true){state=1;}//make sure state is valid midi.sendShortMsg(status, ctrl, state); } - }; - + }; + LPD8RK.clear = function (){//enables hotcue clearing if (LPD8RK.debug){print("###hotcueclear##############")}; LPD8RK.hotcueClear=true; @@ -371,7 +371,7 @@ LPD8RK.loopButton = function (channel, control, value, status, group) { LPD8RK.reloopButton = function (channel, control, value, status, group) { if (LPD8RK.debug){print(LPD8RK.looplen+"len");} if (LPD8RK.debug){print(LPD8RK.looptype+"type");} - + if (value>0){//button was pressed engine.stopTimer(LPD8RK.reloopTimer); LPD8RK.loopbuttonDown=true; @@ -405,7 +405,7 @@ LPD8RK.resetOldBank = function () { LPD8RK.hotcueBankDial = function (channel, control, value, status, group) { //sets which hotcue bank to display (separate this out on dedicated controller) - + //pause LED resets, so bank indicator lights will be visible engine.stopTimer(LPD8RK.ledTimer); @@ -437,31 +437,31 @@ LPD8RK.hotcueBankDial = function (channel, control, value, status, group) { LPD8RK.oldHotcueBank=LPD8RK.hotcueBank; //set timer to clear old bank number after 500 msec, so bank indicator light will light up engine.stopTimer(LPD8RK.oldbanktimer); - LPD8RK.oldbanktimer = engine.beginTimer(500, "LPD8RK.resetOldBank()", true); + LPD8RK.oldbanktimer = engine.beginTimer(500, "LPD8RK.resetOldBank()", true); //set timer to restart LED updates in 500 msec engine.stopTimer(LPD8RK.LEDPauseTimer); - LPD8RK.LEDPauseTimer = engine.beginTimer(LPD8RK.LEDinterval, "LPD8RK.resetLEDTimer()", true); + LPD8RK.LEDPauseTimer = engine.beginTimer(LPD8RK.LEDinterval, "LPD8RK.resetLEDTimer()", true); }; LPD8RK.looplenDial = function (channel, control, value, status, group) { //activates variable length loop depending on dial position LPD8RK.looplen=value; - if (LPD8RK.loopbuttonDown !== true){return false;}//exit if no loop button down - else if (LPD8RK.looplen<=0x12){engine.setValue(group, LPD8RK.looptype+"_0.0625_activate", .0625);return true;} else - if (LPD8RK.looplen<=0x25){engine.setValue(group, LPD8RK.looptype+"_0.125_activate", .125);return true;} else - if (LPD8RK.looplen<=0x37){engine.setValue(group, LPD8RK.looptype+"_0.25_activate", .25);return true;} else - if (LPD8RK.looplen<=0x49){engine.setValue(group, LPD8RK.looptype+"_0.5_activate", .5);return true;} else - if (LPD8RK.looplen<=0x5b){engine.setValue(group, LPD8RK.looptype+"_1_activate", 1);return true;} else - if (LPD8RK.looplen<=0x6d){engine.setValue(group, LPD8RK.looptype+"_2_activate", 2);return true;} else - if (LPD8RK.looplen<=0x70){engine.setValue(group, LPD8RK.looptype+"_4_activate", 4);return true;} else - if (LPD8RK.looplen<=0x7f){engine.setValue(group, LPD8RK.looptype+"_8_activate", 8);return true;}; + if (LPD8RK.loopbuttonDown !== true){return false;}//exit if no loop button down + else if (LPD8RK.looplen<=0x12){engine.setValue(group, LPD8RK.looptype+"_0.0625_activate", .0625);return true;} else + if (LPD8RK.looplen<=0x25){engine.setValue(group, LPD8RK.looptype+"_0.125_activate", .125);return true;} else + if (LPD8RK.looplen<=0x37){engine.setValue(group, LPD8RK.looptype+"_0.25_activate", .25);return true;} else + if (LPD8RK.looplen<=0x49){engine.setValue(group, LPD8RK.looptype+"_0.5_activate", .5);return true;} else + if (LPD8RK.looplen<=0x5b){engine.setValue(group, LPD8RK.looptype+"_1_activate", 1);return true;} else + if (LPD8RK.looplen<=0x6d){engine.setValue(group, LPD8RK.looptype+"_2_activate", 2);return true;} else + if (LPD8RK.looplen<=0x70){engine.setValue(group, LPD8RK.looptype+"_4_activate", 4);return true;} else + if (LPD8RK.looplen<=0x7f){engine.setValue(group, LPD8RK.looptype+"_8_activate", 8);return true;}; }; LPD8RK.loopminus = function (channel, control, value, status, group) { //shrinks loop or moves loop back - if (LPD8RK.loopbuttonDown !== true){engine.setValue(group, "loop_halve", 1);engine.setValue(group, "loop_halve", 0); return false;}//shrink loop if no loop button down + if (LPD8RK.loopbuttonDown !== true){engine.setValue(group, "loop_halve", 1);engine.setValue(group, "loop_halve", 0); return false;}//shrink loop if no loop button down else if (engine.getValue(group, "loop_start_position")>=0 && engine.getValue(group, "loop_end_position")>=0 ){ //move loop var interval = LPD8RK.loopmove*engine.getValue(group, "track_samples")/engine.getValue(group, "duration"); @@ -475,7 +475,7 @@ LPD8RK.loopminus = function (channel, control, value, status, group) { LPD8RK.loopplus = function (channel, control, value, status, group) { //grows loop or moves loop forward - if (LPD8RK.loopbuttonDown !== true){engine.setValue(group, "loop_double", 1); engine.setValue(group, "loop_double", 0); return false;}//shrink loop if no loop button down + if (LPD8RK.loopbuttonDown !== true){engine.setValue(group, "loop_double", 1); engine.setValue(group, "loop_double", 0); return false;}//shrink loop if no loop button down else if (engine.getValue(group, "loop_start_position")>=0 && engine.getValue(group, "loop_end_position")>=0 ){ //move loop var interval = LPD8RK.loopmove*engine.getValue(group, "track_samples")/engine.getValue(group, "duration"); @@ -494,26 +494,26 @@ LPD8RK.beatjump = function (channel, control, value, status, group) { var backseconds = numbeats*(1/(engine.getValue(group, "bpm")/60)); var backsamples = backseconds*engine.getValue(group, "track_samples")/engine.getValue(group, "duration"); var newpos = curpos-(backsamples+engine.getValue("Master", "latency")); - + if (LPD8RK.debug){print("backseconds: "+backseconds);} if (LPD8RK.debug){print("backsamples: "+backsamples);} if (LPD8RK.debug){print("curpos: "+curpos);} if (LPD8RK.debug){print("newpos: "+newpos);} if (LPD8RK.debug){print("numbeats: "+numbeats);} - + engine.setValue(group, "playposition", newpos/engine.getValue(group, "track_samples")); }; LPD8RK.beatjumpDial = function (channel, control, value, status, group) { //activates variable length loop depending on dial position if(value>=0 && value <=127){ - if (value<=1){LPD8RK.beatjumpstep=.25; return true;} else - if (value<=31){LPD8RK.beatjumpstep=.5; return true;} else - if (value<=63){LPD8RK.beatjumpstep=1; return true;} else - if (value<=94){LPD8RK.beatjumpstep=2; return true;} else - if (value<=125){LPD8RK.beatjumpstep=4; return true;} else + if (value<=1){LPD8RK.beatjumpstep=.25; return true;} else + if (value<=31){LPD8RK.beatjumpstep=.5; return true;} else + if (value<=63){LPD8RK.beatjumpstep=1; return true;} else + if (value<=94){LPD8RK.beatjumpstep=2; return true;} else + if (value<=125){LPD8RK.beatjumpstep=4; return true;} else if (value<=127){LPD8RK.beatjumpstep=8; return true;}; - }; + }; }; LPD8RK.mute = function (group) { @@ -528,19 +528,19 @@ LPD8RK.mute = function (group) { LPD8RK.vol[ |