summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt9
-rw-r--r--appveyor.yml27
-rw-r--r--build/certificates/windows_sectigo_codesign_certificate.pfx.encbin0 -> 7520 bytes
-rw-r--r--res/controllers/Akai-LPD8-RK-scripts.js88
-rw-r--r--res/controllers/American-Audio-RADIUS-2000-scripts.js4
-rw-r--r--res/controllers/American-Audio-VMS4-scripts.js30
-rw-r--r--res/controllers/Behringer-BCD3000-Advanced-scripts.js20
-rw-r--r--res/controllers/Behringer-BCD3000-scripts.js12
-rw-r--r--res/controllers/Behringer-CMDStudio4a-scripts.js548
-rw-r--r--res/controllers/DJ-Tech-CDJ-101-scripts.js20
-rw-r--r--res/controllers/DJ-Tech-Kontrol-One-scripts.js134
-rw-r--r--res/controllers/DJ-Tech-Mixer-One-scripts.js6
-rw-r--r--res/controllers/DJ-Tech-i-Mix-Reload-scripts.js80
-rw-r--r--res/controllers/Denon-MC3000-scripts.js68
-rw-r--r--res/controllers/Denon-MC4000-scripts.js26
-rw-r--r--res/controllers/EKS-Otus.js50
-rw-r--r--res/controllers/Electrix-Tweaker-scripts.js54
-rw-r--r--res/controllers/Gemini-CDMP-7000-scripts.js136
-rw-r--r--res/controllers/Gemini-FirstMix-scripts.js530
-rw-r--r--res/controllers/Hercules DJ Control MP3 e2-scripts.js24
-rw-r--r--res/controllers/Hercules-DJ-Console-4-Mx-scripts.js3586
-rw-r--r--res/controllers/Hercules-DJ-Console-Mk1-hid-scripts.js48
-rw-r--r--res/controllers/Hercules-DJ-Console-Mk2-hid-scripts.js44
-rw-r--r--res/controllers/Hercules-DJ-Console-Mk2-scripts.js122
-rw-r--r--res/controllers/Hercules-DJ-Console-RMX-2-scripts.js16
-rw-r--r--res/controllers/Hercules-DJ-Console-RMX-hid-scripts.js2
-rw-r--r--res/controllers/Hercules-DJ-Console-RMX-scripts.js2
-rw-r--r--res/controllers/Hercules-DJ-Control-AIR-scripts.js2
-rw-r--r--res/controllers/Hercules-DJ-Control-Instinct-scripts.js44
-rw-r--r--res/controllers/Hercules-DJ-Control-MP3-hid-scripts.js58
-rw-r--r--res/controllers/Hercules-DJ-Control-MP3-scripts.js38
-rw-r--r--res/controllers/Hercules-P32-scripts.js4
-rw-r--r--res/controllers/Hercules-mp3e2-compat.js2
-rw-r--r--res/controllers/Ion-Discover-DJ-scripts.js14
-rw-r--r--res/controllers/KANE_QuNeo_scripts.js122
-rw-r--r--res/controllers/Kontrol-Dj-KDJ500-scripts.js8
-rw-r--r--res/controllers/Korg-KAOSS-DJ-scripts.js14
-rw-r--r--res/controllers/Korg-nanoKONTROL-2-scripts.js154
-rw-r--r--res/controllers/Korg-nanoPAD2-scripts.js18
-rw-r--r--res/controllers/Midi_for_light-scripts.js36
-rw-r--r--res/controllers/MixVibes-U-Mix-Control-Pro-2-scripts.js2
-rw-r--r--res/controllers/Mixman DM2 (Linux).js2
-rw-r--r--res/controllers/Nintendo-Wiimote.js56
-rw-r--r--res/controllers/Novation-Dicer-scripts.js62
-rw-r--r--res/controllers/Novation-Launchpad-Mini-scripts.js10
-rw-r--r--res/controllers/Numark-DJ2Go-scripts.js1382
-rw-r--r--res/controllers/Numark-Mixtrack-3-scripts.js68
-rw-r--r--res/controllers/Numark-NS7-scripts.js10
-rw-r--r--res/controllers/Numark-Omni-Control-scripts.js46
-rw-r--r--res/controllers/Numark-Total-Control-scripts.js46
-rw-r--r--res/controllers/Numark-V7-scripts.js30
-rw-r--r--res/controllers/Pioneer-CDJ-2000-scripts.js2
-rw-r--r--res/controllers/Pioneer-CDJ-350-scripts.js14
-rw-r--r--res/controllers/Pioneer-CDJ-850-scripts.js8
-rw-r--r--res/controllers/Reloop-Beatpad-scripts.js5496
-rw-r--r--res/controllers/Reloop-Digital-Jockey2-Controller-scripts.js1870
-rw-r--r--res/controllers/Sony-SixxAxis.js14
-rw-r--r--res/controllers/Stanton-SCS1d-scripts.js248
-rw-r--r--res/controllers/Stanton-SCS1m-scripts.js68
-rw-r--r--res/controllers/Stanton-SCS3d-scripts.js206
-rw-r--r--res/controllers/Traktor Kontrol S2 Mk2.hid.xml19
-rw-r--r--res/controllers/Traktor-Kontrol-S2-MK2-hid-scripts.js1381
-rw-r--r--res/controllers/Vestax-Typhoon-scripts.js66
-rw-r--r--res/controllers/Vestax-VCI-100-3DEX-scripts.js30
-rw-r--r--res/controllers/Vestax-VCI-100-hile.js44
-rw-r--r--res/controllers/Vestax-VCI-100-scripts.js10
-rw-r--r--res/controllers/Wireless-DJ-scripts.js66
-rw-r--r--res/controllers/common-hid-devices.js2
-rw-r--r--res/controllers/common-hid-packet-parser.js23
-rw-r--r--src/mixxx.cpp43
-rw-r--r--src/mixxx.h2
-rw-r--r--src/skin/legacyskinparser.cpp124
-rw-r--r--src/skin/legacyskinparser.h38
-rw-r--r--src/skin/skinloader.cpp27
-rw-r--r--src/skin/skinloader.h27
-rw-r--r--src/skin/tooltips.cpp45
-rw-r--r--src/sources/soundsourceffmpeg.cpp110
-rw-r--r--src/test/seratomarkers2test.cpp7
-rw-r--r--src/test/seratomarkerstest.cpp7
-rw-r--r--src/widget/controlwidgetconnection.cpp7
-rw-r--r--src/widget/wlabel.cpp15
-rw-r--r--src/widget/wlabel.h13
-rw-r--r--src/widget/wwidgetgroup.cpp3
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
new file mode 100644
index 0000000000..732161ec5a
--- /dev/null
+++ b/build/certificates/windows_sectigo_codesign_certificate.pfx.enc
Binary files differ
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[