1
0
mirror of https://github.com/dguglielmi/sunny-overlay.git synced 2025-12-06 07:22:38 +01:00

media-sound/mixxx: bump to 2.1.1

This commit is contained in:
2018-06-14 17:40:27 +02:00
parent 4a25536157
commit 5d74d48182
39 changed files with 124 additions and 17143 deletions

View File

@@ -1,39 +1,3 @@
AUX mixxx-2.0.0-docs.patch 435 BLAKE2B c2e9b09abb293e59b2af49527eccf07c9488ae5e30e29e6c4d6330cc298a568ee7dd7014af6b9c1f1c4d98b8c11c96da7f74660eb4b3b522f449e7a6a431addc SHA512 01ab76466f782f538c894e460f7694553ae12804651f68aabb6aaa0dbdc89e2ff7e2b51529b0f112cee42c8053b75fc64241a9c8898def8cf1c76231b1ec5d59
AUX mixxx-2.1.0-beatsync-fix.patch 23078 BLAKE2B c2156099cc1ed69d52c852d5a2b0f4f8cb9f06472b47a153c9f753b44d1ed84c354e16bddced6c6e618b6f65a2c11125052ee71d5d0018f8c3998477023a1a0c SHA512 c02606d5ffaa7f9a726600820afff35e92b8477e96b7a06991eae21a9368a5ed36c1720d4189fc3a1b448dc32434953a5cb02bca08692d43cb9d5e73f4d63a30
AUX mixxx-2.1.0-components-js-fixes.patch 3370 BLAKE2B ff9295a8c938e9c3a526e206792cd27cd4025ea07ede79da844cbd80565f10020b8856bdfbb2cf7557dba0bc8b3d775eb10c45f689d975aad13c35a22705a4a0 SHA512 ff27ad09b119bbf51e678a84c5eb60f9c6822a55160ea9d175f043caa33005d311d10366c91a1b7f402e6d7039cabac675aa35f893f02efe0015e831f2751bc8
AUX mixxx-2.1.0-debug-assert-and-fix-false-poisitiv-restart-request.patch 5694 BLAKE2B 7732252cf6438df9d52e6de8ceaaf6b2e1c30e35d8154eb7af5d94641346117d4ab0b5501686909d35c81a5fd5aa9442831f11b66faaec782c11a55e14a11363 SHA512 ee35ea84db8bf91cd2f14dd779faa91857df7bcc376525d533e65c778e241a5e66c829ab208e2da5d4afb3a48571042c13e5092c4974a07a9ea11146df68d326
AUX mixxx-2.1.0-deere-add-gain-knob-to-expanded-sampler-view.patch 1116 BLAKE2B a32d877d6877a2dfc3b12b1dc6e6b40342120a735aa35814d203a7c9e5581f40ec9950c5732f6698e4facbe0e3b98d278e1c2ca39c880e141d863e3042407863 SHA512 8b7093ded2c79ab7f7adc7b578f3b349a364fe5c3d01a4617184a64f30799f336d5911221f79478bf8e61159b99144584efef1add0df835fa84d309ba68ea0cb
AUX mixxx-2.1.0-denon-mc6000mk2-fix-looping.patch 13668 BLAKE2B e6c214029df1534912a3edce3bac2cd59f75fdef41af21e225871e80921c1b4325b6faa5f284970c03606af3ea4044670fa224ec58cc16fb10c9693e69b62e0f SHA512 0aace301b836c6940c094b0a951e1fd16ee3b3a80ac5defc2f4e5f903ff3ed71d7578d0b5ce2e9f400220c6bd17b3aae546a6738b84475f68553743c8495980b
AUX mixxx-2.1.0-denon-mc6000mk2-use-ramping-for-back-spins.patch 64070 BLAKE2B fd6941c4c995559e12900db68a92c32e79ee94841cb0c7f536296ef079db39fdcde6014c697f94d2f2d92d17c8e41f72c02343cdadc8054816ca2d6ca98b4dc4 SHA512 7d481cec81e88f7fefeff92969a49881ffaca9bd7fb17c215c45363d3078e9e31350829299479eb111000a04924634ff1b25579f951d6da9dc52ac4d3ac38a96
AUX mixxx-2.1.0-detect-m4a-decoding-errors-on-windows.patch 6352 BLAKE2B 6d7e83f037089729c085c7458fba7580063cff2a01bbc9b2260688cb350ebc3924da0190dab5d353b1e6db4766b6ef1ca63d5e7776728eddfd7032bfb355738b SHA512 18fbbf80fa72aaf50b1f716b220ea741d9deb3c003f56bdb34e10f9c4421b1b0c8ad19775927be93e3ca6b0aea35c10c3927dcb8f1ffcf95a5b60203fce452b5
AUX mixxx-2.1.0-dlgtrackinfo-mismatching-signal-slot-connection.patch 2196 BLAKE2B fa238d47fcab50770b63061ae9c2c72035b2f608a8d237c5af0693c2baf91447aa5db8fc53bf384cc3d1166228c50091ba7f6a5cd375247e8e7a58086b76eca0 SHA512 87fe610f586117a709010be3424aece865a31430ae4e65c369e84f5c86cbde2cf9d6454eb036e3406784f82faed264009b5eca49e65cc91e062c2a0baeadc943
AUX mixxx-2.1.0-empty-library-fix-lp1772591.patch 3337 BLAKE2B 3ab3e5f922dfe2fa5fa227746c69a4cee7095efa2fe78b4b468e98ab5e730c06d9fb3ab28f22535e30881af71704a221d3091643cf30647e483f3e1ce8cf3cee SHA512 e3714addb94d238d8cca643a5cd61623a41e15687511b5064379c9268b01fa01401ca376efea523bbbfd4742110faa83c9889f483db399d9a49a39764010afca
AUX mixxx-2.1.0-fidlib-thread-safe-and-reentrant-generation-of-filters.patch 35122 BLAKE2B 976c623afc6f62fb5ee5082bcc503b7ca4bf5af160e102257024874e750a681347d6e4b70328a6596c88b261ed02f66ccb7c5897d1cf8174a92e4bb50d1e55c9 SHA512 377e2cd176264849f7de28d48107dca1c41b18a02c610d4f8c1ac824dc6e4c3d8b18363a7a3ae0d585157fed33592ad6cf578148508416b0783bd6b4084aaeb1
AUX mixxx-2.1.0-fix-cachingreader-compiler-warnings-about-non-trivial-types.patch 7055 BLAKE2B 669038949243674c8b7aaccd0cea4cc6c21644dd4bc2de463800bed71677d4e77cc5b3f5da89d0be3bdc44c847247afbf7b6248a29840aec676916bc8b9bc96f SHA512 45ec03e0d37b72d969fa730348a068df61200bae0a613045d9711637b6abc04608f2b3e7c2d99551dfa24c86846b3426c9f3600518258012e6e4d118f7beb947
AUX mixxx-2.1.0-fix-clearing-of-replaygain-gain-ratio-in-file-tags.patch 6898 BLAKE2B 7e20e44b0d6646cf410473b3d4c1ca310aa1b9ec8fafb06ee4480a90be7cb6fd3b67ac1a425d98beed03eef22016ad76f127ddcb46c6a7a22237ca93b59826ab SHA512 ecffb8bab5ad1d1f55acc2c3187a4dd10edda22e6708754e76184181808afc3fb014d43544b0a1006c9a439673bb56ab54549a0d95c0a05e709dcaba3600f8cc
AUX mixxx-2.1.0-fix-crash-when-importing-id3v2-apic-frames.patch 3731 BLAKE2B 7db0372c0e7cbcafc75214b900bc5a0e4e596a50aba7e681937f0de67d7f4b52fa6d65f91381f5a4193c6d5e86518cb01e64aa94080a400bff6fa44c97fa0b38 SHA512 082092491b1aa345df83e3d2e864087a198faf02ba81c64a6681c83e007d8c15e5bd9e1537712c5ff5e2f093443ad78597e7541d9074555b0f9f3f5dab007ee4
AUX mixxx-2.1.0-fix-crash-when-removing-a-quick-link.patch 3143 BLAKE2B e0562c35c83fcefe50362a5f2359cbca10853a0a4c2285866a5bd48a8ff7d13de066c2a153e86dd657c18fe1a30610f55f8e2ec95a958c9d0cc3a6288064f572 SHA512 94ba8e2e94f6f5ed8152f9499b5334211e812e374a5fafd48b8dc21e9e0b0ae8d6919f6a59fb3bae6c1d86de820ad654be45b0813f896cf4819dfaf2bebedc2d
AUX mixxx-2.1.0-fix-decoding-of-improperly-encoded-flac-files.patch 8256 BLAKE2B 5fd8a4ddb15449477212f077b7b176ffe30adfbb5521eece8e9fa5e7af17a2247f3f9936841ebfcf271664e1cf8928f71426019e5b8e02ae4972193c4351de21 SHA512 0c44bbd9d8d67b843420de6cafeb3e10f2ed31ff8af424d5e9d219d41f3e465ddee40141530fcba000cb99e4a136850c418dcae5bd73047328c7436635d85071
AUX mixxx-2.1.0-fix-flac-decoding-and-upgrade-db-schema.patch 15891 BLAKE2B fd032363b07357c1fa16c2376b5f2f5b9580cb9c4534238336fca014f5432e460ba081c20608f22055c4e0799c17fba0f96b7d65a131d193d398ee5ffdda8e95 SHA512 99d3feb6761b8bd58acd7e1e4a8f0d2660b1bc1fb7f1885fb0211ad09dec3b1ab77c4ff0b8054e04313170bc050b0e655e8c90aa3d8301c39189ca6c2e2e4bdd
AUX mixxx-2.1.0-fix-integration-of-external-track-libraries.patch 16616 BLAKE2B 018fa65eae522ae9fe1d42816614353e7c31c30cfa8685257f72296c115fb5f0e3bab9482ada681200dfacf15c80599f6ecb46868849c1fc412abab2c51a56c6 SHA512 6355e065e29fe433580d685275667681c3c5f10b7153dc4d798db4265593fbf07118ff2e6e6f819919fab11cbb873615ca199289e5a311bd4e4fd9883d5cf66d
AUX mixxx-2.1.0-fix-invocation-args-of-pasuspender.patch 1879 BLAKE2B cc24dcfc530a85c673a26a4794e64d6c71d89785f8550b0d9162aa714221af6a1ceabcbb65340f3c48fb79e6b145f98ef2ef0608f66b75fd06683b3cb8062126 SHA512 42ad3d54cb3450a37ecd36546b0abd5f71481168b25b384f04831555e806dd50dc185e327a923060fe4144209baadb10ee4dda4baad49c6941d26d3a03ca17e8
AUX mixxx-2.1.0-fix-latenight-group-fx-buttons-in-deck.patch 7213 BLAKE2B 363c23bca079219acbc36b0ccfee8629b12eae797afa4ba76d33ef2f68e7719298a231a5a4a678e37047eefc6cbe1f1fdbd7ae382327aeac64b2caaab9abd87c SHA512 f82b91897512f188d01d65c6f4b38ad77fdf003b5343e9e4a5b9b9bac92f603f8b54f3760286ef8f69476afb1a50e89f6a721a76a7c3e10d77608298e07d9cb4
AUX mixxx-2.1.0-fix-memory-leak-when-loading-cover-art.patch 1473 BLAKE2B 4f7e59a8f97e36ecc073a2e6755dd44560a96f5f72217034a8ba2cd14f6790ab5d136ed54e2d4c87a2d039143c5804a9f8a9e476045433ab70367e973abdf145 SHA512 555d86b6793dbd4fb09c0c36bb69e31dd7cdceb99b1cdf9362349c6f25a93e3c0a078c4958a2bb3ad9d6329573d84e3ed913a5826a42444b0ec0902310e5cf3e
AUX mixxx-2.1.0-fix-navigation-usability-issues-in-sidebar-tree.patch 15383 BLAKE2B 484df59087aaa09ca4cdfd61bb9236e1d07e9d7bb0d7be0e1bf576e1e546b3a8b10e9aadacb81336d01681612d920cfa28d809ceafc6f2d85a9cde724427b724 SHA512 4a817e0002d99812a092a808587f35adc849b8da8238e420ea7290e1900813374402d526bdabe0d260bf04b39c06051c64db2a41d0b7114c2381955cfb3abf57
AUX mixxx-2.1.0-fix-s4-mk2-for-windows.patch 2065 BLAKE2B aa36275f3e0fdb08c73408941f7374f5818890d0de119a6992a811f58c5da76ad45d47c5a2e5668eca47131eca12f565b4016c7b8510fb35f6ad03cd429cc0c8 SHA512 196ff5a3769a31b8b1fb264b8a3de1eccdd10c3764a4dd2c4c411ab3d886cd232601b86b119b375c0a08141f86afd8551a4315610cfd39459c3b0cb806246f6e
AUX mixxx-2.1.0-fix-some-log-levels-and-reduce-debug-log-spam.patch 43318 BLAKE2B 1afc339ee473c52e05f10104e44ba0460058115fb052b57496fc9eb9859a5bf74dcd49848bb5f9c7399da58463a0987516d0d21ec3ac1a5fd5d60637f83c955d SHA512 9599cb7da27244b3abf3e5bc01f1e89ca2c441639ce979ed3946404b023b9b1dbdec22d4a1e4481e6d2637d8e3f4f141e1ea21264eb3a9b80f0ec684d07623cf
AUX mixxx-2.1.0-fix-spinback-inertia-effect-partial-revert-of-2b612c2.patch 1151 BLAKE2B a49e171ca017e3b36b7271859093e77bedd038dc42085330babc39a675549b708fa8b2a9b0774a44fa6cc0abbfcddad57173e75d7ce3d163828bfa6e727a1a6c SHA512 1bcda1e863337f9e330fb04ecdee1b0600093bad069bc0d48b3ac4e0c456471319bb42a0f5e9aa8b42bc1e88db81795063290733c57a1dff60f4750e55a206de
AUX mixxx-2.1.0-fix-unresponsive-scrolling-through-crates-and-playlists-using-encoder.patch 10554 BLAKE2B fedfdb247f55ac438635a527e30b132386e95f40143c26b581f6929a45126b7d97a4ea98d84582a6dded002afa623a7fac3a0f1e2e03499e592967df0fbe7646 SHA512 18b3d51f5c341e412f9fae2bb596ef569906e628ea5102d35864f299be2c2f21853833964b0566f4c3c6a964ee52627eb6ec0982ebc3d4151b3e6210765504e1
AUX mixxx-2.1.0-library-improvements-for-all-skins-fix-lp1772202-in-tango.patch 252028 BLAKE2B b74c8052548f7c65bf15300fefa998d619ab82ec073d162e7d6f856a3ea1626f6882c57f2e12cf9981e031390ee7aa476f349c1f33a8cad5c1ca68a2609e2dd3 SHA512 95442eb5cd8699d3e00d22baa76d4d41209f632a9fce04612dcf9fba598f00567546162f6375cdbd8922e8a61fc91c137847b166f1a8ced8fdb47eb4f8a92e17
AUX mixxx-2.1.0-optimize-flac-decoding.patch 9430 BLAKE2B f3d0b707f69332f94db54416fc9a9a6374302853daa8fb3046048e66f25259081f9bbe46c1dc8620076904a7f1a57abf051be0db3af02378ac9df06dc353f765 SHA512 5d244f8fe606eab6c6bea64439a520ada568dd2681d05fcdbdd1abebabf5bc74eecf3aa67765f4d2d78295a9a87c9ca7746cfc59cfd5db1a4b8a085f36b95cd6
AUX mixxx-2.1.0-os-theme-shining-though-fix.patch 40146 BLAKE2B 1b0b86d5bc8234b602aa1c531590a2ef5672228973d6c4f95d37c90d530a4648bfd61eb4e4b2acc8d34e6257d34ef4346771fe56e14fd66285a22affb6b33dee SHA512 ef218d086ee03355f3bc777788621d4e6a2b2515907dd86662cce3c87122ae6c12aa837a08404f96c4fd41dfdeffc8ad6f25bd455f760614b7a34fc4bbde096b
AUX mixxx-2.1.0-pioneer-ddj-sx-mapping-bugfixes.patch 11255 BLAKE2B 9e15935f3fcfe9e26c04960496998450ee15cf8eb7b98e0439064caf9653617b94e0bf4c93f13ee49d169accabe662f9f8ca2abea05559b91d7f5362225de1c9 SHA512 f4774fe4884d339f2929468551b2f248200f3dc1c31c436070c8a439d18cf524aab0dd7ca990595e0c88ddd70e1e71dee025a641df6d240724fec94f2087ebd0
AUX mixxx-2.1.0-qt5-2.1.patch 20604 BLAKE2B 97b0145e68de1622020b52f08b9160fd23a7d9e42469201e40d93779eba903c496728a517ba274468de572a7714cfb0353859e76a380002219c39deb3fd23943 SHA512 8856aaa2d3c870a684d3e78deea2e162b00c96e3d64405615066430984525abcb71cc07c9f1dc0cdd18161ebb1aff8c1ebe223d21c3f3c4d3e92f3c38da3ffab
AUX mixxx-2.1.0-reduce-log-spam-from-soundsourceproxy.patch 1791 BLAKE2B 84f51305c1054bc1ac50e59abf1fbad01f07dd316592fb6fdcbe268d19d19400c9a99e54ec74674c73632b8e443f25168f262eaa02e221204d0c3eb9320f3609 SHA512 d58f42be3b711df919e50ed2e665f95f63b265c6571e5b8109f2c7977f823d0360c8bd5e0618912d4c0d15a92a8ee673320fbd23c9fc2d75bd3a78aea0f9558b
AUX mixxx-2.1.0-swap-default-values-for-temp-perm-ratechanges.patch 1534 BLAKE2B 30e2c7fe396919fcdfba7102f360e307e2104bfa6480ec5615bc1482f2e496f99435d745468621f6ff7ae15e0e4857fd6db692061cf5d7b19b0bc7672b889aea SHA512 e0c6365f26313935b503de36edb9ed247333e892352645d5379659bc7a53761b7b24d1a162dee38cb776e17f5e8741d5235713d47f5812975169395bb4d00f05
AUX mixxx-2.1.0-try-to-fix-appstream-config-and-desktop-icon.patch 6964 BLAKE2B 360f71de43a63e19d052b46acfbd7437656fdf76325d17cae25509d409266263ae0dfb10b75f67c70a2f68d90c523a83bd052d772a28412dd9b40c76fdf8dac6 SHA512 20f45cfcd25cc11b1a39be58671f9a5162643247a3cd5e4dbf98620eebd2f8e79d2df454c932118ec630c20cdf8ec9dc9b54e15b9bcb20ae80683f3ecf25bc7c
AUX mixxx-2.1.0-update-american-audio-vms4-preset-for-mixxx-v2.1.x.patch 26106 BLAKE2B e08dcc0a1572dcd1d6909644e2704e4b2c2f9646e0c96da6e0631bbebca4b680b490f13f20a5de5761ee826c77a53577ab24b5ba2d3627124bb4a93a4c54ef27 SHA512 5866243851348abfcb59db7d60932c523af62227d15df845517a283c1d579b358271ca22a1062a7df144f6c43ba9bdfc1c06eac41ea8b2ca23ae2493ca481322
AUX mixxx-2.1.0-use-an-in-memory-database-to-speed-up-library-tests.patch 3086 BLAKE2B d2cb0b7992cdb07b1ba2accde1d272cd3f75adf8bd3bb2450ad9203db5d7978c9b29dbf6e278a2a1f1fb8fb84f28b23f276f0f999b3e5d77c272b91716dcc9f1 SHA512 a6fefbc80f8facc8cd0bf501858b4dadb6ebe4bf476dc97273ad7e97ae2c0840ca9bd6b0b3aaa34caa837b967ee7fa12635c7c2957241ca6aff5a26531b6e25f
AUX mixxx-2.1.0-use-new-link-to-updated-2-1-feedback-form.patch 1091 BLAKE2B 49cd235c8bde044e9394f8b2b651714c793edcefd8a381954e3fa6e788e8277eab2370afe7d5523f8d6b0eb47277173fd757182f9b21a20e408bdb8931fd2f00 SHA512 c344991a8dbcf473ef368d5d6296fb598450d36cc22051669e496b35fdd7feb90c15dcf2c2ca53cf341e3b07b946f2f926b23fef10cba448d5eb5dadc29f8448
DIST mixxx-2.1.0-src.tar.gz 34835250 BLAKE2B 7a90c3794a146001fd0df6bb7c9c6231c0d26814eafc5c83da666d511d7af0e193b75da9b8728ad399dbef208cf2437881df2c87818e503945b02591bc300567 SHA512 d9f4fab92c2896ec455e2041aa6033f9a9091d2915a185a99427b9c35afe7c99565350ce477bf0487c6276c9585875f0be61f310779ae90195917d2e995bbf90
EBUILD mixxx-2.1.0.ebuild 5517 BLAKE2B 207fca5f0783d47a5a60e2ae8df69fb144de97b0b06056c7f0d47a9ef22823bde009d2ef0778f3d6a666a4fde2715968d8ff2d2de97e52d84166ae8a75077ea5 SHA512 69b98c641a0e5cc4bd6ad9ddd9a64cc3481bc6273fa0416000e04e20f4e42d6b26b8a1ec1b8f97b506b0c4f1a6ba0074c220c48becdbc88788fe75b6e332f4ec
DIST mixxx-2.1.1-src.tar.gz 34458368 BLAKE2B cf718cfea64fe71e2ccd5f299454fc9d396266052cc2516fa4494216a9d8ae9cea62858bf02e026d5072705df780d6243616d1d1705e3f251bc2392b4dc3d166 SHA512 c0047a238bf39e464f2bc25646ba03138d0b8d27cde667ca7b12bfba5f40d339ce4b426853e048d695b2c59c847e88322e27b91bead467899d7bf1cb43358f20
EBUILD mixxx-2.1.1.ebuild 2677 BLAKE2B b4a4e8837eb669e96324796bf2c198793bcf5228b8549a468da70d9f12c9c7016034b3931c305f3b2c8190955f47c3c22ab8e84db246f2075cfa32369de8a284 SHA512 1c95a79715467fa79f790d11e49fab7c5f6af87715620ade70d11274e0f7d004e5c4b0f346e0e4d3935b3dea578c99c8c05f642d8bec7a6db7df03eb72c0c2f0

View File

@@ -1,537 +0,0 @@
From 0783a13514f35e679059076c9cabed708baa844a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Tue, 22 May 2018 02:29:42 +0200
Subject: [PATCH 1/8] fix beatsync control syncing phase, an old regression
since 2.0
---
src/engine/enginebuffer.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp
index 1218f017b6..42087bc248 100644
--- a/src/engine/enginebuffer.cpp
+++ b/src/engine/enginebuffer.cpp
@@ -658,7 +658,7 @@ void EngineBuffer::slotControlPlayRequest(double v) {
bool verifiedPlay = updateIndicatorsAndModifyPlay(v > 0.0);
if (!oldPlay && verifiedPlay) {
- if (m_pQuantize->get() > 0.0
+ if (m_pQuantize->toBool()
#ifdef __VINYLCONTROL__
&& m_pVinylControlControl && !m_pVinylControlControl->isEnabled()
#endif
@@ -900,7 +900,7 @@ void EngineBuffer::process(CSAMPLE* pOutput, const int iBufferSize) {
// we need to sync phase or we'll be totally out of whack and the sync
// adjuster will kick in and push the track back in to sync with the
// master.
- if (m_scratching_old && !is_scratching && m_pQuantize->get() > 0.0
+ if (m_scratching_old && !is_scratching && m_pQuantize->toBool()
&& m_pSyncControl->getSyncMode() == SYNC_FOLLOWER && !paused) {
// TODO() The resulting seek is processed in the following callback
// That is to late
@@ -1179,7 +1179,7 @@ void EngineBuffer::processSeek(bool paused) {
return;
}
- if ((seekType & SEEK_PHASE) && !paused && m_pQuantize->toBool()) {
+ if (!paused && ((seekType & SEEK_PHASE) || m_pQuantize->toBool())) {
position = m_pBpmControl->getNearestPositionInPhase(position, true, true);
}
if (position != m_filepos_play) {
From c65d450f9962ea834a55d6aec6749b2f7524cb90 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Tue, 22 May 2018 02:37:31 +0200
Subject: [PATCH 2/8] Added beatsync to right click on sync in Shade and Deere,
fixes bug #1772526
---
res/skins/Deere/deck_tempo_column.xml | 3 ++-
res/skins/Shade/deck.xml | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/res/skins/Deere/deck_tempo_column.xml b/res/skins/Deere/deck_tempo_column.xml
index 7d7e76ea19..d7de70df24 100644
--- a/res/skins/Deere/deck_tempo_column.xml
+++ b/res/skins/Deere/deck_tempo_column.xml
@@ -15,7 +15,7 @@
<ObjectName>TempoControlButtons</ObjectName>
<Layout>vertical</Layout>
<Children>
- <Template src="skin:left_2state_button.xml">
+ <Template src="skin:left_right_2state_button.xml">
<SetVariable name="TooltipId">sync_enabled</SetVariable>
<SetVariable name="ObjectName">DeckSync</SetVariable>
<SetVariable name="MinimumSize">-1,18</SetVariable>
@@ -28,6 +28,7 @@
<SetVariable name="state_1_pressed"></SetVariable>
<SetVariable name="state_1_unpressed"></SetVariable>
<SetVariable name="left_connection_control"><Variable name="group"/>,sync_enabled</SetVariable>
+ <SetVariable name="right_connection_control"><Variable name="group"/>,beatsync</SetVariable>
</Template>
<WidgetGroup>
diff --git a/res/skins/Shade/deck.xml b/res/skins/Shade/deck.xml
index ad3cabd6d2..494901128a 100644
--- a/res/skins/Shade/deck.xml
+++ b/res/skins/Shade/deck.xml
@@ -450,7 +450,7 @@
<ButtonState>LeftButton</ButtonState>
</Connection>
<Connection>
- <ConfigKey>[Channel<Variable name="channum"/>],beatsync_tempo</ConfigKey>
+ <ConfigKey>[Channel<Variable name="channum"/>],beatsync</ConfigKey>
<ButtonState>RightButton</ButtonState>
</Connection>
</PushButton>
From ef28e682392d61ccf44189dba8807e7b0926eff4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Wed, 30 May 2018 20:39:59 +0200
Subject: [PATCH 3/8] Restore quantize dependency of sync_enable lost in a
previous commit
---
src/engine/sync/enginesync.cpp | 5 ++---
src/engine/sync/internalclock.cpp | 2 +-
src/engine/sync/internalclock.h | 2 +-
src/engine/sync/syncable.h | 2 +-
src/engine/sync/synccontrol.cpp | 14 +++++++++++---
src/engine/sync/synccontrol.h | 3 ++-
6 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/src/engine/sync/enginesync.cpp b/src/engine/sync/enginesync.cpp
index 955ef7c52a..9b0436e95e 100644
--- a/src/engine/sync/enginesync.cpp
+++ b/src/engine/sync/enginesync.cpp
@@ -165,9 +165,8 @@ void EngineSync::requestEnableSync(Syncable* pSyncable, bool bEnabled) {
foundPlayingDeck = true;
}
activateFollower(pSyncable);
- if (foundPlayingDeck && pSyncable->isPlaying()) {
- // Users also expect phase to be aligned when they press the sync button.
- pSyncable->requestSyncPhase();
+ if (foundPlayingDeck) {
+ pSyncable->requestSync();
}
} else {
// Already disabled? Do nothing.
diff --git a/src/engine/sync/internalclock.cpp b/src/engine/sync/internalclock.cpp
index 0b013d7bc3..2629ed79fe 100644
--- a/src/engine/sync/internalclock.cpp
+++ b/src/engine/sync/internalclock.cpp
@@ -54,7 +54,7 @@ void InternalClock::notifyOnlyPlayingSyncable() {
// No action necessary.
}
-void InternalClock::requestSyncPhase() {
+void InternalClock::requestSync() {
// TODO(owilliams): This should probably be how we reset the internal beat distance.
}
diff --git a/src/engine/sync/internalclock.h b/src/engine/sync/internalclock.h
index b3d7f3fa7a..407497f5b1 100644
--- a/src/engine/sync/internalclock.h
+++ b/src/engine/sync/internalclock.h
@@ -29,7 +29,7 @@ class InternalClock : public QObject, public Clock, public Syncable {
void notifySyncModeChanged(SyncMode mode);
void notifyOnlyPlayingSyncable();
- void requestSyncPhase();
+ void requestSync();
SyncMode getSyncMode() const {
return m_mode;
}
diff --git a/src/engine/sync/syncable.h b/src/engine/sync/syncable.h
index 033f8b268c..7139082841 100644
--- a/src/engine/sync/syncable.h
+++ b/src/engine/sync/syncable.h
@@ -37,7 +37,7 @@ class Syncable {
virtual void notifyOnlyPlayingSyncable() = 0;
// Notify a Syncable that they should sync phase.
- virtual void requestSyncPhase() = 0;
+ virtual void requestSync() = 0;
// Must NEVER return a mode that was not set directly via
// notifySyncModeChanged.
diff --git a/src/engine/sync/synccontrol.cpp b/src/engine/sync/synccontrol.cpp
index a516e6e5cc..89fded5706 100644
--- a/src/engine/sync/synccontrol.cpp
+++ b/src/engine/sync/synccontrol.cpp
@@ -72,6 +72,8 @@ SyncControl::SyncControl(const QString& group, UserSettingsPointer pConfig,
m_pEjectButton->connectValueChanged(
SLOT(slotEjectPushed(double)), Qt::DirectConnection);
+ m_pQuantize = new ControlProxy(group, "quantize", this);
+
// BPMControl and RateControl will be initialized later.
}
@@ -161,12 +163,18 @@ void SyncControl::notifyOnlyPlayingSyncable() {
m_pBpmControl->resetSyncAdjustment();
}
-void SyncControl::requestSyncPhase() {
- m_pChannel->getEngineBuffer()->requestSyncPhase();
+void SyncControl::requestSync() {
+ if (isPlaying() && m_pQuantize->toBool()) {
+ // only sync phase if the deck is playing and if quantize is enabled.
+ // this way the it is up to the user to decide if a seek is desired or not.
+ // This is helpfull if the beatgrid of the track doe not fit at the current
+ // payposition
+ m_pChannel->getEngineBuffer()->requestSyncPhase();
+ }
}
bool SyncControl::isPlaying() const {
- return m_pPlayButton->get() > 0.0;
+ return m_pPlayButton->toBool();
}
double SyncControl::getBeatDistance() const {
diff --git a/src/engine/sync/synccontrol.h b/src/engine/sync/synccontrol.h
index 7af10a3048..d5020cde64 100644
--- a/src/engine/sync/synccontrol.h
+++ b/src/engine/sync/synccontrol.h
@@ -31,7 +31,7 @@ class SyncControl : public EngineControl, public Syncable {
SyncMode getSyncMode() const;
void notifySyncModeChanged(SyncMode mode);
void notifyOnlyPlayingSyncable();
- void requestSyncPhase();
+ void requestSync();
bool isPlaying() const;
double getBeatDistance() const;
@@ -136,6 +136,7 @@ class SyncControl : public EngineControl, public Syncable {
ControlProxy* m_pPassthroughEnabled;
ControlProxy* m_pEjectButton;
ControlProxy* m_pSyncPhaseButton;
+ ControlProxy* m_pQuantize;
};
From 6ab15f8f999df41ea98f2247bef7e9296df796d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Wed, 30 May 2018 23:11:28 +0200
Subject: [PATCH 4/8] Added the test SyncPhaseToIfQuantize
---
src/test/enginesynctest.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/src/test/enginesynctest.cpp b/src/test/enginesynctest.cpp
index 1f6c1ad504..e8b08e59b9 100644
--- a/src/test/enginesynctest.cpp
+++ b/src/test/enginesynctest.cpp
@@ -1429,3 +1429,52 @@ TEST_F(EngineSyncTest, ZeroBpmNaturalRate) {
EXPECT_EQ(0.0,
ControlObject::getControl(ConfigKey(m_sGroup1, "local_bpm"))->get());
}
+
+TEST_F(EngineSyncTest, SyncPhaseToIfQuantize) {
+ auto pButtonSyncEnabled1 = std::make_unique<ControlProxy>(m_sGroup1, "sync_enabled");
+ auto pFileBpm1 = std::make_unique<ControlProxy>(m_sGroup1, "file_bpm");
+ ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->set(0.2);
+ pFileBpm1->set(130.0);
+ BeatsPointer pBeats1 = BeatFactory::makeBeatGrid(*m_pTrack1, 130, 0.0);
+ m_pTrack1->setBeats(pBeats1);
+
+ auto pButtonSyncEnabled2 = std::make_unique<ControlProxy>(m_sGroup2, "sync_enabled");
+ auto pFileBpm2 = std::make_unique<ControlProxy>(m_sGroup2, "file_bpm");
+ ControlObject::getControl(ConfigKey(m_sGroup2, "beat_distance"))->set(0.8);
+ ControlObject::getControl(ConfigKey(m_sGroup2, "rate"))->set(getRateSliderValue(1.0));
+ BeatsPointer pBeats2 = BeatFactory::makeBeatGrid(*m_pTrack2, 100, 0.0);
+ m_pTrack2->setBeats(pBeats2);
+ pFileBpm2->set(100.0);
+
+ ControlObject::getControl(ConfigKey(m_sGroup1, "play"))->set(1.0);
+ ControlObject::getControl(ConfigKey(m_sGroup2, "play"))->set(1.0);
+ ProcessBuffer();
+
+ // first test without quantisation
+ pButtonSyncEnabled1->set(1.0);
+ ProcessBuffer();
+ // 0.02 where set after testing both cases.
+ EXPECT_LT(0.02, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+ pButtonSyncEnabled1->set(0.0);
+
+ ControlObject::getControl(ConfigKey(m_sGroup1, "quantize"))->set(1.0);
+ ProcessBuffer();
+
+ pButtonSyncEnabled1->set(1.0);
+ ProcessBuffer();
+
+ // 0.07 where set by after testing both cases.
+ EXPECT_LT(0.07, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+ pButtonSyncEnabled1->set(0.0);
+ ControlObject::getControl(ConfigKey(m_sGroup1, "quantize"))->set(0.0);
+ ProcessBuffer();
+
+ ControlObject::getControl(ConfigKey(m_sGroup1, "beatsync_phase"))->set(1.0);
+ ProcessBuffer();
+
+ // 0.1162 where set by after testing both cases.
+ EXPECT_LT(0.1162, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+}
+
+
+
From 4853ddc7db9b26cb04ecafbaeac7adf37aadf190 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Thu, 31 May 2018 21:48:29 +0200
Subject: [PATCH 5/8] Restore quantize dependency of beatsync lost in a
previous commit
---
src/controllers/controlpickermenu.cpp | 1 +
src/engine/bpmcontrol.cpp | 11 ++++++++---
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp
index 674a3e0639..fbab5f67ab 100644
--- a/src/controllers/controlpickermenu.cpp
+++ b/src/controllers/controlpickermenu.cpp
@@ -115,6 +115,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent)
tr("Sync mode 3-state toggle (OFF, FOLLOWER, MASTER)"), syncMenu);
addDeckAndSamplerControl("beatsync", tr("Beat Sync One-Shot"),
tr("One-time beat sync (tempo and phase)"), syncMenu);
+ // TODO: phase depends on quantize
addDeckAndSamplerControl("beatsync_tempo", tr("Sync Tempo One-Shot"),
tr("One-time beat sync (tempo only)"), syncMenu);
addDeckAndSamplerControl("beatsync_phase", tr("Sync Phase One-Shot"),
diff --git a/src/engine/bpmcontrol.cpp b/src/engine/bpmcontrol.cpp
index 06dbaf9af5..eec368e449 100644
--- a/src/engine/bpmcontrol.cpp
+++ b/src/engine/bpmcontrol.cpp
@@ -234,10 +234,15 @@ void BpmControl::slotControlBeatSyncTempo(double v) {
void BpmControl::slotControlBeatSync(double v) {
if (!v) return;
+ if (!syncTempo()) {
+ // syncTempo failed, nothing else to do
+ return;
+ }
- // If the player is playing, and adjusting its tempo succeeded, adjust its
- // phase so that it plays in sync.
- if (syncTempo() && m_pPlayButton->get() > 0) {
+ // Also sync phase if quantize is enabled.
+ // this is used from controller scripts, where the latching behaviour of
+ // the sync_enable CO cannot be used
+ if (m_pPlayButton->toBool() && m_pQuantize->toBool()) {
getEngineBuffer()->requestSyncPhase();
}
}
From 8d82ec8a01893f693deef7c71fffcb8004a68340 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Fri, 1 Jun 2018 10:19:58 +0200
Subject: [PATCH 6/8] extend test for beatsync
---
src/test/enginesynctest.cpp | 49 ++++++++++++++++++++++++++++++++-------------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/src/test/enginesynctest.cpp b/src/test/enginesynctest.cpp
index e8b08e59b9..dac5d6e5bc 100644
--- a/src/test/enginesynctest.cpp
+++ b/src/test/enginesynctest.cpp
@@ -1432,48 +1432,69 @@ TEST_F(EngineSyncTest, ZeroBpmNaturalRate) {
TEST_F(EngineSyncTest, SyncPhaseToIfQuantize) {
auto pButtonSyncEnabled1 = std::make_unique<ControlProxy>(m_sGroup1, "sync_enabled");
+ auto pButtonBeatsync1 = std::make_unique<ControlProxy>(m_sGroup1, "beatsync");
+ auto pButtonBeatsyncPhase1 = std::make_unique<ControlProxy>(m_sGroup1, "beatsync_phase");
+
auto pFileBpm1 = std::make_unique<ControlProxy>(m_sGroup1, "file_bpm");
- ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->set(0.2);
+ ControlObject::set(ConfigKey(m_sGroup1, "beat_distance"), 0.2);
pFileBpm1->set(130.0);
BeatsPointer pBeats1 = BeatFactory::makeBeatGrid(*m_pTrack1, 130, 0.0);
m_pTrack1->setBeats(pBeats1);
auto pButtonSyncEnabled2 = std::make_unique<ControlProxy>(m_sGroup2, "sync_enabled");
auto pFileBpm2 = std::make_unique<ControlProxy>(m_sGroup2, "file_bpm");
- ControlObject::getControl(ConfigKey(m_sGroup2, "beat_distance"))->set(0.8);
- ControlObject::getControl(ConfigKey(m_sGroup2, "rate"))->set(getRateSliderValue(1.0));
+ ControlObject::set(ConfigKey(m_sGroup2, "beat_distance"), 0.8);
+ ControlObject::set(ConfigKey(m_sGroup2, "rate"), getRateSliderValue(1.0));
BeatsPointer pBeats2 = BeatFactory::makeBeatGrid(*m_pTrack2, 100, 0.0);
m_pTrack2->setBeats(pBeats2);
pFileBpm2->set(100.0);
- ControlObject::getControl(ConfigKey(m_sGroup1, "play"))->set(1.0);
- ControlObject::getControl(ConfigKey(m_sGroup2, "play"))->set(1.0);
+ ControlObject::set(ConfigKey(m_sGroup1, "play"), 1.0);
+ ControlObject::set(ConfigKey(m_sGroup2, "play"), 1.0);
ProcessBuffer();
// first test without quantisation
pButtonSyncEnabled1->set(1.0);
ProcessBuffer();
- // 0.02 where set after testing both cases.
- EXPECT_LT(0.02, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+ ASSERT_DOUBLE_EQ(0.025155996658969195, ControlObject::get(ConfigKey(m_sGroup1, "beat_distance")));
pButtonSyncEnabled1->set(0.0);
- ControlObject::getControl(ConfigKey(m_sGroup1, "quantize"))->set(1.0);
+ ControlObject::set(ConfigKey(m_sGroup1, "quantize"), 1.0);
ProcessBuffer();
pButtonSyncEnabled1->set(1.0);
ProcessBuffer();
- // 0.07 where set by after testing both cases.
- EXPECT_LT(0.07, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+ ASSERT_DOUBLE_EQ(0.077604743399185772, ControlObject::get(ConfigKey(m_sGroup1, "beat_distance")));
pButtonSyncEnabled1->set(0.0);
- ControlObject::getControl(ConfigKey(m_sGroup1, "quantize"))->set(0.0);
+ ControlObject::set(ConfigKey(m_sGroup1, "quantize"), 0.0);
+ ProcessBuffer();
+
+ pButtonBeatsyncPhase1->set(1.0);
ProcessBuffer();
- ControlObject::getControl(ConfigKey(m_sGroup1, "beatsync_phase"))->set(1.0);
+ // 0.11632139450713055 in case "beatsync_phase" fails
+ ASSERT_DOUBLE_EQ(0.11610813658949772, ControlObject::get(ConfigKey(m_sGroup1, "beat_distance")));
+
+
+ ControlObject::set(ConfigKey(m_sGroup1, "beat_distance"), 0.2);
+ ControlObject::set(ConfigKey(m_sGroup1, "rate"), 1.0);
+ ProcessBuffer();
+ pButtonBeatsync1->set(1.0);
ProcessBuffer();
- // 0.1162 where set by after testing both cases.
- EXPECT_LT(0.1162, ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->get());
+ // 0.15480806100370784 in case quantize is enabled
+ ASSERT_DOUBLE_EQ(0.16263690384739582, ControlObject::get(ConfigKey(m_sGroup1, "beat_distance")));
+
+ ProcessBuffer();
+
+ ControlObject::set(ConfigKey(m_sGroup1, "quantize"), 1.0);
+ pButtonBeatsync1->set(1.0);
+ ProcessBuffer();
+
+ // 0.19933910991038406 in case quantize is disabled
+ ASSERT_DOUBLE_EQ(0.19350798541791794, ControlObject::get(ConfigKey(m_sGroup1, "beat_distance")));
+
}
From f2437fcd27671d3c87bc0eedac7e90aca476a368 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Fri, 1 Jun 2018 10:39:43 +0200
Subject: [PATCH 7/8] Change right click sync to beatsync_phase, for the case
permanent adjustment via quantize is not deired.
---
res/skins/Deere/deck_tempo_column.xml | 2 +-
res/skins/LateNight/deck.xml | 2 +-
res/skins/Shade/deck.xml | 2 +-
res/skins/Tango/rate_pitch_key.xml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/res/skins/Deere/deck_tempo_column.xml b/res/skins/Deere/deck_tempo_column.xml
index d7de70df24..0ecda823ea 100644
--- a/res/skins/Deere/deck_tempo_column.xml
+++ b/res/skins/Deere/deck_tempo_column.xml
@@ -28,7 +28,7 @@
<SetVariable name="state_1_pressed"></SetVariable>
<SetVariable name="state_1_unpressed"></SetVariable>
<SetVariable name="left_connection_control"><Variable name="group"/>,sync_enabled</SetVariable>
- <SetVariable name="right_connection_control"><Variable name="group"/>,beatsync</SetVariable>
+ <SetVariable name="right_connection_control"><Variable name="group"/>,beatsync_phase</SetVariable>
</Template>
<WidgetGroup>
diff --git a/res/skins/LateNight/deck.xml b/res/skins/LateNight/deck.xml
index 245b7d6509..7791f9cabd 100644
--- a/res/skins/LateNight/deck.xml
+++ b/res/skins/LateNight/deck.xml
@@ -281,7 +281,7 @@
<ButtonState>LeftButton</ButtonState>
</Connection>
<Connection>
- <ConfigKey><Variable name="group"/>,beatsync</ConfigKey>
+ <ConfigKey><Variable name="group"/>,beatsync_phase</ConfigKey>
<ButtonState>RightButton</ButtonState>
</Connection>
</PushButton>
diff --git a/res/skins/Shade/deck.xml b/res/skins/Shade/deck.xml
index 494901128a..368ab2c7c6 100644
--- a/res/skins/Shade/deck.xml
+++ b/res/skins/Shade/deck.xml
@@ -450,7 +450,7 @@
<ButtonState>LeftButton</ButtonState>
</Connection>
<Connection>
- <ConfigKey>[Channel<Variable name="channum"/>],beatsync</ConfigKey>
+ <ConfigKey>[Channel<Variable name="channum"/>],beatsync_phase</ConfigKey>
<ButtonState>RightButton</ButtonState>
</Connection>
</PushButton>
diff --git a/res/skins/Tango/rate_pitch_key.xml b/res/skins/Tango/rate_pitch_key.xml
index 7af6103531..9da83e13fa 100644
--- a/res/skins/Tango/rate_pitch_key.xml
+++ b/res/skins/Tango/rate_pitch_key.xml
@@ -113,7 +113,7 @@ Variables:
<SetVariable name="ObjectName">SyncButtonOverlay</SetVariable>
<SetVariable name="Size">50f,18min</SetVariable>
<SetVariable name="ConfigKey"><Variable name="group"/>,sync_enabled</SetVariable>
- <SetVariable name="ConfigKeyRight"><Variable name="group"/>,rate_set_default</SetVariable>
+ <SetVariable name="ConfigKeyRight"><Variable name="group"/>,beatsync_phase</SetVariable>
</Template>
<Number>
<ObjectName>BpmLabel</ObjectName>
From 55715f11b36b5616c114b1ff9a9174b34af36d4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Fri, 8 Jun 2018 18:04:40 +0200
Subject: [PATCH 8/8] fix typos
---
src/engine/sync/synccontrol.cpp | 4 ++--
src/test/enginesynctest.cpp | 4 +---
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/engine/sync/synccontrol.cpp b/src/engine/sync/synccontrol.cpp
index 89fded5706..dc98717b14 100644
--- a/src/engine/sync/synccontrol.cpp
+++ b/src/engine/sync/synccontrol.cpp
@@ -167,8 +167,8 @@ void SyncControl::requestSync() {
if (isPlaying() && m_pQuantize->toBool()) {
// only sync phase if the deck is playing and if quantize is enabled.
// this way the it is up to the user to decide if a seek is desired or not.
- // This is helpfull if the beatgrid of the track doe not fit at the current
- // payposition
+ // This is helpful if the beatgrid of the track doe not fit at the current
+ // playposition
m_pChannel->getEngineBuffer()->requestSyncPhase();
}
}
diff --git a/src/test/enginesynctest.cpp b/src/test/enginesynctest.cpp
index dac5d6e5bc..ca5b6db8a5 100644
--- a/src/test/enginesynctest.cpp
+++ b/src/test/enginesynctest.cpp
@@ -1430,7 +1430,7 @@ TEST_F(EngineSyncTest, ZeroBpmNaturalRate) {
ControlObject::getControl(ConfigKey(m_sGroup1, "local_bpm"))->get());
}
-TEST_F(EngineSyncTest, SyncPhaseToIfQuantize) {
+TEST_F(EngineSyncTest, QuantizeImpliesSyncPhase) {
auto pButtonSyncEnabled1 = std::make_unique<ControlProxy>(m_sGroup1, "sync_enabled");
auto pButtonBeatsync1 = std::make_unique<ControlProxy>(m_sGroup1, "beatsync");
auto pButtonBeatsyncPhase1 = std::make_unique<ControlProxy>(m_sGroup1, "beatsync_phase");
@@ -1497,5 +1497,3 @@ TEST_F(EngineSyncTest, SyncPhaseToIfQuantize) {
}
-
-

View File

@@ -1,68 +0,0 @@
From b677c529d756f32c52761abeed82b3e58bb2e5a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Reu=C3=9Fe?= <seb@wirrsal.net>
Date: Sun, 6 May 2018 12:06:07 +0200
Subject: [PATCH 1/2] =?UTF-8?q?components.js:=20Don=E2=80=99t=20clobber=20?=
=?UTF-8?q?component=20container=20groups?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Since forEachComponent evaluates callbacks within the context of the current
component container, this.currentDeck will be undefined after we recurse into
a component container inside of the current deck.
Instead, we now propagate the current deck downwards by referring to the
argument setCurrentDeck was invoked with.
---
res/controllers/midi-components-0.0.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/res/controllers/midi-components-0.0.js b/res/controllers/midi-components-0.0.js
index 3f7f3b3dac..8ab3d2b8d0 100644
--- a/res/controllers/midi-components-0.0.js
+++ b/res/controllers/midi-components-0.0.js
@@ -578,11 +578,11 @@
this.currentDeck = newGroup;
this.reconnectComponents(function (component) {
if (component.group.search(script.channelRegEx) !== -1) {
- component.group = this.currentDeck;
+ component.group = newGroup;
} else if (component.group.search(script.eqRegEx) !== -1) {
- component.group = '[EqualizerRack1_' + this.currentDeck + '_Effect1]';
+ component.group = '[EqualizerRack1_' + newGroup + '_Effect1]';
} else if (component.group.search(script.quickEffectRegEx) !== -1) {
- component.group = '[QuickEffectRack1_' + this.currentDeck + ']';
+ component.group = '[QuickEffectRack1_' + newGroup + ']';
}
// Do not alter the Component's group if it does not match any of those RegExs.
From 5f604c0b88fd2d0d18e4d97fdb7c781cfd85f7b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Reu=C3=9Fe?= <seb@wirrsal.net>
Date: Sun, 6 May 2018 14:51:48 +0200
Subject: [PATCH 2/2] =?UTF-8?q?components.js:=20Be=20more=20robust=20in=20?=
=?UTF-8?q?=E2=80=98setCurrentDeck=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
component.group might be unset, in which case scripts will fail silently.
Lets guard against this case.
---
res/controllers/midi-components-0.0.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/res/controllers/midi-components-0.0.js b/res/controllers/midi-components-0.0.js
index 8ab3d2b8d0..4e5dec43d1 100644
--- a/res/controllers/midi-components-0.0.js
+++ b/res/controllers/midi-components-0.0.js
@@ -577,7 +577,8 @@
setCurrentDeck: function (newGroup) {
this.currentDeck = newGroup;
this.reconnectComponents(function (component) {
- if (component.group.search(script.channelRegEx) !== -1) {
+ if (component.group === undefined
+ || component.group.search(script.channelRegEx) !== -1) {
component.group = newGroup;
} else if (component.group.search(script.eqRegEx) !== -1) {
component.group = '[EqualizerRack1_' + newGroup + '_Effect1]';

View File

@@ -1,127 +0,0 @@
From cc34144fbad992f0502db66a7ada7ae16683a81e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Mon, 16 Apr 2018 23:41:14 +0200
Subject: [PATCH 1/2] fix debug assert using empty pixmap source
---
src/widget/wpixmapstore.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/widget/wpixmapstore.cpp b/src/widget/wpixmapstore.cpp
index b2648337c0..36d2418d9e 100644
--- a/src/widget/wpixmapstore.cpp
+++ b/src/widget/wpixmapstore.cpp
@@ -16,6 +16,9 @@ QSharedPointer<ImgSource> WPixmapStore::m_loader
PaintablePointer WPixmapStore::getPaintable(PixmapSource source,
Paintable::DrawMode mode,
double scaleFactor) {
+ if (source.isEmpty()) {
+ return PaintablePointer();
+ }
QString key = source.getId() + QString::number(mode) + QString::number(scaleFactor);
// See if we have a cached value for the pixmap.
From 920a00b59b90c36f949d04e8dbbbdf16e3d4364a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Tue, 17 Apr 2018 00:10:21 +0200
Subject: [PATCH 2/2] Fix false postive restart request when changing skin.
---
src/preferences/dialog/dlgprefinterface.cpp | 24 +++++-------------------
src/preferences/dialog/dlgprefinterface.h | 2 --
2 files changed, 5 insertions(+), 21 deletions(-)
diff --git a/src/preferences/dialog/dlgprefinterface.cpp b/src/preferences/dialog/dlgprefinterface.cpp
index 02dc8b5b01..95d33da72b 100644
--- a/src/preferences/dialog/dlgprefinterface.cpp
+++ b/src/preferences/dialog/dlgprefinterface.cpp
@@ -39,13 +39,11 @@ DlgPrefInterface::DlgPrefInterface(QWidget * parent, MixxxMainWindow * mixxx,
// Iterate through the available locales and add them to the combobox
// Borrowed following snippet from http://qt-project.org/wiki/How_to_create_a_multi_language_application
QString translationsFolder = m_pConfig->getResourcePath() + "translations/";
- QString currentLocale = pConfig->getValueString(ConfigKey("[Config]", "Locale"));
QDir translationsDir(translationsFolder);
QStringList fileNames = translationsDir.entryList(QStringList("mixxx_*.qm"));
fileNames.push_back("mixxx_en_US.qm"); // add source language as a fake value
- bool indexFlag = false; // it'll indicate if the selected index changed.
for (int i = 0; i < fileNames.size(); ++i) {
// Extract locale from filename
QString locale = fileNames[i];
@@ -60,19 +58,9 @@ DlgPrefInterface::DlgPrefInterface(QWidget * parent, MixxxMainWindow * mixxx,
}
lang = QString("%1 (%2)").arg(lang).arg(country);
ComboBoxLocale->addItem(lang, locale); // locale as userdata (for storing to config)
- if (locale == currentLocale) { // Set the currently selected locale
- ComboBoxLocale->setCurrentIndex(ComboBoxLocale->count() - 1);
- indexFlag = true;
- }
}
ComboBoxLocale->model()->sort(0); // Sort languages list
-
ComboBoxLocale->insertItem(0, "System", ""); // System default locale - insert at the top
- if (!indexFlag) { // if selectedIndex didn't change - select system default
- ComboBoxLocale->setCurrentIndex(0);
- }
- connect(ComboBoxLocale, SIGNAL(activated(int)),
- this, SLOT(slotSetLocale(int)));
//
// Skin configurations
@@ -278,10 +266,6 @@ void DlgPrefInterface::slotResetToDefaults() {
radioButtonKeepMetaknobPosition->setChecked(true);
}
-void DlgPrefInterface::slotSetLocale(int pos) {
- m_locale = ComboBoxLocale->itemData(pos).toString();
-}
-
void DlgPrefInterface::slotSetScaleFactor(double newValue) {
// The spinbox shows a percentage, but Mixxx stores a multiplication factor
// with 1.00 as no change.
@@ -345,7 +329,9 @@ void DlgPrefInterface::slotApply() {
m_pConfig->set(ConfigKey("[Config]", "ResizableSkin"), m_skin);
m_pConfig->set(ConfigKey("[Config]", "Scheme"), m_colorScheme);
- m_pConfig->set(ConfigKey("[Config]", "Locale"), m_locale);
+ QString locale = ComboBoxLocale->itemData(
+ ComboBoxLocale->currentIndex()).toString();
+ m_pConfig->set(ConfigKey("[Config]", "Locale"), locale);
m_pConfig->setValue(
ConfigKey("[Config]", "ScaleFactorAuto"), m_bUseAutoScaleFactor);
@@ -373,10 +359,10 @@ void DlgPrefInterface::slotApply() {
static_cast<mixxx::ScreenSaverPreference>(screensaverComboBoxState));
}
- if (m_locale != m_localeOnUpdate) {
+ if (locale != m_localeOnUpdate) {
notifyRebootNecessary();
// hack to prevent showing the notification when pressing "Okay" after "Apply"
- m_localeOnUpdate = m_locale;
+ m_localeOnUpdate = locale;
}
if (m_bRebootMixxxView) {
diff --git a/src/preferences/dialog/dlgprefinterface.h b/src/preferences/dialog/dlgprefinterface.h
index 6496d8c148..86a896c940 100644
--- a/src/preferences/dialog/dlgprefinterface.h
+++ b/src/preferences/dialog/dlgprefinterface.h
@@ -52,7 +52,6 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg
void slotSetSkin(int);
void slotSetScheme(int);
void slotUpdateSchemes();
- void slotSetLocale(int);
void slotSetScaleFactor(double newValue);
void slotSetScaleFactorAuto(bool checked);
@@ -76,7 +75,6 @@ class DlgPrefInterface : public DlgPreferencePage, public Ui::DlgPrefControlsDlg
QString m_skin;
QString m_skinOnUpdate;
QString m_colorScheme;
- QString m_locale;
QString m_localeOnUpdate;
mixxx::TooltipsPreference m_tooltipMode;
double m_dScaleFactorAuto;

View File

@@ -1,26 +0,0 @@
From 8cc61cb9fc3906a8ecad39d809290f6a2c3d3741 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sat, 5 May 2018 14:08:00 +0200
Subject: [PATCH] Deere: Add gain knob to expanded sampler view
---
res/skins/Deere/sampler_controls_row.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/res/skins/Deere/sampler_controls_row.xml b/res/skins/Deere/sampler_controls_row.xml
index 2514c4d833..202d3ab336 100644
--- a/res/skins/Deere/sampler_controls_row.xml
+++ b/res/skins/Deere/sampler_controls_row.xml
@@ -77,6 +77,12 @@
<Layout>horizontal</Layout>
<ObjectName>ButtonGrid</ObjectName>
<Children>
+ <Template src="skin:knob.xml">
+ <SetVariable name="TooltipId">pregain</SetVariable>
+ <SetVariable name="control">pregain</SetVariable>
+ <SetVariable name="color">green</SetVariable>
+ </Template>
+
<Template src="skin:left_right_1state_button.xml">
<SetVariable name="TooltipId">beatsync_beatsync_tempo</SetVariable>
<SetVariable name="ObjectName">BeatsyncButton</SetVariable>

View File

@@ -1,330 +0,0 @@
From ffd86c7fa83b0b64814eb488af4807bcfae4c51f Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 15 May 2018 14:34:01 +0200
Subject: [PATCH 1/2] Denon MC6000MK2: Delete unused script code for hotcues
---
res/controllers/Denon-MC6000MK2-scripts.js | 30 ------------------------------
1 file changed, 30 deletions(-)
diff --git a/res/controllers/Denon-MC6000MK2-scripts.js b/res/controllers/Denon-MC6000MK2-scripts.js
index 7f1189ce9c..0ee05e4cd2 100644
--- a/res/controllers/Denon-MC6000MK2-scripts.js
+++ b/res/controllers/Denon-MC6000MK2-scripts.js
@@ -333,27 +333,6 @@ DenonMC6000MK2.disconnectControls = function () {
};
-////////////////////////////////////////////////////////////////////////
-// Hotcues //
-////////////////////////////////////////////////////////////////////////
-
-DenonMC6000MK2.Hotcue = function (deck, number, midiLedValue, midiDimmerLedValue) {
- this.deck = deck;
- this.number = number;
- this.ctrlPrefix = "hotcue_" + number;
- this.midiLedValue = midiLedValue;
- this.midiDimmerLedValue = midiDimmerLedValue;
-};
-
-DenonMC6000MK2.Hotcue.prototype.connectControls = function (callbackFunc) {
- this.deck.connectControl(this.ctrlPrefix + "_enabled", callbackFunc);
-};
-
-DenonMC6000MK2.Hotcue.prototype.isEnabled = function () {
- return this.deck.getValue(this.ctrlPrefix + "_enabled");
-};
-
-
////////////////////////////////////////////////////////////////////////
// Samplers //
////////////////////////////////////////////////////////////////////////
@@ -484,11 +463,6 @@ DenonMC6000MK2.OldDeck = function (number, midiChannel) {
this.setValue("rate_dir", -1);
this.vinylMode = undefined;
this.syncMode = undefined;
- this.hotcues = [];
- this.hotcues[1] = new DenonMC6000MK2.Hotcue(this, 1, 0x11, 0x12);
- this.hotcues[2] = new DenonMC6000MK2.Hotcue(this, 2, 0x13, 0x14);
- this.hotcues[3] = new DenonMC6000MK2.Hotcue(this, 3, 0x15, 0x16);
- this.hotcues[4] = new DenonMC6000MK2.Hotcue(this, 4, 0x17, 0x18);
};
/* Shift */
@@ -934,10 +908,6 @@ DenonMC6000MK2.OldDeck.prototype.connectControls = function () {
this.connectControl("loop_end_position", DenonMC6000MK2.ctrlLoopEndPosition);
DenonMC6000MK2.leftSide.efxUnit.connectDeckControls(this, DenonMC6000MK2.leftSide.efxUnit.ctrlDeck);
DenonMC6000MK2.rightSide.efxUnit.connectDeckControls(this, DenonMC6000MK2.rightSide.efxUnit.ctrlDeck);
- this.hotcues[1].connectControls(DenonMC6000MK2.ctrlHotcue1);
- this.hotcues[2].connectControls(DenonMC6000MK2.ctrlHotcue2);
- this.hotcues[3].connectControls(DenonMC6000MK2.ctrlHotcue3);
- this.hotcues[4].connectControls(DenonMC6000MK2.ctrlHotcue4);
// default settings
this.enableKeyLock();
this.enableVinylMode();
From 14626e909bc98b97bd1d24a09fbcc99b557f5547 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 15 May 2018 15:23:14 +0200
Subject: [PATCH 2/2] Denon MC6000MK2: Fix looping by capturing button release
events
---
res/controllers/Denon-MC6000MK2-scripts.js | 33 +++++----
res/controllers/Denon-MC6000MK2.midi.xml | 108 ++++++++++++++++++++++++-----
2 files changed, 108 insertions(+), 33 deletions(-)
diff --git a/res/controllers/Denon-MC6000MK2-scripts.js b/res/controllers/Denon-MC6000MK2-scripts.js
index 0ee05e4cd2..fccb95cae2 100644
--- a/res/controllers/Denon-MC6000MK2-scripts.js
+++ b/res/controllers/Denon-MC6000MK2-scripts.js
@@ -767,14 +767,16 @@ DenonMC6000MK2.OldDeck.prototype.hasLoopEnd = function () {
};
DenonMC6000MK2.OldDeck.prototype.hasLoop = function () {
- return this.hasLoopStart() && this.hasLoopEnd();
+ return this.hasLoopStart() && this.hasLoopEnd() && this.getValue("loop_start_position") < this.getValue("loop_end_position");
};
DenonMC6000MK2.OldDeck.prototype.deleteLoopStart = function () {
+ this.setValue("loop_in", false);
this.setValue("loop_start_position", DenonMC6000MK2.MIXXX_LOOP_POSITION_UNDEFINED);
};
DenonMC6000MK2.OldDeck.prototype.deleteLoopEnd = function () {
+ this.setValue("loop_out", false);
this.setValue("loop_end_position", DenonMC6000MK2.MIXXX_LOOP_POSITION_UNDEFINED);
};
@@ -861,11 +863,13 @@ DenonMC6000MK2.OldDeck.prototype.onLoopCutPlusButton = function (isButtonPressed
};
DenonMC6000MK2.OldDeck.prototype.updateLoopLeds = function (value) {
- this.loopInLed.setStateBoolean(this.hasLoopStart());
- this.loopOutLed.setStateBoolean(this.hasLoopEnd());
if (this.getValue("loop_enabled")) {
+ this.loopInLed.setTriState(DenonMC6000MK2.TRI_LED_BLINK);
+ this.loopOutLed.setTriState(DenonMC6000MK2.TRI_LED_BLINK);
this.autoLoopLed.setTriState(DenonMC6000MK2.TRI_LED_BLINK);
} else {
+ this.loopInLed.setStateBoolean(this.hasLoopStart());
+ this.loopOutLed.setStateBoolean(this.hasLoopEnd());
this.autoLoopDimmerLed.setStateBoolean(this.hasLoop());
}
};
@@ -1418,18 +1422,6 @@ DenonMC6000MK2.recvAutoLoopButton = function (channel, control, value, status, g
deck.onAutoLoopButton(isButtonPressed);
};
-DenonMC6000MK2.recvLoopInButton = function (channel, control, value, status, group) {
- var isButtonPressed = DenonMC6000MK2.isButtonPressed(value);
- var deck = DenonMC6000MK2.getDeckByGroup(group);
- deck.onLoopInButton(isButtonPressed);
-};
-
-DenonMC6000MK2.recvLoopOutButton = function (channel, control, value, status, group) {
- var isButtonPressed = DenonMC6000MK2.isButtonPressed(value);
- var deck = DenonMC6000MK2.getDeckByGroup(group);
- deck.onLoopOutButton(isButtonPressed);
-};
-
DenonMC6000MK2.recvLoopCutMinusButton = function (channel, control, value, status, group) {
var isButtonPressed = DenonMC6000MK2.isButtonPressed(value);
var deck = DenonMC6000MK2.getDeckByGroup(group);
@@ -1708,6 +1700,17 @@ DenonMC6000MK2.Deck.prototype.shiftButtonInput = function (channel, control, val
this.side.shiftButtonInput(channel, control, value, status);
};
+DenonMC6000MK2.Deck.prototype.loopInButtonInput = function (channel, control, value, status, group) {
+ var isButtonPressed = DenonMC6000MK2.isButtonPressed(value);
+ var deck = DenonMC6000MK2.getDeckByGroup(group);
+ deck.onLoopInButton(isButtonPressed);
+};
+
+DenonMC6000MK2.Deck.prototype.loopOutButtonInput = function (channel, control, value, status, group) {
+ var isButtonPressed = DenonMC6000MK2.isButtonPressed(value);
+ var deck = DenonMC6000MK2.getDeckByGroup(group);
+ deck.onLoopOutButton(isButtonPressed);
+};
////////////////////////////////////////////////////////////////////////
// Mixxx Callback Functions //
diff --git a/res/controllers/Denon-MC6000MK2.midi.xml b/res/controllers/Denon-MC6000MK2.midi.xml
index 7f175f0aee..7295201670 100644
--- a/res/controllers/Denon-MC6000MK2.midi.xml
+++ b/res/controllers/Denon-MC6000MK2.midi.xml
@@ -769,9 +769,27 @@
<normal/>
</options>
</control>
+ <control>
+ <group>[Channel2]</group>
+ <key>DenonMC6000MK2.rightDeck2.loopOutButtonInput</key>
+ <status>0x92</status>
+ <midino>0x39</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel4]</group>
+ <key>DenonMC6000MK2.rightDeck4.loopOutButtonInput</key>
+ <status>0x93</status>
+ <midino>0x39</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
<control>
<group>[Channel1]</group>
- <key>DenonMC6000MK2.recvLoopOutButton</key>
+ <key>DenonMC6000MK2.leftDeck1.loopOutButtonInput</key>
<status>0x90</status>
<midino>0x39</midino>
<options>
@@ -780,7 +798,7 @@
</control>
<control>
<group>[Channel3]</group>
- <key>DenonMC6000MK2.recvLoopOutButton</key>
+ <key>DenonMC6000MK2.leftDeck3.loopOutButtonInput</key>
<status>0x91</status>
<midino>0x39</midino>
<options>
@@ -789,8 +807,8 @@
</control>
<control>
<group>[Channel2]</group>
- <key>DenonMC6000MK2.recvLoopOutButton</key>
- <status>0x92</status>
+ <key>DenonMC6000MK2.rightDeck2.loopOutButtonInput</key>
+ <status>0x82</status>
<midino>0x39</midino>
<options>
<script-binding/>
@@ -798,8 +816,8 @@
</control>
<control>
<group>[Channel4]</group>
- <key>DenonMC6000MK2.recvLoopOutButton</key>
- <status>0x93</status>
+ <key>DenonMC6000MK2.rightDeck4.loopOutButtonInput</key>
+ <status>0x83</status>
<midino>0x39</midino>
<options>
<script-binding/>
@@ -807,34 +825,61 @@
</control>
<control>
<group>[Channel1]</group>
- <key>DenonMC6000MK2.recvLoopInButton</key>
- <status>0x90</status>
- <midino>0x37</midino>
+ <key>DenonMC6000MK2.leftDeck1.loopOutButtonInput</key>
+ <status>0x80</status>
+ <midino>0x39</midino>
<options>
<script-binding/>
</options>
</control>
<control>
<group>[Channel3]</group>
- <key>DenonMC6000MK2.recvLoopInButton</key>
- <status>0x91</status>
+ <key>DenonMC6000MK2.leftDeck3.loopOutButtonInput</key>
+ <status>0x81</status>
+ <midino>0x39</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel2]</group>
+ <key>DenonMC6000MK2.rightDeck2.loopInButtonInput</key>
+ <status>0x82</status>
<midino>0x37</midino>
<options>
<script-binding/>
</options>
</control>
<control>
- <group>[EqualizerRack1_[Channel1]_Effect1]</group>
- <key>parameter1</key>
- <status>0xB0</status>
- <midino>0x04</midino>
+ <group>[Channel4]</group>
+ <key>DenonMC6000MK2.rightDeck4.loopInButtonInput</key>
+ <status>0x83</status>
+ <midino>0x37</midino>
<options>
- <normal/>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel1]</group>
+ <key>DenonMC6000MK2.leftDeck1.loopInButtonInput</key>
+ <status>0x80</status>
+ <midino>0x37</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel3]</group>
+ <key>DenonMC6000MK2.leftDeck3.loopInButtonInput</key>
+ <status>0x81</status>
+ <midino>0x37</midino>
+ <options>
+ <script-binding/>
</options>
</control>
<control>
<group>[Channel2]</group>
- <key>DenonMC6000MK2.recvLoopInButton</key>
+ <key>DenonMC6000MK2.rightDeck2.loopInButtonInput</key>
<status>0x92</status>
<midino>0x37</midino>
<options>
@@ -843,13 +888,40 @@
</control>
<control>
<group>[Channel4]</group>
- <key>DenonMC6000MK2.recvLoopInButton</key>
+ <key>DenonMC6000MK2.rightDeck4.loopInButtonInput</key>
<status>0x93</status>
<midino>0x37</midino>
<options>
<script-binding/>
</options>
</control>
+ <control>
+ <group>[Channel1]</group>
+ <key>DenonMC6000MK2.leftDeck1.loopInButtonInput</key>
+ <status>0x90</status>
+ <midino>0x37</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel3]</group>
+ <key>DenonMC6000MK2.leftDeck3.loopInButtonInput</key>
+ <status>0x91</status>
+ <midino>0x37</midino>
+ <options>
+ <script-binding/>
+ </options>
+ </control>
+ <control>
+ <group>[EqualizerRack1_[Channel1]_Effect1]</group>
+ <key>parameter1</key>
+ <status>0xB0</status>
+ <midino>0x04</midino>
+ <options>
+ <normal/>
+ </options>
+ </control>
<control>
<group>[Channel2]</group>
<key>DenonMC6000MK2.recvXfaderAssignThruButton</key>

View File

@@ -1,124 +0,0 @@
From 901b65b785f6c55e7b484350fea02b6d328e8094 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 25 Apr 2018 11:17:00 +0200
Subject: [PATCH 1/2] Windows MF: Fix rounding errors when seeking and reading
---
.../soundsourcemediafoundation.h | 37 ++++++++++++----------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h
index 7e1abf4da5..e9a8d608f1 100755
--- a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h
+++ b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h
@@ -17,37 +17,42 @@ class StreamUnitConverter final {
public:
StreamUnitConverter()
: m_pAudioSource(nullptr),
- m_streamUnitsPerFrame(0.0),
- m_toFrameIndexBias(0) {
+ m_fromSampleFramesToStreamUnits(0),
+ m_fromStreamUnitsToSampleFrames(0) {
}
explicit StreamUnitConverter(const AudioSource* pAudioSource)
: m_pAudioSource(pAudioSource),
- m_streamUnitsPerFrame(double(kStreamUnitsPerSecond) / double(pAudioSource->sampleRate())),
- m_toFrameIndexBias(kStreamUnitsPerSecond / pAudioSource->sampleRate() / 2) {
- // The stream units should actually be much shorter
- // than the frames to minimize jitter. Even a frame
- // at 192 kHz has a length of about 5000 ns >> 100 ns.
- DEBUG_ASSERT(m_streamUnitsPerFrame >= 50);
- DEBUG_ASSERT(m_toFrameIndexBias > 0);
+ m_fromSampleFramesToStreamUnits(double(kStreamUnitsPerSecond) / double(pAudioSource->sampleRate())),
+ m_fromStreamUnitsToSampleFrames(double(pAudioSource->sampleRate()) / double(kStreamUnitsPerSecond)){
+ // The stream units should actually be much shorter than
+ // sample frames to minimize jitter and rounding. Even a
+ // frame at 192 kHz has a length of about 5000 ns >> 100 ns.
+ DEBUG_ASSERT(m_fromStreamUnitsToSampleFrames >= 50);
}
LONGLONG fromFrameIndex(SINT frameIndex) const {
+ DEBUG_ASSERT(m_fromSampleFramesToStreamUnits > 0);
// Used for seeking, so we need to round down to hit the
// corresponding stream unit where the given stream unit
- // starts
- return floor((frameIndex - m_pAudioSource->frameIndexMin()) * m_streamUnitsPerFrame);
+ // starts. The reader will skip samples until it reaches
+ // the actual target position for reading.
+ const SINT frameIndexOffset = frameIndex - m_pAudioSource->frameIndexMin();
+ return static_cast<LONGLONG>(floor(frameIndexOffset * m_fromSampleFramesToStreamUnits));
}
SINT toFrameIndex(LONGLONG streamPos) const {
- // NOTE(uklotzde): Add m_toFrameIndexBias to account for rounding errors
- return m_pAudioSource->frameIndexMin() +
- static_cast<SINT>(floor((streamPos + m_toFrameIndexBias) / m_streamUnitsPerFrame));
+ DEBUG_ASSERT(m_fromStreamUnitsToSampleFrames > 0);
+ // The stream reports positions in units of 100ns. We have
+ // to round(!) this value to obtain the actual position in
+ // sample frames.
+ const SINT frameIndexOffset = static_cast<SINT>(round(streamPos * m_fromStreamUnitsToSampleFrames));
+ return m_pAudioSource->frameIndexMin() + frameIndexOffset;
}
private:
const AudioSource* m_pAudioSource;
- double m_streamUnitsPerFrame;
- SINT m_toFrameIndexBias;
+ double m_fromSampleFramesToStreamUnits;
+ double m_fromStreamUnitsToSampleFrames;
};
class SoundSourceMediaFoundation: public mixxx::SoundSourcePlugin {
From e9474dcdf752d51fc3390ff6851c02f8e249fb4d Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 25 Apr 2018 16:24:35 +0200
Subject: [PATCH 2/2] Windows MF: Validate the current position while reading
...and avoid to update if not necessary to prevent rounding errors.
Just log any suspicious values.
---
.../soundsourcemediafoundation.cpp | 29 +++++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp
index 3ed0d3b5e8..8eac78220d 100755
--- a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp
+++ b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp
@@ -351,10 +351,31 @@ ReadableSampleFrames SoundSourceMediaFoundation::readSampleFramesClamped(
}
DEBUG_ASSERT(pSample != nullptr);
SINT readerFrameIndex = m_streamUnitConverter.toFrameIndex(streamPos);
- DEBUG_ASSERT(
- (m_currentFrameIndex == kUnknownFrameIndex) || // unknown position after seeking
- (m_currentFrameIndex == readerFrameIndex));
- m_currentFrameIndex = readerFrameIndex;
+ if (m_currentFrameIndex == kUnknownFrameIndex) {
+ // Unknown position after seeking
+ m_currentFrameIndex = readerFrameIndex;
+ /*
+ kLogger.debug()
+ << "Stream position (in sample frames) after seeking:"
+ << "target =" << writableSampleFrames.frameIndexRange().end()
+ << "current =" << readerFrameIndex;
+ */
+ } else {
+ // Both positions should match, otherwise readerFrameIndex
+ // is inaccurate due to rounding errors after conversion from
+ // stream units to frames! But if this ever happens we better
+ // trust m_currentFrameIndex that is continuously updated while
+ // reading in forward direction.
+ VERIFY_OR_DEBUG_ASSERT(m_currentFrameIndex == readerFrameIndex) {
+ kLogger.debug()
+ << "streamPos [100 ns] =" << streamPos
+ << ", sampleRate [Hz] =" << sampleRate();
+ kLogger.warning()
+ << "Stream position (in sample frames) while reading is inaccurate:"
+ << "expected =" << m_currentFrameIndex
+ << "actual =" << readerFrameIndex;
+ }
+ }
DWORD dwSampleBufferCount = 0;
HRESULT hrGetBufferCount =

View File

@@ -1,57 +0,0 @@
From 41840857fefb4f359e3fe5e16b9899ffceffd86b Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 16 May 2018 12:45:56 +0200
Subject: [PATCH] Fix mismatching signal/slot connection arg type
---
src/library/dlgtrackinfo.cpp | 18 +++++++++++-------
src/library/dlgtrackinfo.h | 2 +-
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/library/dlgtrackinfo.cpp b/src/library/dlgtrackinfo.cpp
index b619bfd59b..c0db2d815f 100644
--- a/src/library/dlgtrackinfo.cpp
+++ b/src/library/dlgtrackinfo.cpp
@@ -237,18 +237,22 @@ void DlgTrackInfo::slotCoverFound(const QObject* pRequestor,
}
void DlgTrackInfo::slotReloadCoverArt() {
- if (m_pLoadedTrack) {
- CoverInfo coverInfo =
- CoverArtUtils::guessCoverInfo(*m_pLoadedTrack);
- slotCoverInfoSelected(coverInfo);
+ VERIFY_OR_DEBUG_ASSERT(m_pLoadedTrack) {
+ return;
}
+ CoverInfo coverInfo =
+ CoverArtUtils::guessCoverInfo(*m_pLoadedTrack);
+ slotCoverInfoSelected(coverInfo);
}
-void DlgTrackInfo::slotCoverInfoSelected(const CoverInfo& coverInfo) {
+void DlgTrackInfo::slotCoverInfoSelected(const CoverInfoRelative& coverInfo) {
qDebug() << "DlgTrackInfo::slotCoverInfoSelected" << coverInfo;
- m_loadedCoverInfo = coverInfo;
+ VERIFY_OR_DEBUG_ASSERT(m_pLoadedTrack) {
+ return;
+ }
+ m_loadedCoverInfo = CoverInfo(coverInfo, m_pLoadedTrack->getLocation());
CoverArtCache* pCache = CoverArtCache::instance();
- if (pCache != NULL) {
+ if (pCache) {
pCache->requestCover(m_loadedCoverInfo, this, 0, false, true);
}
}
diff --git a/src/library/dlgtrackinfo.h b/src/library/dlgtrackinfo.h
index ab6717f6d5..0ca2a44a29 100644
--- a/src/library/dlgtrackinfo.h
+++ b/src/library/dlgtrackinfo.h
@@ -63,7 +63,7 @@ class DlgTrackInfo : public QDialog, public Ui::DlgTrackInfo {
void slotCoverFound(const QObject* pRequestor,
const CoverInfoRelative& info, QPixmap pixmap, bool fromCache);
- void slotCoverInfoSelected(const CoverInfo& coverInfo);
+ void slotCoverInfoSelected(const CoverInfoRelative& coverInfo);
void slotReloadCoverArt();
private:

View File

@@ -1,73 +0,0 @@
From c7c5218a8ce51a9bc3384903b056ec485d46e0c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Sat, 26 May 2018 23:11:09 +0200
Subject: [PATCH 1/2] manually call doSortByColumn in Qt5, because the required
signal is not emmitted in Qt4
---
src/widget/wtracktableview.cpp | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/widget/wtracktableview.cpp b/src/widget/wtracktableview.cpp
index f70d20b471..8813d298eb 100644
--- a/src/widget/wtracktableview.cpp
+++ b/src/widget/wtracktableview.cpp
@@ -358,10 +358,14 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel *model) {
// Stupid hack that assumes column 0 is never visible, but this is a weak
// proxy for "there was a saved column sort order"
if (horizontalHeader()->sortIndicatorSection() > 0) {
- // Sort by the saved sort section and order. This line sorts the
- // TrackModel and in turn generates a select()
+ // Sort by the saved sort section and order.
horizontalHeader()->setSortIndicator(horizontalHeader()->sortIndicatorSection(),
horizontalHeader()->sortIndicatorOrder());
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ // in Qt4, the line above emits sortIndicatorChanged
+ // in Qt5, we need to call it manually, which triggers finally the select()
+ doSortByColumn(horizontalHeader()->sortIndicatorSection());
+#endif
} else {
// No saved order is present. Use the TrackModel's default sort order.
int sortColumn = trackModel->defaultSortColumn();
@@ -372,8 +376,13 @@ void WTrackTableView::loadTrackModel(QAbstractItemModel *model) {
while (sortColumn < 0 || trackModel->isColumnInternal(sortColumn)) {
sortColumn++;
}
- // This line sorts the TrackModel and in turn generates a select()
+ // This line sorts the TrackModel
horizontalHeader()->setSortIndicator(sortColumn, sortOrder);
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+ // in Qt4, the line above emits sortIndicatorChanged
+ // in Qt5, we need to call it manually, which triggers finally the select()
+ doSortByColumn(sortColumn);
+#endif
}
}
From 7ae7d33ca739f6c7f3250eb3dda182eddb39f627 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Sun, 27 May 2018 01:36:25 +0200
Subject: [PATCH 2/2] fix double activate of the mixxx library feature
---
src/library/sidebarmodel.cpp | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp
index 22a93e2165..518277f640 100644
--- a/src/library/sidebarmodel.cpp
+++ b/src/library/sidebarmodel.cpp
@@ -252,11 +252,7 @@ void SidebarModel::slotPressedUntilClickedTimeout() {
void SidebarModel::pressed(const QModelIndex& index) {
stopPressedUntilClickedTimer();
if (index.isValid()) {
- if (index.internalPointer() == this) {
- m_sFeatures[index.row()]->activate();
- } else {
- startPressedUntilClickedTimer(index);
- }
+ startPressedUntilClickedTimer(index);
}
}

View File

@@ -1,164 +0,0 @@
From 901cacb96a0c3898b7b7af3cddd87e0d02f67235 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sat, 12 May 2018 00:20:59 +0200
Subject: [PATCH] Fix CachingReader compiler warnings about non-trivial types
---
src/engine/cachingreader.cpp | 8 ++++----
src/engine/cachingreaderworker.cpp | 17 +++++++++++------
src/engine/cachingreaderworker.h | 36 ++++++++++++++++++++++--------------
3 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/src/engine/cachingreader.cpp b/src/engine/cachingreader.cpp
index 2764e5c96c..2440b3a8f8 100644
--- a/src/engine/cachingreader.cpp
+++ b/src/engine/cachingreader.cpp
@@ -204,7 +204,7 @@ void CachingReader::process() {
} else if (status.status == TRACK_LOADED) {
m_readerStatus = status.status;
// Reset the max. readable frame index
- m_readableFrameIndexRange = status.readableFrameIndexRange;
+ m_readableFrameIndexRange = status.readableFrameIndexRange();
// Free all chunks with sample data from a previous track
freeAllChunks();
}
@@ -212,7 +212,7 @@ void CachingReader::process() {
// Adjust the readable frame index range after loading or reading
m_readableFrameIndexRange = intersect(
m_readableFrameIndexRange,
- status.readableFrameIndexRange);
+ status.readableFrameIndexRange());
} else {
// Reset the readable frame index range
m_readableFrameIndexRange = mixxx::IndexRange();
@@ -467,8 +467,8 @@ void CachingReader::hintAndMaybeWake(const HintVector& hintList) {
}
// Do not insert the allocated chunk into the MRU/LRU list,
// because it will be handed over to the worker immediately
- CachingReaderChunkReadRequest request(pChunk);
- pChunk->giveToWorker();
+ CachingReaderChunkReadRequest request;
+ request.giveToWorker(pChunk);
// kLogger.debug() << "Requesting read of chunk" << current << "into" << pChunk;
// kLogger.debug() << "Requesting read into " << request.chunk->data;
if (m_chunkReadRequestFIFO.write(&request, 1) != 1) {
diff --git a/src/engine/cachingreaderworker.cpp b/src/engine/cachingreaderworker.cpp
index 600389f86f..34f9a9ac83 100644
--- a/src/engine/cachingreaderworker.cpp
+++ b/src/engine/cachingreaderworker.cpp
@@ -42,7 +42,9 @@ ReaderStatusUpdate CachingReaderWorker::processReadRequest(
// actually available.
const auto chunkFrameIndexRange = pChunk->frameIndexRange(m_pAudioSource);
if (intersect(chunkFrameIndexRange, m_readableFrameIndexRange).empty()) {
- return ReaderStatusUpdate(CHUNK_READ_INVALID, pChunk, m_readableFrameIndexRange);
+ ReaderStatusUpdate result;
+ result.init(CHUNK_READ_INVALID, pChunk, m_readableFrameIndexRange);
+ return result;
}
// Try to read the data required for the chunk from the audio source
@@ -77,7 +79,9 @@ ReaderStatusUpdate CachingReaderWorker::processReadRequest(
<< "from originally"
<< m_pAudioSource->frameIndexRange();
}
- return ReaderStatusUpdate(status, pChunk, m_readableFrameIndexRange);
+ ReaderStatusUpdate result;
+ result.init(status, pChunk, m_readableFrameIndexRange);
+ return result;
}
// WARNING: Always called from a different thread (GUI)
@@ -91,10 +95,10 @@ void CachingReaderWorker::run() {
unsigned static id = 0; //the id of this thread, for debugging purposes
QThread::currentThread()->setObjectName(QString("CachingReaderWorker %1").arg(++id));
- CachingReaderChunkReadRequest request;
-
Event::start(m_tag);
while (!load_atomic(m_stop)) {
+ // Request is initialized by reading from FIFO
+ CachingReaderChunkReadRequest request;
if (m_newTrackAvailable) {
TrackPointer pLoadTrack;
{ // locking scope
@@ -130,7 +134,7 @@ mixxx::AudioSourcePointer openAudioSourceForReading(const TrackPointer& pTrack,
void CachingReaderWorker::loadTrack(const TrackPointer& pTrack) {
ReaderStatusUpdate status;
- status.status = TRACK_NOT_LOADED;
+ status.init(TRACK_NOT_LOADED);
if (!pTrack) {
// Unload track
@@ -179,8 +183,9 @@ void CachingReaderWorker::loadTrack(const TrackPointer& pTrack) {
// be decreased to avoid repeated reading of corrupt audio data.
m_readableFrameIndexRange = m_pAudioSource->frameIndexRange();
- status.readableFrameIndexRange = m_readableFrameIndexRange;
status.status = TRACK_LOADED;
+ status.readableFrameIndexRangeStart = m_readableFrameIndexRange.start();
+ status.readableFrameIndexRangeEnd = m_readableFrameIndexRange.end();
m_pReaderStatusFIFO->writeBlocking(&status, 1);
// Clear the chunks to read list.
diff --git a/src/engine/cachingreaderworker.h b/src/engine/cachingreaderworker.h
index 4d60e7c3ed..54c5a4c77e 100644
--- a/src/engine/cachingreaderworker.h
+++ b/src/engine/cachingreaderworker.h
@@ -14,12 +14,14 @@
#include "util/fifo.h"
+// POD with trivial ctor/dtor/copy for passing through FIFO
typedef struct CachingReaderChunkReadRequest {
CachingReaderChunk* chunk;
- explicit CachingReaderChunkReadRequest(
- CachingReaderChunk* chunkArg = nullptr)
- : chunk(chunkArg) {
+ void giveToWorker(CachingReaderChunkForOwner* chunkForOwner) {
+ DEBUG_ASSERT(chunkForOwner);
+ chunk = chunkForOwner;
+ chunkForOwner->giveToWorker();
}
} CachingReaderChunkReadRequest;
@@ -32,21 +34,27 @@ enum ReaderStatus {
CHUNK_READ_INVALID
};
+// POD with trivial ctor/dtor/copy for passing through FIFO
typedef struct ReaderStatusUpdate {
ReaderStatus status;
CachingReaderChunk* chunk;
- mixxx::IndexRange readableFrameIndexRange;
- ReaderStatusUpdate()
- : status(INVALID)
- , chunk(nullptr) {
+ SINT readableFrameIndexRangeStart;
+ SINT readableFrameIndexRangeEnd;
+
+ void init(
+ ReaderStatus statusArg = INVALID,
+ CachingReaderChunk* chunkArg = nullptr,
+ const mixxx::IndexRange& readableFrameIndexRangeArg = mixxx::IndexRange()) {
+ status = statusArg;
+ chunk = chunkArg;
+ readableFrameIndexRangeStart = readableFrameIndexRangeArg.start();
+ readableFrameIndexRangeEnd = readableFrameIndexRangeArg.end();
}
- ReaderStatusUpdate(
- ReaderStatus statusArg,
- CachingReaderChunk* chunkArg,
- const mixxx::IndexRange& readableFrameIndexRangeArg)
- : status(statusArg)
- , chunk(chunkArg)
- , readableFrameIndexRange(readableFrameIndexRangeArg) {
+
+ mixxx::IndexRange readableFrameIndexRange() const {
+ return mixxx::IndexRange::between(
+ readableFrameIndexRangeStart,
+ readableFrameIndexRangeEnd);
}
} ReaderStatusUpdate;

View File

@@ -1,152 +0,0 @@
From 0a0e41dd330e34f155c455c2c938a484aeb465f5 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 21:58:24 +0200
Subject: [PATCH 1/2] Remove unused parameter
...but keep in in the innermost function with a default value for
readability and documentation purposes.
---
src/track/trackmetadatataglib.cpp | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index 17e34b5196..f54724eab5 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -492,9 +492,8 @@ TagLib::ID3v2::CommentsFrame* findFirstCommentsFrame(
}
TagLib::ID3v2::CommentsFrame* findFirstCommentsFrameWithoutDescription(
- const TagLib::ID3v2::Tag& tag,
- bool preferNotEmpty = true) {
- return findFirstCommentsFrame(tag, QString(), preferNotEmpty);
+ const TagLib::ID3v2::Tag& tag) {
+ return findFirstCommentsFrame(tag, QString());
}
// Finds the first text frame that with a matching description (case-insensitive).
@@ -538,10 +537,9 @@ TagLib::ID3v2::UserTextIdentificationFrame* findFirstUserTextIdentificationFrame
inline
QString readFirstUserTextIdentificationFrame(
const TagLib::ID3v2::Tag& tag,
- const QString& description,
- bool preferNotEmpty = true) {
+ const QString& description) {
const TagLib::ID3v2::UserTextIdentificationFrame* pTextFrame =
- findFirstUserTextIdentificationFrame(tag, description, preferNotEmpty);
+ findFirstUserTextIdentificationFrame(tag, description);
if (pTextFrame && (pTextFrame->fieldList().size() > 1)) {
// The actual value is stored in the 2nd field
return toQString(pTextFrame->fieldList()[1]);
@@ -628,7 +626,7 @@ void writeID3v2CommentsFrame(
const QString& description,
bool isNumericOrURL = false) {
TagLib::ID3v2::CommentsFrame* pFrame =
- findFirstCommentsFrame(*pTag, description);
+ findFirstCommentsFrame(*pTag, description, true);
if (pFrame) {
// Modify existing frame
if (text.isEmpty()) {
From 1ccbca0b86fc31cdea900f1f9dc7008b205ffb67 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 22:22:09 +0200
Subject: [PATCH 2/2] Either update or remove replaygain ratio/gain values
---
src/track/trackmetadatataglib.cpp | 54 ++++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 26 deletions(-)
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index f54724eab5..2615ae5bb6 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -227,13 +227,7 @@ bool parseBpm(TrackMetadata* pTrackMetadata, QString sBpm) {
inline
QString formatReplayGainGain(const ReplayGain& replayGain) {
- const double gainRatio(replayGain.getRatio());
- return ReplayGain::ratioToString(gainRatio);
-}
-
-inline
-bool hasTrackGain(const TrackMetadata& trackMetadata) {
- return trackMetadata.getTrackInfo().getReplayGain().hasRatio();
+ return ReplayGain::ratioToString(replayGain.getRatio());
}
inline
@@ -1860,13 +1854,15 @@ bool exportTrackMetadataIntoID3v2Tag(TagLib::ID3v2::Tag* pTag,
writeID3v2TextIdentificationFrame(pTag, "TKEY", trackMetadata.getTrackInfo().getKey());
- if (hasTrackGain(trackMetadata)) {
- writeID3v2UserTextIdentificationFrame(
- pTag,
- "REPLAYGAIN_TRACK_GAIN",
- formatTrackGain(trackMetadata),
- true);
- }
+ writeID3v2UserTextIdentificationFrame(
+ pTag,
+ "REPLAYGAIN_TRACK_GAIN",
+ formatTrackGain(trackMetadata),
+ true);
+ // NOTE(uklotzde, 2018-04-22): The analyzers currently doesn't
+ // calculate a peak value, so leave it untouched in the file if
+ // the value is invalid/absent. Otherwise the ID3 frame would
+ // be deleted.
if (hasTrackPeak(trackMetadata)) {
writeID3v2UserTextIdentificationFrame(
pTag,
@@ -2000,10 +1996,12 @@ bool exportTrackMetadataIntoAPETag(TagLib::APE::Tag* pTag, const TrackMetadata&
writeAPEItem(pTag, "INITIALKEY",
toTagLibString(trackMetadata.getTrackInfo().getKey()));
- if (hasTrackGain(trackMetadata)) {
- writeAPEItem(pTag, "REPLAYGAIN_TRACK_GAIN",
- toTagLibString(formatTrackGain(trackMetadata)));
- }
+ writeAPEItem(pTag, "REPLAYGAIN_TRACK_GAIN",
+ toTagLibString(formatTrackGain(trackMetadata)));
+ // NOTE(uklotzde, 2018-04-22): The analyzers currently doesn't
+ // calculate a peak value, so leave it untouched in the file if
+ // the value is invalid/absent. Otherwise the APE item would be
+ // deleted.
if (hasTrackPeak(trackMetadata)) {
writeAPEItem(pTag, "REPLAYGAIN_TRACK_PEAK",
toTagLibString(formatTrackPeak(trackMetadata)));
@@ -2149,10 +2147,12 @@ bool exportTrackMetadataIntoXiphComment(TagLib::Ogg::XiphComment* pTag,
writeXiphCommentField(pTag, "INITIALKEY", key); // recommended field
updateXiphCommentField(pTag, "KEY", key); // alternative field
- if (hasTrackGain(trackMetadata)) {
- writeXiphCommentField(pTag, "REPLAYGAIN_TRACK_GAIN",
- toTagLibString(formatTrackGain(trackMetadata)));
- }
+ writeXiphCommentField(pTag, "REPLAYGAIN_TRACK_GAIN",
+ toTagLibString(formatTrackGain(trackMetadata)));
+ // NOTE(uklotzde, 2018-04-22): The analyzers currently doesn't
+ // calculate a peak value, so leave it untouched in the file if
+ // the value is invalid/absent. Otherwise the comment field would
+ // be deleted.
if (hasTrackPeak(trackMetadata)) {
writeXiphCommentField(pTag, "REPLAYGAIN_TRACK_PEAK",
toTagLibString(formatTrackPeak(trackMetadata)));
@@ -2282,10 +2282,12 @@ bool exportTrackMetadataIntoMP4Tag(TagLib::MP4::Tag* pTag, const TrackMetadata&
writeMP4Atom(pTag, "----:com.apple.iTunes:initialkey", key); // preferred
updateMP4Atom(pTag, "----:com.apple.iTunes:KEY", key); // alternative
- if (hasTrackGain(trackMetadata)) {
- writeMP4Atom(pTag, "----:com.apple.iTunes:replaygain_track_gain",
- toTagLibString(formatTrackGain(trackMetadata)));
- }
+ writeMP4Atom(pTag, "----:com.apple.iTunes:replaygain_track_gain",
+ toTagLibString(formatTrackGain(trackMetadata)));
+ // NOTE(uklotzde, 2018-04-22): The analyzers currently doesn't
+ // calculate a peak value, so leave it untouched in the file if
+ // the value is invalid/absent. Otherwise the MP4 atom would be
+ // deleted.
if (hasTrackPeak(trackMetadata)) {
writeMP4Atom(pTag, "----:com.apple.iTunes:replaygain_track_peak",
toTagLibString(formatTrackPeak(trackMetadata)));

View File

@@ -1,84 +0,0 @@
From 8b408749a1efb7a9dba5bed6fec8a2af1023589c Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sat, 2 Jun 2018 17:23:57 +0200
Subject: [PATCH] Fix crash when importing ID3v2 APIC frames with unexpected
type
---
src/track/trackmetadatataglib.cpp | 49 ++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 16 deletions(-)
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index 2615ae5bb6..ebbf120946 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -876,6 +876,23 @@ QImage importCoverImageFromVorbisCommentPictureList(
return QImage();
}
+template<typename T>
+const T* downcastID3v2Frame(TagLib::ID3v2::Frame* frame) {
+ DEBUG_ASSERT(frame);
+ // We need to use a safe dynamic_cast at runtime instead of an unsafe
+ // static_cast at compile time to detect unexpected frame subtypes!
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1774790
+ const T* downcastFrame = dynamic_cast<T*>(frame);
+ VERIFY_OR_DEBUG_ASSERT(downcastFrame) {
+ // This should only happen when reading corrupt or malformed files
+ kLogger.warning()
+ << "Unexpected ID3v2"
+ << frame->frameID().data()
+ << "frame type";
+ }
+ return downcastFrame;
+}
+
void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& tag) {
if (!pCoverArt) {
return; // nothing to do
@@ -891,10 +908,9 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
const TagLib::ID3v2::FrameList pFrames = iterAPIC->second;
for (const auto coverArtType: kPreferredID3v2PictureTypes) {
for (const auto pFrame: pFrames) {
- const TagLib::ID3v2::AttachedPictureFrame* pApicFrame =
- static_cast<const TagLib::ID3v2::AttachedPictureFrame*>(pFrame);
- DEBUG_ASSERT(pApicFrame); // trust TagLib
- if (pApicFrame->type() == coverArtType) {
+ const auto* pApicFrame =
+ downcastID3v2Frame<TagLib::ID3v2::AttachedPictureFrame>(pFrame);
+ if (pApicFrame && (pApicFrame->type() == coverArtType)) {
QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
if (image.isNull()) {
kLogger.warning()
@@ -911,18 +927,19 @@ void importCoverImageFromID3v2Tag(QImage* pCoverArt, const TagLib::ID3v2::Tag& t
// Fallback: No best match -> Simply select the 1st loadable image
for (const auto pFrame: pFrames) {
- const TagLib::ID3v2::AttachedPictureFrame* pApicFrame =
- static_cast<const TagLib::ID3v2::AttachedPictureFrame*>(pFrame);
- DEBUG_ASSERT(pApicFrame); // trust TagLib
- const QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
- if (image.isNull()) {
- kLogger.warning()
- << "Failed to load image from ID3v2 APIC frame of type"
- << pApicFrame->type();
- continue;
- } else {
- *pCoverArt = image;
- return; // success
+ const auto* pApicFrame =
+ downcastID3v2Frame<TagLib::ID3v2::AttachedPictureFrame>(pFrame);
+ if (pApicFrame) {
+ const QImage image(loadImageFromID3v2PictureFrame(*pApicFrame));
+ if (image.isNull()) {
+ kLogger.warning()
+ << "Failed to load image from ID3v2 APIC frame of type"
+ << pApicFrame->type();
+ continue;
+ } else {
+ *pCoverArt = image;
+ return; // success
+ }
}
}
}

View File

@@ -1,69 +0,0 @@
From f54dbc552a0fb9c13c7247faea5c2ffd0013c801 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sat, 21 Apr 2018 12:21:36 +0200
Subject: [PATCH 1/2] Fix crash when removing a quick link
---
src/library/browse/browsefeature.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/library/browse/browsefeature.cpp b/src/library/browse/browsefeature.cpp
index feb53b39d3..18a34d08fe 100644
--- a/src/library/browse/browsefeature.cpp
+++ b/src/library/browse/browsefeature.cpp
@@ -286,8 +286,15 @@ void BrowseFeature::onRightClickChild(const QPoint& globalPos, QModelIndex index
// This is called whenever you double click or use the triangle symbol to expand
// the subtree. The method will read the subfolders.
void BrowseFeature::onLazyChildExpandation(const QModelIndex& index) {
+ if (!index.isValid()) {
+ return;
+ }
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
- if (!item) {
+ if (!(item && item->getData().isValid())) {
+ // Them tem might have been removed just before
+ // NOTE(2018-04-21, uklotzde): When not checking if the QVariant
+ // stored in the item is valid Mixxx will crash.
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1510068
return;
}
From 8a87ad5a176026b92bce2e7c696b619a573f1de1 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 12:16:42 +0200
Subject: [PATCH 2/2] Fix typo and clarify comments
---
src/library/browse/browsefeature.cpp | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/library/browse/browsefeature.cpp b/src/library/browse/browsefeature.cpp
index 18a34d08fe..ee72493b43 100644
--- a/src/library/browse/browsefeature.cpp
+++ b/src/library/browse/browsefeature.cpp
@@ -286,15 +286,20 @@ void BrowseFeature::onRightClickChild(const QPoint& globalPos, QModelIndex index
// This is called whenever you double click or use the triangle symbol to expand
// the subtree. The method will read the subfolders.
void BrowseFeature::onLazyChildExpandation(const QModelIndex& index) {
+ // The selected item might have been removed just before this function
+ // is invoked!
+ // NOTE(2018-04-21, uklotzde): The following checks prevent a crash
+ // that would otherwise occur after a quick link has been removed.
+ // Especially the check of QVariant::isValid() seems to be essential.
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1510068
+ // After migration to Qt5 the implementation of all LibraryFeatures
+ // should be revisited, because I consider these checks only as a
+ // temporary workaround.
if (!index.isValid()) {
return;
}
TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
if (!(item && item->getData().isValid())) {
- // Them tem might have been removed just before
- // NOTE(2018-04-21, uklotzde): When not checking if the QVariant
- // stored in the item is valid Mixxx will crash.
- // See also: https://bugs.launchpad.net/mixxx/+bug/1510068
return;
}

View File

@@ -1,217 +0,0 @@
From 32b9065dba36e0061adbaf4721ef159e362c398f Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 8 May 2018 10:47:45 +0200
Subject: [PATCH 1/3] Fix decoding of improperly encoded FLAC files
---
src/sources/soundsourceflac.cpp | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index 01dfc00149..3d68e05ce7 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -345,6 +345,25 @@ FLAC__bool SoundSourceFLAC::flacEOF() {
return m_file.atEnd();
}
+inline
+FLAC__int32 adjustDecodedSample(FLAC__int32 decodedSample, SINT bitsPerSample) {
+ // Workaround for improperly encoded FLAC files that may contain
+ // garbage in the most significant, unused bits of decoded samples.
+ // Required at least for libFLAC 1.3.2. This workaround might become
+ // obsolete once libFLAC is taking care of these issues internally.
+ // https://bugs.launchpad.net/mixxx/+bug/1769717
+ // https://hydrogenaud.io/index.php/topic,61792.msg559045.html#msg559045
+ FLAC__int32 signBit = static_cast<FLAC__int32>(1) << (bitsPerSample - 1);
+ FLAC__int32 bitMask = (static_cast<FLAC__int32>(1) << bitsPerSample) - 1; // == (signBit << 1) - 1
+ FLAC__int32 maskedSample = decodedSample & bitMask;
+ if (maskedSample & signBit) {
+ // Sign extension for negative values
+ return maskedSample | ~bitMask;
+ } else {
+ return maskedSample;
+ }
+}
+
FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
const FLAC__Frame* frame, const FLAC__int32* const buffer[]) {
const SINT numChannels = frame->header.channels;
@@ -391,15 +410,15 @@ FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
case 1: {
// optimized code for 1 channel (mono)
for (SINT i = 0; i < numWritableFrames; ++i) {
- *pSampleBuffer++ = buffer[0][i] * m_sampleScaleFactor;
+ *pSampleBuffer++ = adjustDecodedSample(buffer[0][i], m_bitsPerSample) * m_sampleScaleFactor;
}
break;
}
case 2: {
// optimized code for 2 channels (stereo)
for (SINT i = 0; i < numWritableFrames; ++i) {
- *pSampleBuffer++ = buffer[0][i] * m_sampleScaleFactor;
- *pSampleBuffer++ = buffer[1][i] * m_sampleScaleFactor;
+ *pSampleBuffer++ = adjustDecodedSample(buffer[0][i], m_bitsPerSample) * m_sampleScaleFactor;
+ *pSampleBuffer++ = adjustDecodedSample(buffer[1][i], m_bitsPerSample) * m_sampleScaleFactor;
}
break;
}
@@ -407,7 +426,7 @@ FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
// generic code for multiple channels
for (SINT i = 0; i < numWritableFrames; ++i) {
for (SINT j = 0; j < channelCount(); ++j) {
- *pSampleBuffer++ = buffer[j][i] * m_sampleScaleFactor;
+ *pSampleBuffer++ = adjustDecodedSample(buffer[j][i], m_bitsPerSample) * m_sampleScaleFactor;
}
}
}
From 79f7048a44dced6eccc61555bf02fdb5be02c560 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 2 May 2018 08:22:17 +0200
Subject: [PATCH 2/3] Delete unused member function
---
src/library/dao/settingsdao.cpp | 4 ----
src/library/dao/settingsdao.h | 6 ++----
src/test/schemamanager_test.cpp | 2 --
3 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/src/library/dao/settingsdao.cpp b/src/library/dao/settingsdao.cpp
index 2e7f8cb7d1..5c56a98426 100644
--- a/src/library/dao/settingsdao.cpp
+++ b/src/library/dao/settingsdao.cpp
@@ -5,13 +5,9 @@
SettingsDAO::SettingsDAO(const QSqlDatabase& db)
: m_db(db) {
-}
-SettingsDAO::~SettingsDAO() {
-}
-void SettingsDAO::initialize() {
}
QString SettingsDAO::getValue(const QString& name, QString defaultValue) const {
diff --git a/src/library/dao/settingsdao.h b/src/library/dao/settingsdao.h
index cd0d66bf3f..bcb95acd91 100644
--- a/src/library/dao/settingsdao.h
+++ b/src/library/dao/settingsdao.h
@@ -12,12 +12,10 @@
// All library-specific preferences go in the library settings table
-class SettingsDAO : public QObject {
+class SettingsDAO final : public QObject {
public:
SettingsDAO(const QSqlDatabase& db);
- virtual ~SettingsDAO();
-
- virtual void initialize();
+ ~SettingsDAO() override = default;
QString getValue(const QString& name, QString defaultValue = QString()) const;
bool setValue(const QString& name, const QVariant& value);
diff --git a/src/test/schemamanager_test.cpp b/src/test/schemamanager_test.cpp
index bd24f79478..25d9e77fc5 100644
--- a/src/test/schemamanager_test.cpp
+++ b/src/test/schemamanager_test.cpp
@@ -64,7 +64,6 @@ TEST_F(SchemaManagerTest, BackwardsCompatibleVersion) {
EXPECT_EQ(SchemaManager::Result::UpgradeSucceeded, result);
SettingsDAO settings(dbConnection());
- settings.initialize();
// Pretend the database version is one past the required version but
// min_compatible is the required version.
@@ -90,7 +89,6 @@ TEST_F(SchemaManagerTest, BackwardsIncompatibleVersion) {
EXPECT_EQ(SchemaManager::Result::UpgradeSucceeded, result);
SettingsDAO settings(dbConnection());
- settings.initialize();
// Pretend the database version is one past the required version and
// min_compatible is one past the required version.
From 71934a9b6fee154de7de0be1a667df0a857a0aa8 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 2 May 2018 08:23:38 +0200
Subject: [PATCH 3/3] Try to fix crash during database migration in macOS tests
---
src/library/dao/settingsdao.cpp | 37 ++++++++++++++++++++++++++++---------
src/library/dao/settingsdao.h | 2 +-
2 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/src/library/dao/settingsdao.cpp b/src/library/dao/settingsdao.cpp
index 5c56a98426..148409ab22 100644
--- a/src/library/dao/settingsdao.cpp
+++ b/src/library/dao/settingsdao.cpp
@@ -3,24 +3,43 @@
#include "library/dao/settingsdao.h"
-SettingsDAO::SettingsDAO(const QSqlDatabase& db)
- : m_db(db) {
+#include "util/logger.h"
+#include "util/assert.h"
+namespace {
+mixxx::Logger kLogger("SettingsDAO");
+} // anonymous namespace
+
+SettingsDAO::SettingsDAO(const QSqlDatabase& db)
+ : m_db(db) {
}
QString SettingsDAO::getValue(const QString& name, QString defaultValue) const {
QSqlQuery query(m_db);
- query.prepare("SELECT value FROM settings WHERE name = :name");
- query.bindValue(":name", name);
-
- QString value = defaultValue;
- if (query.exec() && query.first()) {
- value = query.value(query.record().indexOf("value")).toString();
+ if (query.prepare("SELECT value FROM settings WHERE name = :name")) {
+ query.bindValue(":name", name);
+ if (query.exec() && query.first()) {
+ QVariant value = query.value(query.record().indexOf("value"));
+ VERIFY_OR_DEBUG_ASSERT(value.isValid()) {
+ kLogger.warning() << "Invalid value:" << value;
+ } else {
+ return value.toString();
+ }
+ }
+ } else {
+ // Prepare is expected to fail for a fresh database
+ // when the schema is still empty!
+ kLogger.debug()
+ << "Failed to prepare query:"
+ << "Returning default value"
+ << defaultValue
+ << "for"
+ << name;
}
- return value;
+ return defaultValue;
}
bool SettingsDAO::setValue(const QString& name, const QVariant& value) {
diff --git a/src/library/dao/settingsdao.h b/src/library/dao/settingsdao.h
index bcb95acd91..91ae8bb401 100644
--- a/src/library/dao/settingsdao.h
+++ b/src/library/dao/settingsdao.h
@@ -14,7 +14,7 @@
// All library-specific preferences go in the library settings table
class SettingsDAO final : public QObject {
public:
- SettingsDAO(const QSqlDatabase& db);
+ explicit SettingsDAO(const QSqlDatabase& db);
~SettingsDAO() override = default;
QString getValue(const QString& name, QString defaultValue = QString()) const;

View File

@@ -1,373 +0,0 @@
From d68a5997c745320555bab6860198d00d3e6b0edf Mon Sep 17 00:00:00 2001
From: Jamie Gifford <james@thoughtpatterns.com.au>
Date: Sun, 22 Apr 2018 11:53:44 +1000
Subject: [PATCH 01/10] Fix -6dB gain in FLAC
---
src/sources/soundsourceflac.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index 8a496d2289..e6a356922b 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -437,7 +437,7 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
// not set before
m_bitsPerSample = bitsPerSample;
m_sampleScaleFactor = CSAMPLE_PEAK
- / CSAMPLE(FLAC__int32(1) << bitsPerSample);
+ / CSAMPLE(FLAC__int32(1) << (bitsPerSample - 1));
} else {
// already set before -> check for consistency
if (bitsPerSample != m_bitsPerSample) {
From 82d7b96b2a976b1f74eef61816bd1bfc64fa30ac Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 14:21:32 +0200
Subject: [PATCH 02/10] Clarify conversion of fixed-point integer to floating
point samples
---
src/sources/soundsourceflac.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index e6a356922b..ecccab61dd 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -436,8 +436,11 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
if (kBitsPerSampleDefault == m_bitsPerSample) {
// not set before
m_bitsPerSample = bitsPerSample;
- m_sampleScaleFactor = CSAMPLE_PEAK
- / CSAMPLE(FLAC__int32(1) << (bitsPerSample - 1));
+ // Range of signed(!) sample values: [2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1766042
+ const auto maxAbsSampleValue = FLAC__int32(1) << (bitsPerSample - 1);
+ // Scaled range of samples values: [-1.0, 1.0)
+ m_sampleScaleFactor = CSAMPLE_PEAK / CSAMPLE(maxAbsSampleValue);
} else {
// already set before -> check for consistency
if (bitsPerSample != m_bitsPerSample) {
From e4516a3c82f8b4dd016d712ca3e82017e76c3ffa Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 14:26:36 +0200
Subject: [PATCH 03/10] Check for valid bits per sample
---
plugins/soundsourcewv/soundsourcewv.cpp | 13 ++++++++++---
src/sources/soundsourceflac.cpp | 18 ++++++++++++------
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/plugins/soundsourcewv/soundsourcewv.cpp b/plugins/soundsourcewv/soundsourcewv.cpp
index 915a66fc03..732b5c0154 100644
--- a/plugins/soundsourcewv/soundsourcewv.cpp
+++ b/plugins/soundsourcewv/soundsourcewv.cpp
@@ -77,9 +77,16 @@ SoundSource::OpenResult SoundSourceWV::tryOpen(
m_sampleScaleFactor = CSAMPLE_PEAK;
} else {
const int bitsPerSample = WavpackGetBitsPerSample(m_wpc);
- const uint32_t wavpackPeakSampleValue = 1u
- << (bitsPerSample - 1);
- m_sampleScaleFactor = CSAMPLE_PEAK / wavpackPeakSampleValue;
+ if (bitsPerSample > 0) {
+ const uint32_t wavpackPeakSampleValue = 1u
+ << (bitsPerSample - 1);
+ m_sampleScaleFactor = CSAMPLE_PEAK / wavpackPeakSampleValue;
+ } else {
+ kLogger.warning()
+ << "Invalid bits per sample:"
+ << bitsPerSample;
+ return OpenResult::Aborted;
+ }
}
m_curFrameIndex = frameIndexMin();
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index ecccab61dd..be79d2a88c 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -435,12 +435,18 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
DEBUG_ASSERT(kBitsPerSampleDefault != bitsPerSample);
if (kBitsPerSampleDefault == m_bitsPerSample) {
// not set before
- m_bitsPerSample = bitsPerSample;
- // Range of signed(!) sample values: [2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
- // See also: https://bugs.launchpad.net/mixxx/+bug/1766042
- const auto maxAbsSampleValue = FLAC__int32(1) << (bitsPerSample - 1);
- // Scaled range of samples values: [-1.0, 1.0)
- m_sampleScaleFactor = CSAMPLE_PEAK / CSAMPLE(maxAbsSampleValue);
+ if (bitsPerSample > 0) {
+ m_bitsPerSample = bitsPerSample;
+ // Range of signed(!) sample values: [2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
+ // See also: https://bugs.launchpad.net/mixxx/+bug/1766042
+ const auto maxAbsSampleValue = FLAC__int32(1) << (bitsPerSample - 1);
+ // Scaled range of samples values: [-1.0, 1.0)
+ m_sampleScaleFactor = CSAMPLE_PEAK / CSAMPLE(maxAbsSampleValue);
+ } else {
+ kLogger.warning()
+ << "Invalid bits per sample:"
+ << bitsPerSample;
+ }
} else {
// already set before -> check for consistency
if (bitsPerSample != m_bitsPerSample) {
From 1940455fabbb0ed605c8d9345ade016b9be3347b Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 15:07:27 +0200
Subject: [PATCH 04/10] Reset wrong replay gain info for all FLAC files
---
res/schema.xml | 10 ++++++++++
src/database/mixxxdb.cpp | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/res/schema.xml b/res/schema.xml
index e58c8033f6..a3ad73a99d 100644
--- a/res/schema.xml
+++ b/res/schema.xml
@@ -426,4 +426,14 @@ METADATA
ALTER TABLE cues ADD COLUMN color INTEGER DEFAULT 4294901760 NOT NULL;
</sql>
</revision>
+ <revision version="28" min_compatible="3">
+ <description>
+ Reset replay gain info for all FLAC files after fixing a decoding bug in version 2.1.0.
+ See also: https://bugs.launchpad.net/mixxx/+bug/1766042
+ </description>
+ <sql>
+ <!-- Reset replay gain values to default -->
+ UPDATE library SET (replaygain,replaygain_peak)=(0.0,-1.0) WHERE filetype='flac';
+ </sql>
+ </revision>
</schema>
diff --git a/src/database/mixxxdb.cpp b/src/database/mixxxdb.cpp
index 2046129b44..a831d35b94 100644
--- a/src/database/mixxxdb.cpp
+++ b/src/database/mixxxdb.cpp
@@ -11,7 +11,7 @@
const QString MixxxDb::kDefaultSchemaFile(":/schema.xml");
//static
-const int MixxxDb::kRequiredSchemaVersion = 27;
+const int MixxxDb::kRequiredSchemaVersion = 28;
namespace {
From 73bc371b2b3913ed39a480a485dd193814b655be Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 22 Apr 2018 15:20:40 +0200
Subject: [PATCH 05/10] Use case-insensitive string compare for file type
---
res/schema.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/res/schema.xml b/res/schema.xml
index a3ad73a99d..849be6ed73 100644
--- a/res/schema.xml
+++ b/res/schema.xml
@@ -433,7 +433,7 @@ METADATA
</description>
<sql>
<!-- Reset replay gain values to default -->
- UPDATE library SET (replaygain,replaygain_peak)=(0.0,-1.0) WHERE filetype='flac';
+ UPDATE library SET (replaygain,replaygain_peak)=(0.0,-1.0) WHERE filetype='flac' COLLATE NOCASE;
</sql>
</revision>
</schema>
From a5294bd7031e5663c5b320dbd8cea84ef8e1d9aa Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 23 Apr 2018 08:40:09 +0200
Subject: [PATCH 06/10] FLAC/WavPack: Improve validation, align implementation,
fix comments
---
plugins/soundsourcewv/soundsourcewv.cpp | 10 ++++++----
src/sources/soundsourceflac.cpp | 12 ++++++------
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/plugins/soundsourcewv/soundsourcewv.cpp b/plugins/soundsourcewv/soundsourcewv.cpp
index 732b5c0154..5d5c5b1c08 100644
--- a/plugins/soundsourcewv/soundsourcewv.cpp
+++ b/plugins/soundsourcewv/soundsourcewv.cpp
@@ -77,10 +77,12 @@ SoundSource::OpenResult SoundSourceWV::tryOpen(
m_sampleScaleFactor = CSAMPLE_PEAK;
} else {
const int bitsPerSample = WavpackGetBitsPerSample(m_wpc);
- if (bitsPerSample > 0) {
- const uint32_t wavpackPeakSampleValue = 1u
- << (bitsPerSample - 1);
- m_sampleScaleFactor = CSAMPLE_PEAK / wavpackPeakSampleValue;
+ if ((bitsPerSample >= 8) && (bitsPerSample <= 32)) {
+ // Range of signed sample values: [-2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
+ const uint32_t absSamplePeak = 1u << (bitsPerSample - 1);
+ DEBUG_ASSERT(absSamplePeak > 0);
+ // Scaled range of sample values: [-CSAMPLE_PEAK, CSAMPLE_PEAK)
+ m_sampleScaleFactor = CSAMPLE_PEAK / absSamplePeak;
} else {
kLogger.warning()
<< "Invalid bits per sample:"
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index be79d2a88c..aae897164a 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -435,13 +435,13 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
DEBUG_ASSERT(kBitsPerSampleDefault != bitsPerSample);
if (kBitsPerSampleDefault == m_bitsPerSample) {
// not set before
- if (bitsPerSample > 0) {
+ if ((bitsPerSample >= 8) && (bitsPerSample <= 32)) {
m_bitsPerSample = bitsPerSample;
- // Range of signed(!) sample values: [2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
- // See also: https://bugs.launchpad.net/mixxx/+bug/1766042
- const auto maxAbsSampleValue = FLAC__int32(1) << (bitsPerSample - 1);
- // Scaled range of samples values: [-1.0, 1.0)
- m_sampleScaleFactor = CSAMPLE_PEAK / CSAMPLE(maxAbsSampleValue);
+ // Range of signed) sample values: [-2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
+ const uint32_t absSamplePeak = 1u << (bitsPerSample - 1);
+ DEBUG_ASSERT(absSamplePeak > 0);
+ // Scaled range of samples values: [-CSAMPLE_PEAK, CSAMPLE_PEAK)
+ m_sampleScaleFactor = CSAMPLE_PEAK / absSamplePeak;
} else {
kLogger.warning()
<< "Invalid bits per sample:"
From a75ff1362d5338973ba9bf257b58838643f16852 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 23 Apr 2018 09:17:20 +0200
Subject: [PATCH 07/10] Add Jamie Gifford to the list of contributors
...and fix some tab/space formatting issues
---
src/dialog/dlgabout.cpp | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/dialog/dlgabout.cpp b/src/dialog/dlgabout.cpp
index 95d833d02d..165254fb01 100644
--- a/src/dialog/dlgabout.cpp
+++ b/src/dialog/dlgabout.cpp
@@ -83,17 +83,18 @@ DlgAbout::DlgAbout(QWidget* parent) : QDialog(parent), Ui::DlgAboutDlg() {
<< "Devananda van der Veen"
<< "Tatsuyuki Ishi"
<< "Kilian Feess"
- << "Conner Phillips"
- << "Daniel Poelzleithner"
+ << "Conner Phillips"
+ << "Daniel Poelzleithner"
<< "Artyom Lyan"
<< "Johan Lasperas"
<< "Olaf Hering"
<< "Stefan Weber"
<< "Eduardo Acero"
- << "Kshitij Gupta"
- << "Thomas Jarosch"
- << "Matthew Nicholson"
- << "ronso0";
+ << "Kshitij Gupta"
+ << "Thomas Jarosch"
+ << "Matthew Nicholson"
+ << "ronso0"
+ << "Jamie Gifford";
QStringList specialThanks;
specialThanks
From a9b001279993668a521cb794901597b1f55bb4ce Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 23 Apr 2018 09:22:49 +0200
Subject: [PATCH 08/10] FLAC: Accept files with 4 to 32 bits per sample
---
src/sources/soundsourceflac.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index aae897164a..01dfc00149 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -435,7 +435,7 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
DEBUG_ASSERT(kBitsPerSampleDefault != bitsPerSample);
if (kBitsPerSampleDefault == m_bitsPerSample) {
// not set before
- if ((bitsPerSample >= 8) && (bitsPerSample <= 32)) {
+ if ((bitsPerSample >= 4) && (bitsPerSample <= 32)) {
m_bitsPerSample = bitsPerSample;
// Range of signed) sample values: [-2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
const uint32_t absSamplePeak = 1u << (bitsPerSample - 1);
From 65541c54b86428dbf20d752d1b36b3e1691c5e0d Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 23 Apr 2018 15:17:30 +0200
Subject: [PATCH 09/10] Hide developer comments during db schema upgrade
---
res/schema.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/res/schema.xml b/res/schema.xml
index 849be6ed73..38a20dbfe1 100644
--- a/res/schema.xml
+++ b/res/schema.xml
@@ -386,7 +386,7 @@ METADATA
<revision version="24" min_compatible="3">
<description>
Add cover art support. Default source is UNKNOWN and default type is NONE.
- See library/coverart.h.
+ <!-- See library/coverart.h. -->
</description>
<sql>
ALTER TABLE library ADD COLUMN coverart_source INTEGER DEFAULT 0;
@@ -419,7 +419,7 @@ METADATA
<revision version="27" min_compatible="3">
<description>
Add cue color support. Default color is #FF0000.
- See library/dao/cue.h.
+ <!-- See library/dao/cue.h. -->
</description>
<sql>
<!-- Default color is #FFFF0000 (in base 10) -->
@@ -429,7 +429,7 @@ METADATA
<revision version="28" min_compatible="3">
<description>
Reset replay gain info for all FLAC files after fixing a decoding bug in version 2.1.0.
- See also: https://bugs.launchpad.net/mixxx/+bug/1766042
+ <!-- See also: https://bugs.launchpad.net/mixxx/+bug/1766042 -->
</description>
<sql>
<!-- Reset replay gain values to default -->
From add395ae54ebb3c4729469cd994fa602cc7738b3 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 23 Apr 2018 15:18:12 +0200
Subject: [PATCH 10/10] Don't reset and preserve 'replaygain_peak' of FLAC
files
---
res/schema.xml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/res/schema.xml b/res/schema.xml
index 38a20dbfe1..a51599ed11 100644
--- a/res/schema.xml
+++ b/res/schema.xml
@@ -429,11 +429,13 @@ METADATA
<revision version="28" min_compatible="3">
<description>
Reset replay gain info for all FLAC files after fixing a decoding bug in version 2.1.0.
+ <!-- The value of 'replaygain_peak' is not yet calculated by any Mixxx analyzer, -->
+ <!-- so we should leave it untouched and don't need to reset it here! -->
<!-- See also: https://bugs.launchpad.net/mixxx/+bug/1766042 -->
</description>
<sql>
- <!-- Reset replay gain values to default -->
- UPDATE library SET (replaygain,replaygain_peak)=(0.0,-1.0) WHERE filetype='flac' COLLATE NOCASE;
+ <!-- Reset replay gain to default value -->
+ UPDATE library SET replaygain=0.0 WHERE filetype='flac' COLLATE NOCASE;
</sql>
</revision>
</schema>

View File

@@ -1,388 +0,0 @@
From fbd70f2205d60e85a99630095dde7c535131c53b Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 24 Apr 2018 22:03:40 +0200
Subject: [PATCH 1/6] Fix integration of external track libraries
Add a missing override to BaseExternalTrackModel. I wonder if there are
more of these "gems" hidden inside the code?! This was a tough one, even
though it looks like an easy fix. Implementation inheritance is evil!!
---
src/library/baseexternaltrackmodel.cpp | 33 +++++++++++++++++++++++----------
src/library/baseexternaltrackmodel.h | 2 +-
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/src/library/baseexternaltrackmodel.cpp b/src/library/baseexternaltrackmodel.cpp
index 0713790eff..7f4c00a241 100644
--- a/src/library/baseexternaltrackmodel.cpp
+++ b/src/library/baseexternaltrackmodel.cpp
@@ -58,20 +58,33 @@ TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const {
TrackPointer pTrack = m_pTrackCollection->getTrackDAO()
.getOrAddTrack(location, true, &track_already_in_library);
- // If this track was not in the Mixxx library it is now added and will be
- // saved with the metadata from iTunes. If it was already in the library
- // then we do not touch it so that we do not over-write the user's metadata.
- if (pTrack && !track_already_in_library) {
- pTrack->setArtist(artist);
- pTrack->setTitle(title);
- pTrack->setAlbum(album);
- pTrack->setYear(year);
- pTrack->setGenre(genre);
- pTrack->setBpm(bpm);
+ if (pTrack) {
+ // If this track was not in the Mixxx library it is now added and will be
+ // saved with the metadata from iTunes. If it was already in the library
+ // then we do not touch it so that we do not over-write the user's metadata.
+ if (!track_already_in_library) {
+ pTrack->setArtist(artist);
+ pTrack->setTitle(title);
+ pTrack->setAlbum(album);
+ pTrack->setYear(year);
+ pTrack->setGenre(genre);
+ pTrack->setBpm(bpm);
+ }
+ } else {
+ qWarning() << "Failed to load external track" << location;
}
return pTrack;
}
+TrackId BaseExternalTrackModel::getTrackId(const QModelIndex& index) const {
+ const auto track = getTrack(index);
+ if (track) {
+ return track->getId();
+ } else {
+ return TrackId();
+ }
+}
+
void BaseExternalTrackModel::trackLoaded(QString group, TrackPointer pTrack) {
if (group == m_previewDeckGroup) {
// If there was a previously loaded track, refresh its rows so the
diff --git a/src/library/baseexternaltrackmodel.h b/src/library/baseexternaltrackmodel.h
index eb4900a63a..7558f960e6 100644
--- a/src/library/baseexternaltrackmodel.h
+++ b/src/library/baseexternaltrackmodel.h
@@ -7,7 +7,6 @@
#include "library/trackmodel.h"
#include "library/basesqltablemodel.h"
-#include "track/track.h"
class TrackCollection;
@@ -22,6 +21,7 @@ class BaseExternalTrackModel : public BaseSqlTableModel {
~BaseExternalTrackModel() override;
CapabilitiesFlags getCapabilities() const override;
+ TrackId getTrackId(const QModelIndex& index) const override;
TrackPointer getTrack(const QModelIndex& index) const override;
void trackLoaded(QString group, TrackPointer pTrack) override;
bool isColumnInternal(int column) override;
From 0f635b6ca904b0bde0afa86ddc54fd73cde0ec58 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 24 Apr 2018 22:36:02 +0200
Subject: [PATCH 2/6] Reword comment
---
src/library/baseexternaltrackmodel.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/library/baseexternaltrackmodel.cpp b/src/library/baseexternaltrackmodel.cpp
index 7f4c00a241..53a66f0c51 100644
--- a/src/library/baseexternaltrackmodel.cpp
+++ b/src/library/baseexternaltrackmodel.cpp
@@ -60,8 +60,9 @@ TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const {
if (pTrack) {
// If this track was not in the Mixxx library it is now added and will be
- // saved with the metadata from iTunes. If it was already in the library
- // then we do not touch it so that we do not over-write the user's metadata.
+ // saved with the metadata from external library. If it was already in the
+ // Mixxx library then we do not touch it so that we do not over-write the
+ // user's metadata.
if (!track_already_in_library) {
pTrack->setArtist(artist);
pTrack->setTitle(title);
From 1dc6401178d912ee9bdbab2fa1cae735b3f4ad16 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 24 Apr 2018 15:31:44 +0200
Subject: [PATCH 3/6] Delete unused member function
---
src/library/dao/trackdao.cpp | 8 --------
src/library/dao/trackdao.h | 2 --
2 files changed, 10 deletions(-)
diff --git a/src/library/dao/trackdao.cpp b/src/library/dao/trackdao.cpp
index 4ecadc0eb5..5316da2e40 100644
--- a/src/library/dao/trackdao.cpp
+++ b/src/library/dao/trackdao.cpp
@@ -179,14 +179,6 @@ QString TrackDAO::getTrackLocation(TrackId trackId) {
return trackLocation;
}
-/** Check if a track exists in the library table already.
- @param file_location The full path to the track on disk, including the filename.
- @return true if the track is found in the library table, false otherwise.
-*/
-bool TrackDAO::trackExistsInDatabase(const QString& absoluteFilePath) {
- return getTrackId(absoluteFilePath).isValid();
-}
-
void TrackDAO::saveTrack(Track* pTrack) {
DEBUG_ASSERT(pTrack);
if (pTrack->isDirty()) {
diff --git a/src/library/dao/trackdao.h b/src/library/dao/trackdao.h
index 7c33fe269c..9a911f889e 100644
--- a/src/library/dao/trackdao.h
+++ b/src/library/dao/trackdao.h
@@ -43,8 +43,6 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
QList<TrackId> getTrackIds(const QList<QFileInfo>& files);
QList<TrackId> getTrackIds(const QDir& dir);
- bool trackExistsInDatabase(const QString& absoluteFilePath);
-
// WARNING: Only call this from the main thread instance of TrackDAO.
TrackPointer getTrack(TrackId trackId) const;
From d6b7e12d72516152d7f01758331304ba075f2eeb Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 24 Apr 2018 15:38:56 +0200
Subject: [PATCH 4/6] Hide internal utility function
---
src/library/dao/trackdao.cpp | 33 +++++++++++++++++++--------------
src/library/dao/trackdao.h | 1 -
2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/src/library/dao/trackdao.cpp b/src/library/dao/trackdao.cpp
index 5316da2e40..161eed8c28 100644
--- a/src/library/dao/trackdao.cpp
+++ b/src/library/dao/trackdao.cpp
@@ -36,8 +36,26 @@
#include "util/timer.h"
#include "util/math.h"
+
+namespace {
+
enum { UndefinedRecordIndex = -2 };
+void markTrackLocationsAsDeleted(QSqlDatabase database, const QString& directory) {
+ //qDebug() << "TrackDAO::markTrackLocationsAsDeleted" << QThread::currentThread() << m_database.connectionName();
+ QSqlQuery query(database);
+ query.prepare("UPDATE track_locations "
+ "SET fs_deleted=1 "
+ "WHERE directory=:directory");
+ query.bindValue(":directory", directory);
+ if (!query.exec()) {
+ LOG_FAILED_QUERY(query)
+ << "Couldn't mark tracks in" << directory << "as deleted.";
+ }
+}
+
+} // anonymous namespace
+
TrackDAO::TrackDAO(CueDAO& cueDao,
PlaylistDAO& playlistDao,
AnalysisDao& analysisDao,
@@ -84,7 +102,7 @@ void TrackDAO::finish() {
// directories as deleted.
// TODO(XXX) This doesn't handle sub-directories of deleted directories.
for (const auto& dir: deletedHashDirs) {
- markTrackLocationsAsDeleted(dir);
+ markTrackLocationsAsDeleted(m_database, dir);
}
transaction.commit();
}
@@ -1502,19 +1520,6 @@ void TrackDAO::markUnverifiedTracksAsDeleted() {
}
}
-void TrackDAO::markTrackLocationsAsDeleted(const QString& directory) {
- //qDebug() << "TrackDAO::markTrackLocationsAsDeleted" << QThread::currentThread() << m_database.connectionName();
- QSqlQuery query(m_database);
- query.prepare("UPDATE track_locations "
- "SET fs_deleted=1 "
- "WHERE directory=:directory");
- query.bindValue(":directory", directory);
- if (!query.exec()) {
- LOG_FAILED_QUERY(query)
- << "Couldn't mark tracks in" << directory << "as deleted.";
- }
-}
-
// Look for moved files. Look for files that have been marked as
// "deleted on disk" and see if another "file" with the same name and
// files size exists in the track_locations table. That means the file has
diff --git a/src/library/dao/trackdao.h b/src/library/dao/trackdao.h
index 9a911f889e..f3ce490cca 100644
--- a/src/library/dao/trackdao.h
+++ b/src/library/dao/trackdao.h
@@ -90,7 +90,6 @@ class TrackDAO : public QObject, public virtual DAO, public virtual GlobalTrackC
void markTracksInDirectoriesAsVerified(const QStringList& directories);
void invalidateTrackLocationsInLibrary();
void markUnverifiedTracksAsDeleted();
- void markTrackLocationsAsDeleted(const QString& directory);
bool detectMovedTracks(QSet<TrackId>* pTracksMovedSetOld,
QSet<TrackId>* pTracksMovedSetNew,
const QStringList& addedTracks,
From e7ee1e507f9010a869c60e7e706094e6458fd5d7 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 25 Apr 2018 00:56:19 +0200
Subject: [PATCH 5/6] Improve error handling and logging when loading/adding
tracks
---
src/library/dao/trackdao.cpp | 50 +++++++++++++++++++++++++-------------------
1 file changed, 29 insertions(+), 21 deletions(-)
diff --git a/src/library/dao/trackdao.cpp b/src/library/dao/trackdao.cpp
index 161eed8c28..06f1cae3cf 100644
--- a/src/library/dao/trackdao.cpp
+++ b/src/library/dao/trackdao.cpp
@@ -121,6 +121,8 @@ TrackId TrackDAO::getTrackId(const QString& absoluteFilePath) {
if (query.exec()) {
if (query.next()) {
trackId = TrackId(query.value(query.record().indexOf("id")));
+ } else {
+ qDebug() << "TrackDAO::getTrackId(): Track location not found in library:" << absoluteFilePath;
}
} else {
LOG_FAILED_QUERY(query);
@@ -151,6 +153,10 @@ QList<TrackId> TrackDAO::getTrackIds(const QList<QFileInfo>& files) {
while (query.next()) {
trackIds.append(TrackId(query.value(idColumn)));
}
+ DEBUG_ASSERT(trackIds.size() <= files.size());
+ if (trackIds.size() < files.size()) {
+ qDebug() << "TrackDAO::getTrackIds(): Found only" << trackIds.size() << "of" << files.size() << "tracks in library";
+ }
} else {
LOG_FAILED_QUERY(query);
}
@@ -1904,36 +1910,38 @@ void TrackDAO::detectCoverArtForTracksWithoutCover(volatile const bool* pCancel,
TrackPointer TrackDAO::getOrAddTrack(const QString& trackLocation,
bool processCoverArt,
bool* pAlreadyInLibrary) {
- const TrackId trackId(getTrackId(trackLocation));
+ const TrackId trackId = getTrackId(trackLocation);
const bool trackAlreadyInLibrary = trackId.isValid();
+ if (pAlreadyInLibrary) {
+ *pAlreadyInLibrary = trackAlreadyInLibrary;
+ }
TrackPointer pTrack;
if (trackAlreadyInLibrary) {
pTrack = getTrack(trackId);
+ if (!pTrack) {
+ qWarning() << "Failed to load track"
+ << trackLocation;
+ return pTrack;
+ }
} else {
// Add Track to library -- unremove if it was previously removed.
pTrack = addSingleTrack(trackLocation, true);
- }
-
- // addTrack or getTrack may fail.
- if (!pTrack) {
- qWarning() << "Failed to load track"
- << trackLocation;
- return pTrack;
- }
-
- // If the track wasn't in the library already then it has not yet been
- // checked for cover art. If processCoverArt is true then we should request
- // cover processing via CoverArtCache asynchronously.
- if (processCoverArt && !trackAlreadyInLibrary) {
- CoverArtCache* pCache = CoverArtCache::instance();
- if (pCache != nullptr) {
- pCache->requestGuessCover(pTrack);
+ if (!pTrack) {
+ qWarning() << "Failed to add track"
+ << trackLocation;
+ return pTrack;
+ }
+ DEBUG_ASSERT(pTrack);
+ // If the track wasn't in the library already then it has not yet been
+ // checked for cover art. If processCoverArt is true then we should request
+ // cover processing via CoverArtCache asynchronously.
+ if (processCoverArt) {
+ CoverArtCache* pCache = CoverArtCache::instance();
+ if (pCache != nullptr) {
+ pCache->requestGuessCover(pTrack);
+ }
}
- }
-
- if (pAlreadyInLibrary != nullptr) {
- *pAlreadyInLibrary = trackAlreadyInLibrary;
}
return pTrack;
From 5f8659db2c1ecb1661577ea16c9c316bbaf670ff Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Thu, 26 Apr 2018 00:26:32 +0200
Subject: [PATCH 6/6] Extenals libraries: Convert native to canonical location
---
src/library/baseexternalplaylistmodel.cpp | 6 ++++--
src/library/baseexternaltrackmodel.cpp | 6 ++++--
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/library/baseexternalplaylistmodel.cpp b/src/library/baseexternalplaylistmodel.cpp
index 731c742368..7529523896 100644
--- a/src/library/baseexternalplaylistmodel.cpp
+++ b/src/library/baseexternalplaylistmodel.cpp
@@ -21,8 +21,9 @@ BaseExternalPlaylistModel::~BaseExternalPlaylistModel() {
}
TrackPointer BaseExternalPlaylistModel::getTrack(const QModelIndex& index) const {
- QString location = index.sibling(
+ QString nativeLocation = index.sibling(
index.row(), fieldIndex("location")).data().toString();
+ QString location = QDir::fromNativeSeparators(nativeLocation);
if (location.isEmpty()) {
// Track is lost
@@ -150,7 +151,8 @@ void BaseExternalPlaylistModel::trackLoaded(QString group, TrackPointer pTrack)
// The external table has foreign Track IDs, so we need to compare
// by location
for (int row = 0; row < rowCount(); ++row) {
- QString location = index(row, fieldIndex("location")).data().toString();
+ QString nativeLocation = index(row, fieldIndex("location")).data().toString();
+ QString location = QDir::fromNativeSeparators(nativeLocation);
if (location == pTrack->getLocation()) {
m_previewDeckTrackId = TrackId(index(row, 0).data());
//Debug() << "foreign track id" << m_previewDeckTrackId;
diff --git a/src/library/baseexternaltrackmodel.cpp b/src/library/baseexternaltrackmodel.cpp
index 53a66f0c51..3dfd3df083 100644
--- a/src/library/baseexternaltrackmodel.cpp
+++ b/src/library/baseexternaltrackmodel.cpp
@@ -47,7 +47,8 @@ TrackPointer BaseExternalTrackModel::getTrack(const QModelIndex& index) const {
QString genre = index.sibling(index.row(), fieldIndex("genre")).data().toString();
float bpm = index.sibling(index.row(), fieldIndex("bpm")).data().toString().toFloat();
- QString location = index.sibling(index.row(), fieldIndex("location")).data().toString();
+ QString nativeLocation = index.sibling(index.row(), fieldIndex("location")).data().toString();
+ QString location = QDir::fromNativeSeparators(nativeLocation);
if (location.isEmpty()) {
// Track is lost
@@ -104,7 +105,8 @@ void BaseExternalTrackModel::trackLoaded(QString group, TrackPointer pTrack) {
// The external table has foreign Track IDs, so we need to compare
// by location
for (int row = 0; row < rowCount(); ++row) {
- QString location = index(row, fieldIndex("location")).data().toString();
+ QString nativeLocation = index(row, fieldIndex("location")).data().toString();
+ QString location = QDir::fromNativeSeparators(nativeLocation);
if (location == pTrack->getLocation()) {
m_previewDeckTrackId = TrackId(index(row, 0).data());
//qDebug() << "foreign track id" << m_previewDeckTrackId;

View File

@@ -1,58 +0,0 @@
From 17f3ef6bea533b4d6e90419bf0346607c73db353 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 16 Apr 2018 07:23:37 +0200
Subject: [PATCH 1/2] Fix invocation args of pasuspender
---
res/linux/mixxx.desktop | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/res/linux/mixxx.desktop b/res/linux/mixxx.desktop
index 14c967c286..5e1ff650b0 100644
--- a/res/linux/mixxx.desktop
+++ b/res/linux/mixxx.desktop
@@ -8,7 +8,7 @@ GenericName[fr]=Interface numérique pour DJ
Comment=A digital DJ interface
Comment[de]=Ein digitales DJ-System
Comment[fr]=Une interface numérique pour DJ
-Exec=sh -c "pasuspender mixxx || mixxx"
+Exec=sh -c "pasuspender -- mixxx || mixxx"
Terminal=false
Icon=mixxx-icon
Type=Application
From 271432773dae5e8d860106ba3dbe5b1757797471 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 16 Apr 2018 12:03:38 +0200
Subject: [PATCH 2/2] Fix remaining invocations with of pasuspender
---
build/debian/menu | 2 +-
build/debian/mixxx.desktop | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/build/debian/menu b/build/debian/menu
index c945aa3d19..b1ff680748 100644
--- a/build/debian/menu
+++ b/build/debian/menu
@@ -2,6 +2,6 @@
needs="X11" \
section="Apps/Sound" \
title="Mixxx" \
- command="/usr/bin/pasuspender /usr/bin/mixxx" \
+ command="/usr/bin/pasuspender -- /usr/bin/mixxx" \
icon="/usr/share/pixmaps/mixxx.xpm" \
icon16x16="/usr/share/pixmaps/mixxx-16.xpm"
diff --git a/build/debian/mixxx.desktop b/build/debian/mixxx.desktop
index 45323b5c15..947ef82a20 100644
--- a/build/debian/mixxx.desktop
+++ b/build/debian/mixxx.desktop
@@ -3,7 +3,7 @@ Version=1.0
Name=Mixxx
GenericName=Digital DJ interface
Comment=A digital DJ interface
-Exec=pasuspender mixxx
+Exec=pasuspender -- mixxx
Terminal=false
Icon=mixxx-icon
Type=Application

View File

@@ -1,197 +0,0 @@
From b20028cd25e0934cf1b5e03f38ff7b82ee1762de Mon Sep 17 00:00:00 2001
From: Stefan <nopeppermint@users.noreply.github.com>
Date: Sun, 22 Apr 2018 10:27:36 +0200
Subject: [PATCH] Latenight: group FX Buttons
---
res/skins/LateNight/deck_row_1_keyVinylFx.xml | 173 +++++++++++++-------------
1 file changed, 89 insertions(+), 84 deletions(-)
diff --git a/res/skins/LateNight/deck_row_1_keyVinylFx.xml b/res/skins/LateNight/deck_row_1_keyVinylFx.xml
index 52694d05c6..fe6d76de11 100644
--- a/res/skins/LateNight/deck_row_1_keyVinylFx.xml
+++ b/res/skins/LateNight/deck_row_1_keyVinylFx.xml
@@ -99,94 +99,99 @@
<SizePolicy>min,min</SizePolicy>
<Children></Children>
</WidgetGroup>
-
- <!-- FX buttons 1-4 -->
- <PushButton>
- <Size>30f,22f</Size>
- <TooltipId>EffectUnit_deck_enabled</TooltipId>
- <ObjectName>FxAssignButton</ObjectName>
- <NumberStates>2</NumberStates>
- <State>
- <Number>0</Number>
- <Text>FX&#8202;1</Text>
- </State>
- <State>
- <Number>1</Number>
- <Text>FX&#8202;1</Text>
- </State>
- <Connection>
- <ConfigKey>[EffectRack1_EffectUnit1],group_<Variable name="group"/>_enable</ConfigKey>
- <ButtonState>LeftButton</ButtonState>
- </Connection>
- </PushButton>
-
- <PushButton>
- <Size>30f,22f</Size>
- <TooltipId>EffectUnit_deck_enabled</TooltipId>
- <ObjectName>FxAssignButton</ObjectName>
- <NumberStates>2</NumberStates>
- <State>
- <Number>0</Number>
- <Text>FX&#8202;2</Text>
- </State>
- <State>
- <Number>1</Number>
- <Text>FX&#8202;2</Text>
- </State>
- <Connection>
- <ConfigKey>[EffectRack1_EffectUnit2],group_<Variable name="group"/>_enable</ConfigKey>
- <ButtonState>LeftButton</ButtonState>
- </Connection>
- </PushButton>
-
+
<WidgetGroup>
<Layout>horizontal</Layout>
- <Connection>
- <ConfigKey>[Master],show_4effectunits</ConfigKey>
- <BindProperty>visible</BindProperty>
- </Connection>
- <Children>
- <PushButton>
- <Size>30f,22f</Size>
- <TooltipId>EffectUnit_deck_enabled</TooltipId>
- <ObjectName>FxAssignButton</ObjectName>
- <NumberStates>2</NumberStates>
- <State>
- <Number>0</Number>
- <Text>FX&#8202;3</Text>
- </State>
- <State>
- <Number>1</Number>
- <Text>FX&#8202;3</Text>
- </State>
- <Connection>
- <ConfigKey>[EffectRack1_EffectUnit3],group_<Variable name="group"/>_enable</ConfigKey>
- <ButtonState>LeftButton</ButtonState>
- </Connection>
- </PushButton>
+ <ObjectName>AlignRightTop</ObjectName>
+ <Children>
+ <!-- FX buttons 1-4 -->
+ <PushButton>
+ <Size>30f,22f</Size>
+ <TooltipId>EffectUnit_deck_enabled</TooltipId>
+ <ObjectName>FxAssignButton</ObjectName>
+ <NumberStates>2</NumberStates>
+ <State>
+ <Number>0</Number>
+ <Text>FX&#8202;1</Text>
+ </State>
+ <State>
+ <Number>1</Number>
+ <Text>FX&#8202;1</Text>
+ </State>
+ <Connection>
+ <ConfigKey>[EffectRack1_EffectUnit1],group_<Variable name="group"/>_enable</ConfigKey>
+ <ButtonState>LeftButton</ButtonState>
+ </Connection>
+ </PushButton>
- <PushButton>
- <Size>30f,22f</Size>
- <TooltipId>EffectUnit_deck_enabled</TooltipId>
- <ObjectName>FxAssignButton</ObjectName>
- <NumberStates>2</NumberStates>
- <State>
- <Number>0</Number>
- <Text>FX&#8202;4</Text>
- </State>
- <State>
- <Number>1</Number>
- <Text>FX&#8202;4</Text>
- </State>
- <Connection>
- <ConfigKey>[EffectRack1_EffectUnit4],group_<Variable name="group"/>_enable</ConfigKey>
- <ButtonState>LeftButton</ButtonState>
- </Connection>
- </PushButton>
- </Children>
- </WidgetGroup>
- <!-- /FX buttons 1-4 -->
+ <PushButton>
+ <Size>30f,22f</Size>
+ <TooltipId>EffectUnit_deck_enabled</TooltipId>
+ <ObjectName>FxAssignButton</ObjectName>
+ <NumberStates>2</NumberStates>
+ <State>
+ <Number>0</Number>
+ <Text>FX&#8202;2</Text>
+ </State>
+ <State>
+ <Number>1</Number>
+ <Text>FX&#8202;2</Text>
+ </State>
+ <Connection>
+ <ConfigKey>[EffectRack1_EffectUnit2],group_<Variable name="group"/>_enable</ConfigKey>
+ <ButtonState>LeftButton</ButtonState>
+ </Connection>
+ </PushButton>
+
+ <WidgetGroup>
+ <Layout>horizontal</Layout>
+ <Connection>
+ <ConfigKey>[Master],show_4effectunits</ConfigKey>
+ <BindProperty>visible</BindProperty>
+ </Connection>
+ <Children>
+ <PushButton>
+ <Size>30f,22f</Size>
+ <TooltipId>EffectUnit_deck_enabled</TooltipId>
+ <ObjectName>FxAssignButton</ObjectName>
+ <NumberStates>2</NumberStates>
+ <State>
+ <Number>0</Number>
+ <Text>FX&#8202;3</Text>
+ </State>
+ <State>
+ <Number>1</Number>
+ <Text>FX&#8202;3</Text>
+ </State>
+ <Connection>
+ <ConfigKey>[EffectRack1_EffectUnit3],group_<Variable name="group"/>_enable</ConfigKey>
+ <ButtonState>LeftButton</ButtonState>
+ </Connection>
+ </PushButton>
+ <PushButton>
+ <Size>30f,22f</Size>
+ <TooltipId>EffectUnit_deck_enabled</TooltipId>
+ <ObjectName>FxAssignButton</ObjectName>
+ <NumberStates>2</NumberStates>
+ <State>
+ <Number>0</Number>
+ <Text>FX&#8202;4</Text>
+ </State>
+ <State>
+ <Number>1</Number>
+ <Text>FX&#8202;4</Text>
+ </State>
+ <Connection>
+ <ConfigKey>[EffectRack1_EffectUnit4],group_<Variable name="group"/>_enable</ConfigKey>
+ <ButtonState>LeftButton</ButtonState>
+ </Connection>
+ </PushButton>
+ </Children>
+ </WidgetGroup>
+ <!-- /FX buttons 1-4 -->
+ </Children>
+ </WidgetGroup>
</Children>
</WidgetGroup>
</Template>

View File

@@ -1,38 +0,0 @@
From 770220835757f677990c31f4bd95861ca8ef5853 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Thu, 26 Apr 2018 14:43:32 +0200
Subject: [PATCH] Fix memory leak when loading cover art
---
src/library/coverartcache.cpp | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/library/coverartcache.cpp b/src/library/coverartcache.cpp
index eb91411473..e76168422d 100644
--- a/src/library/coverartcache.cpp
+++ b/src/library/coverartcache.cpp
@@ -94,6 +94,7 @@ QPixmap CoverArtCache::requestCover(const CoverInfo& requestInfo,
}
m_runningRequests.insert(requestId);
+ // The watcher will be deleted in coverLoaded()
QFutureWatcher<FutureResult>* watcher = new QFutureWatcher<FutureResult>(this);
QFuture<FutureResult> future = QtConcurrent::run(
this, &CoverArtCache::loadCover, requestInfo, pRequestor,
@@ -146,9 +147,13 @@ CoverArtCache::FutureResult CoverArtCache::loadCover(
// watcher
void CoverArtCache::coverLoaded() {
- QFutureWatcher<FutureResult>* watcher;
- watcher = reinterpret_cast<QFutureWatcher<FutureResult>*>(sender());
- FutureResult res = watcher->result();
+ FutureResult res;
+ {
+ QFutureWatcher<FutureResult>* watcher =
+ static_cast<QFutureWatcher<FutureResult>*>(sender());
+ res = watcher->result();
+ watcher->deleteLater();
+ }
if (sDebug) {
kLogger.debug() << "coverLoaded" << res.cover;

View File

@@ -1,395 +0,0 @@
From 9bf67d08cf32398b05c6bb24dc52c3b9e4cded81 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 17 Apr 2018 15:51:50 +0200
Subject: [PATCH 1/2] Use a default timeout of 250 ms between selection and
activation
---
src/library/baseplaylistfeature.cpp | 8 +-------
src/library/crate/cratefeature.cpp | 4 +---
src/library/libraryfeature.cpp | 13 +++++++++++--
3 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp
index c0506e458d..2cfd68e974 100644
--- a/src/library/baseplaylistfeature.cpp
+++ b/src/library/baseplaylistfeature.cpp
@@ -19,17 +19,11 @@
#include "widget/wlibrarytextbrowser.h"
#include "util/assert.h"
-namespace {
-
-const int kClickedChildActivationTimeoutMillis = 100;
-
-} // anonymous namespace
-
BasePlaylistFeature::BasePlaylistFeature(QObject* parent,
UserSettingsPointer pConfig,
TrackCollection* pTrackCollection,
QString rootViewName)
- : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis, parent),
+ : LibraryFeature(pConfig, parent),
m_pTrackCollection(pTrackCollection),
m_playlistDao(pTrackCollection->getPlaylistDAO()),
m_trackDao(pTrackCollection->getTrackDAO()),
diff --git a/src/library/crate/cratefeature.cpp b/src/library/crate/cratefeature.cpp
index da75522e39..38c09b0eb8 100644
--- a/src/library/crate/cratefeature.cpp
+++ b/src/library/crate/cratefeature.cpp
@@ -29,8 +29,6 @@
namespace {
-const int kClickedChildActivationTimeoutMillis = 100;
-
QString formatLabel(
const CrateSummary& crateSummary) {
return QString("%1 (%2) %3").arg(
@@ -44,7 +42,7 @@ QString formatLabel(
CrateFeature::CrateFeature(Library* pLibrary,
TrackCollection* pTrackCollection,
UserSettingsPointer pConfig)
- : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis),
+ : LibraryFeature(pConfig),
m_cratesIcon(":/images/library/ic_library_crates.png"),
m_lockedCrateIcon(":/images/library/ic_library_locked.png"),
m_pTrackCollection(pTrackCollection),
diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp
index e582557370..701e17a513 100644
--- a/src/library/libraryfeature.cpp
+++ b/src/library/libraryfeature.cpp
@@ -7,10 +7,19 @@
// The reason for this is that LibraryFeature uses slots/signals and for this
// to work the code has to be precompiles by moc
+namespace {
+
+// The time between selecting and activating a feature item in the left
+// pane. This is required to allow smooth and responsive scrolling through
+// a list of items with an encoder!
+const int kDefaultClickedChildActivationTimeoutMillis = 250;
+
+} // anonymous namespace
+
LibraryFeature::LibraryFeature(
QObject *parent)
: QObject(parent),
- m_clickedChildActivationTimeoutMillis(0) {
+ m_clickedChildActivationTimeoutMillis(kDefaultClickedChildActivationTimeoutMillis) {
}
LibraryFeature::LibraryFeature(
@@ -26,7 +35,7 @@ LibraryFeature::LibraryFeature(
QObject* parent)
: QObject(parent),
m_pConfig(pConfig),
- m_clickedChildActivationTimeoutMillis(0) {
+ m_clickedChildActivationTimeoutMillis(kDefaultClickedChildActivationTimeoutMillis) {
}
LibraryFeature::LibraryFeature(
From c10c7be2890d0ede449ca32f25f6614e63db63af Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 17 Apr 2018 20:29:16 +0200
Subject: [PATCH 2/2] Distinguish between mouse and keyboard/encoder events in
sidebar tree
---
src/library/library.cpp | 2 +
src/library/libraryfeature.cpp | 33 +---------------
src/library/libraryfeature.h | 15 +------
src/library/sidebarmodel.cpp | 90 +++++++++++++++++++++++++-----------------
src/library/sidebarmodel.h | 13 +++---
5 files changed, 65 insertions(+), 88 deletions(-)
diff --git a/src/library/library.cpp b/src/library/library.cpp
index 5a22fe9f84..20d447656c 100644
--- a/src/library/library.cpp
+++ b/src/library/library.cpp
@@ -210,6 +210,8 @@ void Library::bindSidebarWidget(WLibrarySidebar* pSidebarWidget) {
connect(m_pSidebarModel, SIGNAL(selectIndex(const QModelIndex&)),
pSidebarWidget, SLOT(selectIndex(const QModelIndex&)));
connect(pSidebarWidget, SIGNAL(pressed(const QModelIndex&)),
+ m_pSidebarModel, SLOT(pressed(const QModelIndex&)));
+ connect(pSidebarWidget, SIGNAL(clicked(const QModelIndex&)),
m_pSidebarModel, SLOT(clicked(const QModelIndex&)));
// Lazy model: Let triangle symbol increment the model
connect(pSidebarWidget, SIGNAL(expanded(const QModelIndex&)),
diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp
index 701e17a513..eb54b28ce7 100644
--- a/src/library/libraryfeature.cpp
+++ b/src/library/libraryfeature.cpp
@@ -7,45 +7,16 @@
// The reason for this is that LibraryFeature uses slots/signals and for this
// to work the code has to be precompiles by moc
-namespace {
-
-// The time between selecting and activating a feature item in the left
-// pane. This is required to allow smooth and responsive scrolling through
-// a list of items with an encoder!
-const int kDefaultClickedChildActivationTimeoutMillis = 250;
-
-} // anonymous namespace
-
-LibraryFeature::LibraryFeature(
- QObject *parent)
- : QObject(parent),
- m_clickedChildActivationTimeoutMillis(kDefaultClickedChildActivationTimeoutMillis) {
-}
-
LibraryFeature::LibraryFeature(
- int clickedChildActivationTimeoutMillis,
QObject *parent)
- : QObject(parent),
- m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
- DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
-}
-
-LibraryFeature::LibraryFeature(
- UserSettingsPointer pConfig,
- QObject* parent)
- : QObject(parent),
- m_pConfig(pConfig),
- m_clickedChildActivationTimeoutMillis(kDefaultClickedChildActivationTimeoutMillis) {
+ : QObject(parent) {
}
LibraryFeature::LibraryFeature(
UserSettingsPointer pConfig,
- int clickedChildActivationTimeoutMillis,
QObject* parent)
: QObject(parent),
- m_pConfig(pConfig),
- m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
- DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
+ m_pConfig(pConfig) {
}
QStringList LibraryFeature::getPlaylistFiles(QFileDialog::FileMode mode) const {
diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h
index 7639e03557..0fe348c89c 100644
--- a/src/library/libraryfeature.h
+++ b/src/library/libraryfeature.h
@@ -30,23 +30,12 @@ class LibraryFeature : public QObject {
Q_OBJECT
public:
explicit LibraryFeature(
- QObject* parent);
- explicit LibraryFeature(
- int clickedChildActivationTimeoutMillis,
- QObject* parent = nullptr);
- explicit LibraryFeature(
- UserSettingsPointer pConfig,
- QObject* parent = nullptr);
+ QObject* parent = nullptr);
explicit LibraryFeature(
UserSettingsPointer pConfig,
- int clickedChildActivationTimeoutMillis,
QObject* parent = nullptr);
~LibraryFeature() override = default;
- int clickedChildActivationTimeoutMillis() const {
- return m_clickedChildActivationTimeoutMillis;
- }
-
virtual QVariant title() = 0;
virtual QIcon getIcon() = 0;
@@ -135,8 +124,6 @@ class LibraryFeature : public QObject {
private:
QStringList getPlaylistFiles(QFileDialog::FileMode mode) const;
-
- const int m_clickedChildActivationTimeoutMillis;
};
#endif /* LIBRARYFEATURE_H */
diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp
index c2bb5d198b..22a93e2165 100644
--- a/src/library/sidebarmodel.cpp
+++ b/src/library/sidebarmodel.cpp
@@ -8,14 +8,23 @@
#include "library/browse/browsefeature.h"
#include "util/assert.h"
+namespace {
+
+// The time between selecting and activating (= clicking) a feature item
+// in the sidebar tree. This is essential to allow smooth scrolling through
+// a list of items with an encoder or the keyboard! A value of 300 ms has
+// been chosen as a compromise between usability and responsiveness.
+const int kPressedUntilClickedTimeoutMillis = 300;
+
+} // anonymous namespace
+
SidebarModel::SidebarModel(
QObject* parent)
: QAbstractItemModel(parent),
m_iDefaultSelectedIndex(0),
- m_clickedChildActivationTimer(new QTimer(this)),
- m_clickedFeature(nullptr) {
- m_clickedChildActivationTimer->setSingleShot(true);
- connect(m_clickedChildActivationTimer, SIGNAL(timeout()), this, SLOT(slotActivateChildAtClickedFeatureIndex()));
+ m_pressedUntilClickedTimer(new QTimer(this)) {
+ m_pressedUntilClickedTimer->setSingleShot(true);
+ connect(m_pressedUntilClickedTimer, SIGNAL(timeout()), this, SLOT(slotPressedUntilClickedTimeout()));
}
void SidebarModel::addLibraryFeature(LibraryFeature* feature) {
@@ -222,62 +231,72 @@ QVariant SidebarModel::data(const QModelIndex& index, int role) const {
return QVariant();
}
-void SidebarModel::onFeatureIndexClicked(
- LibraryFeature* feature,
- QModelIndex index) {
- m_clickedChildActivationTimer->stop();
- m_clickedFeature = feature;
- m_clickedIndex = index;
+void SidebarModel::startPressedUntilClickedTimer(QModelIndex pressedIndex) {
+ m_pressedIndex = pressedIndex;
+ m_pressedUntilClickedTimer->start(kPressedUntilClickedTimeoutMillis);
}
-void SidebarModel::slotActivateChildAtClickedFeatureIndex() {
- if (m_clickedFeature) {
- m_clickedFeature->activateChild(m_clickedIndex);
- }
+void SidebarModel::stopPressedUntilClickedTimer() {
+ m_pressedUntilClickedTimer->stop();
+ m_pressedIndex = QModelIndex();
}
-void SidebarModel::clicked(const QModelIndex& index) {
- //qDebug() << "SidebarModel::clicked() index=" << index;
+void SidebarModel::slotPressedUntilClickedTimeout() {
+ if (m_pressedIndex.isValid()) {
+ QModelIndex clickedIndex = m_pressedIndex;
+ stopPressedUntilClickedTimer();
+ clicked(clickedIndex);
+ }
+}
- // We use clicked() for keyboard and mouse control, and the
- // following code breaks that for us:
- /*if (QApplication::mouseButtons() != Qt::LeftButton) {
- return;
- }*/
+void SidebarModel::pressed(const QModelIndex& index) {
+ stopPressedUntilClickedTimer();
+ if (index.isValid()) {
+ if (index.internalPointer() == this) {
+ m_sFeatures[index.row()]->activate();
+ } else {
+ startPressedUntilClickedTimer(index);
+ }
+ }
+}
+void SidebarModel::clicked(const QModelIndex& index) {
+ // When triggered by a mouse event pressed() has been
+ // invoked immediately before. That doesn't matter,
+ // because we stop any running timer before handling
+ // this event.
+ stopPressedUntilClickedTimer();
if (index.isValid()) {
if (index.internalPointer() == this) {
m_sFeatures[index.row()]->activate();
} else {
- TreeItem* tree_item = (TreeItem*)index.internalPointer();
+ TreeItem* tree_item = static_cast<TreeItem*>(index.internalPointer());
if (tree_item) {
- onFeatureIndexClicked(tree_item->feature(), index);
- DEBUG_ASSERT(m_clickedFeature);
- // Deferred activation is required for smooth scrolling when using
- // encoder knobs
- m_clickedChildActivationTimer->start(
- m_clickedFeature->clickedChildActivationTimeoutMillis());
+ LibraryFeature* feature = tree_item->feature();
+ DEBUG_ASSERT(feature);
+ feature->activateChild(index);
}
}
}
}
+
void SidebarModel::doubleClicked(const QModelIndex& index) {
+ stopPressedUntilClickedTimer();
if (index.isValid()) {
if (index.internalPointer() == this) {
return;
} else {
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- onFeatureIndexClicked(tree_item->feature(), index);
- DEBUG_ASSERT(m_clickedFeature);
- m_clickedFeature->onLazyChildExpandation(m_clickedIndex);
+ LibraryFeature* feature = tree_item->feature();
+ feature->onLazyChildExpandation(index);
}
}
}
}
void SidebarModel::rightClicked(const QPoint& globalPos, const QModelIndex& index) {
- //qDebug() << "SidebarModel::rightClicked() index=" << index;
+ stopPressedUntilClickedTimer();
if (index.isValid()) {
if (index.internalPointer() == this) {
m_sFeatures[index.row()]->activate();
@@ -287,10 +306,9 @@ void SidebarModel::rightClicked(const QPoint& globalPos, const QModelIndex& inde
{
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- onFeatureIndexClicked(tree_item->feature(), index);
- DEBUG_ASSERT(m_clickedFeature);
- m_clickedFeature->activateChild(m_clickedIndex);
- m_clickedFeature->onRightClickChild(globalPos, m_clickedIndex);
+ LibraryFeature* feature = tree_item->feature();
+ feature->activateChild(index);
+ feature->onRightClickChild(globalPos, index);
}
}
}
diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h
index 17c3bb8cae..3dc4891ed3 100644
--- a/src/library/sidebarmodel.h
+++ b/src/library/sidebarmodel.h
@@ -38,6 +38,7 @@ class SidebarModel : public QAbstractItemModel {
bool hasTrackTable(const QModelIndex& index) const;
public slots:
+ void pressed(const QModelIndex& index);
void clicked(const QModelIndex& index);
void doubleClicked(const QModelIndex& index);
void rightClicked(const QPoint& globalPos, const QModelIndex& index);
@@ -67,7 +68,7 @@ class SidebarModel : public QAbstractItemModel {
void selectIndex(const QModelIndex& index);
private slots:
- void slotActivateChildAtClickedFeatureIndex();
+ void slotPressedUntilClickedTimeout();
private:
QModelIndex translateSourceIndex(const QModelIndex& parent);
@@ -75,13 +76,11 @@ class SidebarModel : public QAbstractItemModel {
QList<LibraryFeature*> m_sFeatures;
unsigned int m_iDefaultSelectedIndex; /** Index of the item in the sidebar model to select at startup. */
- QTimer* const m_clickedChildActivationTimer;
- LibraryFeature* m_clickedFeature;
- QModelIndex m_clickedIndex;
+ QTimer* const m_pressedUntilClickedTimer;
+ QModelIndex m_pressedIndex;
- void onFeatureIndexClicked(
- LibraryFeature* feature,
- QModelIndex index);
+ void startPressedUntilClickedTimer(QModelIndex pressedIndex);
+ void stopPressedUntilClickedTimer();
};
#endif /* SIDEBARMODEL_H */

View File

@@ -1,51 +0,0 @@
From dcf6f17012d95c70df50446222e43772dac4dc52 Mon Sep 17 00:00:00 2001
From: Fayaaz Ahmed <fayaaz@users.noreply.github.com>
Date: Mon, 23 Apr 2018 23:31:47 +0100
Subject: [PATCH 1/2] Fix Traktor S4 MK2 for windows
---
res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js b/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
index f4689659f9..de05f5eeee 100644
--- a/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
+++ b/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
@@ -790,7 +790,11 @@ TraktorS4MK2.incomingData = function(data, length) {
this.partial_packet = Object();
return;
}
-
+ if (length == 79) {
+ // Windows seems to get the packet of length 79, so parse as one:
+ TraktorS4MK2.controller.parsePacket(data, data.length);
+ return;
+ }
HIDDebug("Traktor S4MK2: Unhandled packet size: " + length);
}
From e4161f90f37ad1bb2c5f23fa388c198c2bef733e Mon Sep 17 00:00:00 2001
From: Fayaaz Ahmed <fayaaz@users.noreply.github.com>
Date: Mon, 23 Apr 2018 23:34:59 +0100
Subject: [PATCH 2/2] Update Traktor-Kontrol-S4-MK2-hid-scripts.js
---
res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js b/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
index de05f5eeee..8cd0b85406 100644
--- a/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
+++ b/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js
@@ -791,8 +791,8 @@ TraktorS4MK2.incomingData = function(data, length) {
return;
}
if (length == 79) {
- // Windows seems to get the packet of length 79, so parse as one:
- TraktorS4MK2.controller.parsePacket(data, data.length);
+ // Windows seems to get the packet of length 79, so parse as one:
+ TraktorS4MK2.controller.parsePacket(data, data.length);
return;
}
HIDDebug("Traktor S4MK2: Unhandled packet size: " + length);

View File

@@ -1,25 +0,0 @@
From c6564afc8e3252e73f6c7e85fa6ae25a8abd124f Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Fri, 20 Apr 2018 13:22:26 -0700
Subject: [PATCH] Revert 2b612c2, fix spinback inertia effect for wheeled
controllers that use the same wheel to jog when not touched on top. e.g.
American Audio VMS4, EKS Otus
---
src/controllers/controllerengine.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/controllers/controllerengine.cpp b/src/controllers/controllerengine.cpp
index c8e34a6022..509cc14a74 100644
--- a/src/controllers/controllerengine.cpp
+++ b/src/controllers/controllerengine.cpp
@@ -1379,8 +1379,7 @@ void ControllerEngine::scratchDisable(int deck, bool ramp) {
bool ControllerEngine::isScratching(int deck) {
// PlayerManager::groupForDeck is 0-indexed.
QString group = PlayerManager::groupForDeck(deck - 1);
- // Don't report that we are scratching if we're ramping.
- return getValue(group, "scratch2_enable") > 0 && !m_ramp[deck];
+ return getValue(group, "scratch2_enable") > 0;
}
/* -------- ------------------------------------------------------

View File

@@ -1,281 +0,0 @@
From 360f9881848ebba244338101fdf3e47e45e9ece8 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 17 Apr 2018 00:31:42 +0200
Subject: [PATCH] Fix unresponsive scrolling through crates & playlists with
encoder
---
src/library/baseplaylistfeature.cpp | 8 ++++++-
src/library/crate/cratefeature.cpp | 4 +++-
src/library/libraryfeature.cpp | 29 +++++++++++++++++++----
src/library/libraryfeature.h | 21 +++++++++++++----
src/library/sidebarmodel.cpp | 47 +++++++++++++++++++++++++++----------
src/library/sidebarmodel.h | 17 ++++++++++++--
6 files changed, 100 insertions(+), 26 deletions(-)
diff --git a/src/library/baseplaylistfeature.cpp b/src/library/baseplaylistfeature.cpp
index 2cfd68e974..c0506e458d 100644
--- a/src/library/baseplaylistfeature.cpp
+++ b/src/library/baseplaylistfeature.cpp
@@ -19,11 +19,17 @@
#include "widget/wlibrarytextbrowser.h"
#include "util/assert.h"
+namespace {
+
+const int kClickedChildActivationTimeoutMillis = 100;
+
+} // anonymous namespace
+
BasePlaylistFeature::BasePlaylistFeature(QObject* parent,
UserSettingsPointer pConfig,
TrackCollection* pTrackCollection,
QString rootViewName)
- : LibraryFeature(pConfig, parent),
+ : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis, parent),
m_pTrackCollection(pTrackCollection),
m_playlistDao(pTrackCollection->getPlaylistDAO()),
m_trackDao(pTrackCollection->getTrackDAO()),
diff --git a/src/library/crate/cratefeature.cpp b/src/library/crate/cratefeature.cpp
index 38c09b0eb8..da75522e39 100644
--- a/src/library/crate/cratefeature.cpp
+++ b/src/library/crate/cratefeature.cpp
@@ -29,6 +29,8 @@
namespace {
+const int kClickedChildActivationTimeoutMillis = 100;
+
QString formatLabel(
const CrateSummary& crateSummary) {
return QString("%1 (%2) %3").arg(
@@ -42,7 +44,7 @@ QString formatLabel(
CrateFeature::CrateFeature(Library* pLibrary,
TrackCollection* pTrackCollection,
UserSettingsPointer pConfig)
- : LibraryFeature(pConfig),
+ : LibraryFeature(pConfig, kClickedChildActivationTimeoutMillis),
m_cratesIcon(":/images/library/ic_library_crates.png"),
m_lockedCrateIcon(":/images/library/ic_library_locked.png"),
m_pTrackCollection(pTrackCollection),
diff --git a/src/library/libraryfeature.cpp b/src/library/libraryfeature.cpp
index efe20d2e9d..e582557370 100644
--- a/src/library/libraryfeature.cpp
+++ b/src/library/libraryfeature.cpp
@@ -6,18 +6,37 @@
// KEEP THIS cpp file to tell scons that moc should be called on the class!!!
// The reason for this is that LibraryFeature uses slots/signals and for this
// to work the code has to be precompiles by moc
-LibraryFeature::LibraryFeature(QObject *parent)
- : QObject(parent) {
+LibraryFeature::LibraryFeature(
+ QObject *parent)
+ : QObject(parent),
+ m_clickedChildActivationTimeoutMillis(0) {
}
-LibraryFeature::LibraryFeature(UserSettingsPointer pConfig, QObject* parent)
+LibraryFeature::LibraryFeature(
+ int clickedChildActivationTimeoutMillis,
+ QObject *parent)
: QObject(parent),
- m_pConfig(pConfig) {
+ m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
+ DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
}
-LibraryFeature::~LibraryFeature() {
+LibraryFeature::LibraryFeature(
+ UserSettingsPointer pConfig,
+ QObject* parent)
+ : QObject(parent),
+ m_pConfig(pConfig),
+ m_clickedChildActivationTimeoutMillis(0) {
+}
+LibraryFeature::LibraryFeature(
+ UserSettingsPointer pConfig,
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent)
+ : QObject(parent),
+ m_pConfig(pConfig),
+ m_clickedChildActivationTimeoutMillis(clickedChildActivationTimeoutMillis) {
+ DEBUG_ASSERT(m_clickedChildActivationTimeoutMillis >= 0);
}
QStringList LibraryFeature::getPlaylistFiles(QFileDialog::FileMode mode) const {
diff --git a/src/library/libraryfeature.h b/src/library/libraryfeature.h
index 138d96c1aa..7639e03557 100644
--- a/src/library/libraryfeature.h
+++ b/src/library/libraryfeature.h
@@ -29,11 +29,23 @@ class KeyboardEventFilter;
class LibraryFeature : public QObject {
Q_OBJECT
public:
- LibraryFeature(QObject* parent = NULL);
+ explicit LibraryFeature(
+ QObject* parent);
+ explicit LibraryFeature(
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent = nullptr);
+ explicit LibraryFeature(
+ UserSettingsPointer pConfig,
+ QObject* parent = nullptr);
+ explicit LibraryFeature(
+ UserSettingsPointer pConfig,
+ int clickedChildActivationTimeoutMillis,
+ QObject* parent = nullptr);
+ ~LibraryFeature() override = default;
- LibraryFeature(UserSettingsPointer pConfig,
- QObject* parent = NULL);
- virtual ~LibraryFeature();
+ int clickedChildActivationTimeoutMillis() const {
+ return m_clickedChildActivationTimeoutMillis;
+ }
virtual QVariant title() = 0;
virtual QIcon getIcon() = 0;
@@ -124,6 +136,7 @@ class LibraryFeature : public QObject {
private:
QStringList getPlaylistFiles(QFileDialog::FileMode mode) const;
+ const int m_clickedChildActivationTimeoutMillis;
};
#endif /* LIBRARYFEATURE_H */
diff --git a/src/library/sidebarmodel.cpp b/src/library/sidebarmodel.cpp
index e0943bb40f..c2bb5d198b 100644
--- a/src/library/sidebarmodel.cpp
+++ b/src/library/sidebarmodel.cpp
@@ -8,13 +8,14 @@
#include "library/browse/browsefeature.h"
#include "util/assert.h"
-SidebarModel::SidebarModel(QObject* parent)
+SidebarModel::SidebarModel(
+ QObject* parent)
: QAbstractItemModel(parent),
- m_iDefaultSelectedIndex(0) {
-}
-
-SidebarModel::~SidebarModel() {
-
+ m_iDefaultSelectedIndex(0),
+ m_clickedChildActivationTimer(new QTimer(this)),
+ m_clickedFeature(nullptr) {
+ m_clickedChildActivationTimer->setSingleShot(true);
+ connect(m_clickedChildActivationTimer, SIGNAL(timeout()), this, SLOT(slotActivateChildAtClickedFeatureIndex()));
}
void SidebarModel::addLibraryFeature(LibraryFeature* feature) {
@@ -221,6 +222,20 @@ QVariant SidebarModel::data(const QModelIndex& index, int role) const {
return QVariant();
}
+void SidebarModel::onFeatureIndexClicked(
+ LibraryFeature* feature,
+ QModelIndex index) {
+ m_clickedChildActivationTimer->stop();
+ m_clickedFeature = feature;
+ m_clickedIndex = index;
+}
+
+void SidebarModel::slotActivateChildAtClickedFeatureIndex() {
+ if (m_clickedFeature) {
+ m_clickedFeature->activateChild(m_clickedIndex);
+ }
+}
+
void SidebarModel::clicked(const QModelIndex& index) {
//qDebug() << "SidebarModel::clicked() index=" << index;
@@ -236,8 +251,12 @@ void SidebarModel::clicked(const QModelIndex& index) {
} else {
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->activateChild(index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ // Deferred activation is required for smooth scrolling when using
+ // encoder knobs
+ m_clickedChildActivationTimer->start(
+ m_clickedFeature->clickedChildActivationTimeoutMillis());
}
}
}
@@ -249,8 +268,9 @@ void SidebarModel::doubleClicked(const QModelIndex& index) {
} else {
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->onLazyChildExpandation(index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ m_clickedFeature->onLazyChildExpandation(m_clickedIndex);
}
}
}
@@ -267,9 +287,10 @@ void SidebarModel::rightClicked(const QPoint& globalPos, const QModelIndex& inde
{
TreeItem* tree_item = (TreeItem*)index.internalPointer();
if (tree_item) {
- LibraryFeature* feature = tree_item->feature();
- feature->activateChild(index);
- feature->onRightClickChild(globalPos, index);
+ onFeatureIndexClicked(tree_item->feature(), index);
+ DEBUG_ASSERT(m_clickedFeature);
+ m_clickedFeature->activateChild(m_clickedIndex);
+ m_clickedFeature->onRightClickChild(globalPos, m_clickedIndex);
}
}
}
diff --git a/src/library/sidebarmodel.h b/src/library/sidebarmodel.h
index 0040d2119d..17c3bb8cae 100644
--- a/src/library/sidebarmodel.h
+++ b/src/library/sidebarmodel.h
@@ -7,6 +7,7 @@
#include <QAbstractItemModel>
#include <QList>
#include <QModelIndex>
+#include <QTimer>
#include <QVariant>
class LibraryFeature;
@@ -14,8 +15,9 @@ class LibraryFeature;
class SidebarModel : public QAbstractItemModel {
Q_OBJECT
public:
- explicit SidebarModel(QObject* parent = 0);
- virtual ~SidebarModel();
+ explicit SidebarModel(
+ QObject* parent = nullptr);
+ ~SidebarModel() override = default;
void addLibraryFeature(LibraryFeature* feature);
QModelIndex getDefaultSelection();
@@ -64,11 +66,22 @@ class SidebarModel : public QAbstractItemModel {
signals:
void selectIndex(const QModelIndex& index);
+ private slots:
+ void slotActivateChildAtClickedFeatureIndex();
+
private:
QModelIndex translateSourceIndex(const QModelIndex& parent);
void featureRenamed(LibraryFeature*);
QList<LibraryFeature*> m_sFeatures;
unsigned int m_iDefaultSelectedIndex; /** Index of the item in the sidebar model to select at startup. */
+
+ QTimer* const m_clickedChildActivationTimer;
+ LibraryFeature* m_clickedFeature;
+ QModelIndex m_clickedIndex;
+
+ void onFeatureIndexClicked(
+ LibraryFeature* feature,
+ QModelIndex index);
};
#endif /* SIDEBARMODEL_H */

View File

@@ -1,208 +0,0 @@
From 497e9672dfd1079e28cadc9a413a0b8be00ed59d Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 9 May 2018 12:08:59 +0200
Subject: [PATCH 1/4] Optimize FLAC decoding
---
src/sources/soundsourceflac.cpp | 51 ++++++++++++++++++++---------------------
src/sources/soundsourceflac.h | 2 --
2 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index 3d68e05ce7..50cb0955e6 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -71,7 +71,6 @@ SoundSourceFLAC::SoundSourceFLAC(const QUrl& url)
m_decoder(nullptr),
m_maxBlocksize(0),
m_bitsPerSample(kBitsPerSampleDefault),
- m_sampleScaleFactor(CSAMPLE_ZERO),
m_curFrameIndex(0) {
}
@@ -345,25 +344,30 @@ FLAC__bool SoundSourceFLAC::flacEOF() {
return m_file.atEnd();
}
+namespace {
+
+// Workaround for improperly encoded FLAC files that may contain
+// garbage in the most significant, unused bits of decoded samples.
+// Required at least for libFLAC 1.3.2. This workaround might become
+// obsolete once libFLAC is taking care of these issues internally.
+// https://bugs.launchpad.net/mixxx/+bug/1769717
+// https://hydrogenaud.io/index.php/topic,61792.msg559045.html#msg559045
+//
+// We will shift decoded samples left by (32 - m_bitsPerSample) to
+// get rid of the garbage in the most significant bits before scaling.
+// The range of decoded integer sample values then becomes
+// [-2 ^ 31, 2 ^ 31 - 1]. Afterwards this integer range needs to be
+// scaled to [-CSAMPLE_PEAK, CSAMPLE_PEAK).
+
+const CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) << 31);
+
inline
-FLAC__int32 adjustDecodedSample(FLAC__int32 decodedSample, SINT bitsPerSample) {
- // Workaround for improperly encoded FLAC files that may contain
- // garbage in the most significant, unused bits of decoded samples.
- // Required at least for libFLAC 1.3.2. This workaround might become
- // obsolete once libFLAC is taking care of these issues internally.
- // https://bugs.launchpad.net/mixxx/+bug/1769717
- // https://hydrogenaud.io/index.php/topic,61792.msg559045.html#msg559045
- FLAC__int32 signBit = static_cast<FLAC__int32>(1) << (bitsPerSample - 1);
- FLAC__int32 bitMask = (static_cast<FLAC__int32>(1) << bitsPerSample) - 1; // == (signBit << 1) - 1
- FLAC__int32 maskedSample = decodedSample & bitMask;
- if (maskedSample & signBit) {
- // Sign extension for negative values
- return maskedSample | ~bitMask;
- } else {
- return maskedSample;
- }
+CSAMPLE convertDecodedSample(FLAC__int32 decodedSample, int bitsPerSample) {
+ return (decodedSample << (32 - bitsPerSample)) * kSampleScaleFactor;
}
+} // anonymous namespace
+
FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
const FLAC__Frame* frame, const FLAC__int32* const buffer[]) {
const SINT numChannels = frame->header.channels;
@@ -410,15 +414,15 @@ FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
case 1: {
// optimized code for 1 channel (mono)
for (SINT i = 0; i < numWritableFrames; ++i) {
- *pSampleBuffer++ = adjustDecodedSample(buffer[0][i], m_bitsPerSample) * m_sampleScaleFactor;
+ *pSampleBuffer++ = convertDecodedSample(buffer[0][i], m_bitsPerSample);
}
break;
}
case 2: {
// optimized code for 2 channels (stereo)
for (SINT i = 0; i < numWritableFrames; ++i) {
- *pSampleBuffer++ = adjustDecodedSample(buffer[0][i], m_bitsPerSample) * m_sampleScaleFactor;
- *pSampleBuffer++ = adjustDecodedSample(buffer[1][i], m_bitsPerSample) * m_sampleScaleFactor;
+ *pSampleBuffer++ = convertDecodedSample(buffer[0][i], m_bitsPerSample);
+ *pSampleBuffer++ = convertDecodedSample(buffer[1][i], m_bitsPerSample);
}
break;
}
@@ -426,7 +430,7 @@ FLAC__StreamDecoderWriteStatus SoundSourceFLAC::flacWrite(
// generic code for multiple channels
for (SINT i = 0; i < numWritableFrames; ++i) {
for (SINT j = 0; j < channelCount(); ++j) {
- *pSampleBuffer++ = adjustDecodedSample(buffer[j][i], m_bitsPerSample) * m_sampleScaleFactor;
+ *pSampleBuffer++ = convertDecodedSample(buffer[j][i], m_bitsPerSample);
}
}
}
@@ -456,11 +460,6 @@ void SoundSourceFLAC::flacMetadata(const FLAC__StreamMetadata* metadata) {
// not set before
if ((bitsPerSample >= 4) && (bitsPerSample <= 32)) {
m_bitsPerSample = bitsPerSample;
- // Range of signed) sample values: [-2 ^ (bitsPerSample - 1), 2 ^ (bitsPerSample - 1) - 1]
- const uint32_t absSamplePeak = 1u << (bitsPerSample - 1);
- DEBUG_ASSERT(absSamplePeak > 0);
- // Scaled range of samples values: [-CSAMPLE_PEAK, CSAMPLE_PEAK)
- m_sampleScaleFactor = CSAMPLE_PEAK / absSamplePeak;
} else {
kLogger.warning()
<< "Invalid bits per sample:"
diff --git a/src/sources/soundsourceflac.h b/src/sources/soundsourceflac.h
index 05c74f7b5e..f4b3c1cb3c 100644
--- a/src/sources/soundsourceflac.h
+++ b/src/sources/soundsourceflac.h
@@ -49,8 +49,6 @@ class SoundSourceFLAC: public SoundSource {
SINT m_maxBlocksize; // in time samples (audio samples = time samples * chanCount)
SINT m_bitsPerSample;
- CSAMPLE m_sampleScaleFactor;
-
ReadAheadSampleBuffer m_sampleBuffer;
void invalidateCurFrameIndex() {
From 24c206f60278b8e9576ae661643162512ff1d19b Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 9 May 2018 12:14:31 +0200
Subject: [PATCH 2/4] Add an assertion (just in case)
---
src/sources/soundsourceflac.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index 50cb0955e6..c01ab8455d 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -363,6 +363,7 @@ const CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) <
inline
CSAMPLE convertDecodedSample(FLAC__int32 decodedSample, int bitsPerSample) {
+ DEBUG_ASSERT(sizeof(FLAC__int32) == 32); // exactly 32-bits required!
return (decodedSample << (32 - bitsPerSample)) * kSampleScaleFactor;
}
From 6dc1d5f1a7e291c36d5828fdaecc82a62845b758 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 9 May 2018 12:25:00 +0200
Subject: [PATCH 3/4] Get rid of (most) implicit assumptions
---
src/sources/soundsourceflac.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index c01ab8455d..478bac870e 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -359,12 +359,12 @@ namespace {
// [-2 ^ 31, 2 ^ 31 - 1]. Afterwards this integer range needs to be
// scaled to [-CSAMPLE_PEAK, CSAMPLE_PEAK).
-const CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) << 31);
+const CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) << std::numeric_limits<FLAC__int32>::digits);
inline
CSAMPLE convertDecodedSample(FLAC__int32 decodedSample, int bitsPerSample) {
- DEBUG_ASSERT(sizeof(FLAC__int32) == 32); // exactly 32-bits required!
- return (decodedSample << (32 - bitsPerSample)) * kSampleScaleFactor;
+ DEBUG_ASSERT(std::numeric_limits<FLAC__int32>::is_signed);
+ return (decodedSample << ((std::numeric_limits<FLAC__int32>::digits + 1) - bitsPerSample)) * kSampleScaleFactor;
}
} // anonymous namespace
From a0430875f6c4ad89c0fb09300ed19a64c60bbfb4 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Wed, 9 May 2018 15:16:58 +0200
Subject: [PATCH 4/4] Use constexpr and reword comments
---
src/sources/soundsourceflac.cpp | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/src/sources/soundsourceflac.cpp b/src/sources/soundsourceflac.cpp
index 478bac870e..1a95ac168c 100644
--- a/src/sources/soundsourceflac.cpp
+++ b/src/sources/soundsourceflac.cpp
@@ -352,14 +352,12 @@ namespace {
// obsolete once libFLAC is taking care of these issues internally.
// https://bugs.launchpad.net/mixxx/+bug/1769717
// https://hydrogenaud.io/index.php/topic,61792.msg559045.html#msg559045
-//
-// We will shift decoded samples left by (32 - m_bitsPerSample) to
-// get rid of the garbage in the most significant bits before scaling.
-// The range of decoded integer sample values then becomes
-// [-2 ^ 31, 2 ^ 31 - 1]. Afterwards this integer range needs to be
-// scaled to [-CSAMPLE_PEAK, CSAMPLE_PEAK).
-const CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) << std::numeric_limits<FLAC__int32>::digits);
+// We will shift decoded samples left by (32 - m_bitsPerSample) to
+// get rid of the garbage in the most significant bits before scaling
+// to the range [-CSAMPLE_PEAK, CSAMPLE_PEAK - epsilon] with
+// epsilon = 1 / 2 ^ bitsPerSample.
+constexpr CSAMPLE kSampleScaleFactor = CSAMPLE_PEAK / (static_cast<FLAC__int32>(1) << std::numeric_limits<FLAC__int32>::digits);
inline
CSAMPLE convertDecodedSample(FLAC__int32 decodedSample, int bitsPerSample) {

View File

@@ -1,268 +0,0 @@
From cbda5169b22d5300f9d2f83fbf0500a602245787 Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Tue, 1 May 2018 19:19:14 +0200
Subject: [PATCH 1/6] Updated version and date due to bug fixes. Fixed behavior
of Play/Pause button concerning brake effect.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index 73f9d70c8a..80a4b40b45 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -11,11 +11,11 @@ var PioneerDDJSX = function() {};
/*
Author: DJMaxergy
- Version: 1.18, 06/13/2017
+ Version: 1.19, 05/01/2018
Description: Pioneer DDJ-SX Controller Mapping for Mixxx
Source: http://github.com/DJMaxergy/mixxx/tree/pioneerDDJSX_mapping
- Copyright (c) 2017 DJMaxergy, licensed under GPL version 2 or later
+ Copyright (c) 2018 DJMaxergy, licensed under GPL version 2 or later
Copyright (c) 2014-2015 various contributors, base for this mapping, licensed under MIT license
Contributors:
@@ -951,16 +951,16 @@ PioneerDDJSX.playButton = function(channel, control, value, status, group) {
playing = engine.getValue(group, "play");
if (value) {
- if (!PioneerDDJSX.toggledBrake[deck]) {
- script.toggleControl(group, "play");
- }
if (playing) {
script.brake(channel, control, value, status, group);
PioneerDDJSX.toggledBrake[deck] = true;
+ } else {
+ script.toggleControl(group, "play");
}
} else {
if (PioneerDDJSX.toggledBrake[deck]) {
script.brake(channel, control, value, status, group);
+ script.toggleControl(group, "play");
PioneerDDJSX.toggledBrake[deck] = false;
}
}
From 0351a07487573d5682678de4aa3681e65a47a1dd Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Tue, 1 May 2018 19:23:32 +0200
Subject: [PATCH 2/6] Fixed tempo/speed slider range button behavior: Maximum
range is now 90% (0.90) as 100% (1.00) isn't working anymore.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index 80a4b40b45..e5ecd61239 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -1390,10 +1390,10 @@ PioneerDDJSX.shiftKeyLockButton = function(channel, control, value, status, grou
PioneerDDJSX.nonPadLedControl(group, PioneerDDJSX.nonPadLeds.shiftKeyLock, value);
- if (range === 1.00) {
+ if (range === 0.90) {
range = PioneerDDJSX.setUpSpeedSliderRange[deck];
- } else if ((range * 2) > 1.00) {
- range = 1.00;
+ } else if ((range * 2) > 0.90) {
+ range = 0.90;
} else {
range = range * 2;
}
From 5656194dbf328d81887272e2e2efa2020ad058e8 Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Tue, 1 May 2018 19:28:17 +0200
Subject: [PATCH 3/6] Fixed slip mode enable-disable problem if you want to use
beatlooproll feature: Removed "slip_enabled" call in slicer method.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index e5ecd61239..027f33457f 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -2343,7 +2343,6 @@ PioneerDDJSX.slicerBeatActive = function(value, group, control) {
}
}
} else {
- engine.setValue(group, "slip_enabled", false);
PioneerDDJSX.slicerAlreadyJumped[deck] = false;
PioneerDDJSX.slicerPreviousBeatsPassed[deck] = 0;
PioneerDDJSX.slicerActive[deck] = false;
From fcdd67c13fa02cdbc1d556ae6c26dd364f8e610b Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Tue, 1 May 2018 19:36:51 +0200
Subject: [PATCH 4/6] Fixed 2.1 library functions ("rotarySelectorClick" now
expands categories in the left library panel) and enabled 2.1 library
controls as default.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index 027f33457f..afb857678d 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -97,8 +97,8 @@ PioneerDDJSX.samplerCueGotoAndPlay = false;
PioneerDDJSX.autoPFL = true;
// If true, new in Mixxx 2.1 introduced library controls will be used,
-// else old playlist controls will be used (default: false).
-PioneerDDJSX.useNewLibraryControls = false;
+// else old playlist controls will be used (default: true).
+PioneerDDJSX.useNewLibraryControls = true;
///////////////////////////////////////////////////////////////
@@ -2246,7 +2246,7 @@ PioneerDDJSX.rotarySelectorShifted = function(channel, control, value, status) {
PioneerDDJSX.rotarySelectorClick = function(channel, control, value, status) {
if (PioneerDDJSX.useNewLibraryControls) {
- script.toggleControl("[Library]", "MoveFocusForward");
+ script.toggleControl("[Library]", "GoToItem");
} else {
if (PioneerDDJSX.autoDJAddTop) {
script.toggleControl("[Library]", "AutoDjAddTop");
From 21f3004e6c7cb8efc694b842ddddea8c269ee169 Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Tue, 1 May 2018 19:58:30 +0200
Subject: [PATCH 5/6] Changed "rotarySelectorShiftedClick" button behavior:
Using the 2.1 library controls now triggers the
"AutoDJAddTop"/"AutoDJAddBottom" function.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index afb857678d..f24a20fefc 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -2258,7 +2258,11 @@ PioneerDDJSX.rotarySelectorClick = function(channel, control, value, status) {
PioneerDDJSX.rotarySelectorShiftedClick = function(channel, control, value, status) {
if (PioneerDDJSX.useNewLibraryControls) {
- script.toggleControl("[Library]", "GoToItem");
+ if (PioneerDDJSX.autoDJAddTop) {
+ script.toggleControl("[Library]", "AutoDjAddTop");
+ } else {
+ script.toggleControl("[Library]", "AutoDjAddBottom");
+ }
} else {
script.toggleControl("[Playlist]", "ToggleSelectedSidebarItem");
}
From 60351a88dc39a8ea5815579e3ff68076248910e9 Mon Sep 17 00:00:00 2001
From: DJMaxergy <Max-Beiersdorfer@t-online.de>
Date: Sun, 6 May 2018 23:31:15 +0200
Subject: [PATCH 6/6] Removed option to choose between old and new Mixxx 2.1
library controls. New library controls will be used now.
---
res/controllers/Pioneer-DDJ-SX-scripts.js | 47 ++++++-------------------------
1 file changed, 9 insertions(+), 38 deletions(-)
diff --git a/res/controllers/Pioneer-DDJ-SX-scripts.js b/res/controllers/Pioneer-DDJ-SX-scripts.js
index f24a20fefc..b88e31896e 100755
--- a/res/controllers/Pioneer-DDJ-SX-scripts.js
+++ b/res/controllers/Pioneer-DDJ-SX-scripts.js
@@ -71,7 +71,7 @@ PioneerDDJSX.jogwheelShiftMultiplier = 10;
// If true, vu meters twinkle if AutoDJ is enabled (default: true).
PioneerDDJSX.twinkleVumeterAutodjOn = true;
-// If true, selected track will be added to AutoDJ queue-top on pressing rotary selector,
+// If true, selected track will be added to AutoDJ queue-top on pressing shift + rotary selector,
// else track will be added to AutoDJ queue-bottom (default: false).
PioneerDDJSX.autoDJAddTop = false;
// Sets the duration of sleeping between AutoDJ actions if AutoDJ is enabled [ms] (default: 1000).
@@ -96,10 +96,6 @@ PioneerDDJSX.samplerCueGotoAndPlay = false;
// If true, PFL / Cue (headphone) is being activated by loading a track into certain deck (default: true).
PioneerDDJSX.autoPFL = true;
-// If true, new in Mixxx 2.1 introduced library controls will be used,
-// else old playlist controls will be used (default: true).
-PioneerDDJSX.useNewLibraryControls = true;
-
///////////////////////////////////////////////////////////////
// INIT, SHUTDOWN & GLOBAL HELPER //
@@ -2198,11 +2194,7 @@ PioneerDDJSX.loadPrepareButton = function(channel, control, value, status) {
};
PioneerDDJSX.backButton = function(channel, control, value, status) {
- if (PioneerDDJSX.useNewLibraryControls) {
- script.toggleControl("[Library]", "MoveFocusBackward");
- } else {
- script.toggleControl("AutoDJ", "skip_next");
- }
+ script.toggleControl("[Library]", "MoveFocusBackward");
};
PioneerDDJSX.shiftBackButton = function(channel, control, value, status) {
@@ -2224,47 +2216,26 @@ PioneerDDJSX.getRotaryDelta = function(value) {
PioneerDDJSX.rotarySelector = function(channel, control, value, status) {
var delta = PioneerDDJSX.getRotaryDelta(value);
- if (PioneerDDJSX.useNewLibraryControls) {
- engine.setValue("[Library]", "MoveVertical", delta);
- PioneerDDJSX.rotarySelectorChanged = true;
- } else {
- engine.setValue("[Playlist]", "SelectTrackKnob", delta);
- PioneerDDJSX.rotarySelectorChanged = true;
- }
+ engine.setValue("[Library]", "MoveVertical", delta);
+ PioneerDDJSX.rotarySelectorChanged = true;
};
PioneerDDJSX.rotarySelectorShifted = function(channel, control, value, status) {
var delta = PioneerDDJSX.getRotaryDelta(value),
f = (delta > 0 ? "SelectNextPlaylist" : "SelectPrevPlaylist");
- if (PioneerDDJSX.useNewLibraryControls) {
- engine.setValue("[Library]", "MoveHorizontal", delta);
- } else {
- engine.setValue("[Playlist]", f, Math.abs(delta));
- }
+ engine.setValue("[Library]", "MoveHorizontal", delta);
};
PioneerDDJSX.rotarySelectorClick = function(channel, control, value, status) {
- if (PioneerDDJSX.useNewLibraryControls) {
- script.toggleControl("[Library]", "GoToItem");
- } else {
- if (PioneerDDJSX.autoDJAddTop) {
- script.toggleControl("[Library]", "AutoDjAddTop");
- } else {
- script.toggleControl("[Library]", "AutoDjAddBottom");
- }
- }
+ script.toggleControl("[Library]", "GoToItem");
};
PioneerDDJSX.rotarySelectorShiftedClick = function(channel, control, value, status) {
- if (PioneerDDJSX.useNewLibraryControls) {
- if (PioneerDDJSX.autoDJAddTop) {
- script.toggleControl("[Library]", "AutoDjAddTop");
- } else {
- script.toggleControl("[Library]", "AutoDjAddBottom");
- }
+ if (PioneerDDJSX.autoDJAddTop) {
+ script.toggleControl("[Library]", "AutoDjAddTop");
} else {
- script.toggleControl("[Playlist]", "ToggleSelectedSidebarItem");
+ script.toggleControl("[Library]", "AutoDjAddBottom");
}
};

View File

@@ -1,524 +0,0 @@
From 84f6380d0c9397af8da4f4dda443aeb36239d9dd Mon Sep 17 00:00:00 2001
From: RJ Skerry-Ryan <rryan@mixxx.org>
Date: Mon, 23 Apr 2018 22:08:15 -0700
Subject: [PATCH 1/6] Fix lack of QAtomicPointer::operator T*() on Qt5.
---
src/engine/loopingcontrol.cpp | 3 ++-
src/util/compatibility.h | 10 ++++++++++
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/engine/loopingcontrol.cpp b/src/engine/loopingcontrol.cpp
index 62a70de981..d8a92fc536 100644
--- a/src/engine/loopingcontrol.cpp
+++ b/src/engine/loopingcontrol.cpp
@@ -10,6 +10,7 @@
#include "engine/loopingcontrol.h"
#include "engine/bpmcontrol.h"
#include "engine/enginecontrol.h"
+#include "util/compatibility.h"
#include "util/math.h"
#include "util/sample.h"
@@ -790,7 +791,7 @@ void LoopingControl::notifySeek(double dNewPlaypos, bool adjustingPhase) {
void LoopingControl::setLoopingEnabled(bool enabled) {
m_bLoopingEnabled = enabled;
m_pCOLoopEnabled->set(enabled);
- BeatLoopingControl* pActiveBeatLoop = m_pActiveBeatLoop;
+ BeatLoopingControl* pActiveBeatLoop = load_atomic_pointer(m_pActiveBeatLoop);
if (pActiveBeatLoop != nullptr) {
if (enabled) {
pActiveBeatLoop->activate();
diff --git a/src/util/compatibility.h b/src/util/compatibility.h
index e4c92c7abe..9cf12004c8 100644
--- a/src/util/compatibility.h
+++ b/src/util/compatibility.h
@@ -2,6 +2,7 @@
#define COMPATABILITY_H
#include <QAtomicInt>
+#include <QAtomicPointer>
#include <QStringList>
#include <QApplication>
@@ -21,6 +22,15 @@ inline int load_atomic(const QAtomicInt& value) {
#endif
}
+template <typename T>
+inline T* load_atomic_pointer(const QAtomicPointer<T>& value) {
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
+ return value;
+#else
+ return value.load();
+#endif
+}
+
inline QLocale inputLocale() {
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
return QApplication::keyboardInputLocale();
From 62a034578ba5683562bcc77bf6909a64fcab3e2f Mon Sep 17 00:00:00 2001
From: RJ Skerry-Ryan <rryan@mixxx.org>
Date: Tue, 24 Apr 2018 08:45:45 -0700
Subject: [PATCH 2/6] More qt5 compatibility fixes. How did these slip in?
---
src/engine/sidechain/shoutconnection.cpp | 4 +--
src/mixer/playermanager.cpp | 45 +++++++++++++++++---------------
src/preferences/broadcastprofile.cpp | 5 ++--
src/soundio/soundmanager.cpp | 9 ++++---
4 files changed, 34 insertions(+), 29 deletions(-)
diff --git a/src/engine/sidechain/shoutconnection.cpp b/src/engine/sidechain/shoutconnection.cpp
index 4b8c59ce73..b72b9dda6d 100644
--- a/src/engine/sidechain/shoutconnection.cpp
+++ b/src/engine/sidechain/shoutconnection.cpp
@@ -26,6 +26,7 @@
#include "preferences/usersettings.h"
#include "recording/defs_recording.h"
#include "track/track.h"
+#include "util/compatibility.h"
#include "util/logger.h"
#include <engine/sidechain/shoutconnection.h>
@@ -899,7 +900,7 @@ QSharedPointer<FIFO<CSAMPLE>> ShoutConnection::getOutputFifo() {
}
bool ShoutConnection::threadWaiting() {
- return m_threadWaiting;
+ return load_atomic(m_threadWaiting);
}
void ShoutConnection::run() {
@@ -996,4 +997,3 @@ void ShoutConnection::ignoreSigpipe() {
#endif
}
#endif
-
diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp
index e57a2a9136..b1fb18729e 100644
--- a/src/mixer/playermanager.cpp
+++ b/src/mixer/playermanager.cpp
@@ -202,52 +202,55 @@ bool PlayerManager::isPreviewDeckGroup(const QString& group, int* number) {
unsigned int PlayerManager::numDecks() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- if (m_pCOPNumDecks == nullptr) {
- ControlProxy* pNumCO = new ControlProxy(ConfigKey("[Master]", "num_decks"));
- if (!pNumCO->valid()) {
- delete pNumCO;
- pNumCO = NULL;
+ ControlProxy* pCOPNumDecks = m_pCOPNumDecks.loadAcquire();
+ if (pCOPNumDecks == nullptr) {
+ pCOPNumDecks = new ControlProxy(ConfigKey("[Master]", "num_decks"));
+ if (!pCOPNumDecks->valid()) {
+ delete pCOPNumDecks;
+ pCOPNumDecks = nullptr;
} else {
- m_pCOPNumDecks = pNumCO;
+ m_pCOPNumDecks = pCOPNumDecks;
}
}
// m_pCOPNumDecks->get() fails on MacOs
- return m_pCOPNumDecks ? (*m_pCOPNumDecks).get() : 0;
+ return pCOPNumDecks ? pCOPNumDecks->get() : 0;
}
// static
unsigned int PlayerManager::numSamplers() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- if (m_pCOPNumSamplers == nullptr) {
- ControlProxy* pNumCO = new ControlProxy(ConfigKey("[Master]", "num_samplers"));
- if (!pNumCO->valid()) {
- delete pNumCO;
- pNumCO = NULL;
+ ControlProxy* pCOPNumSamplers = m_pCOPNumSamplers.loadAcquire();
+ if (pCOPNumSamplers == nullptr) {
+ pCOPNumSamplers = new ControlProxy(ConfigKey("[Master]", "num_samplers"));
+ if (!pCOPNumSamplers->valid()) {
+ delete pCOPNumSamplers;
+ pCOPNumSamplers = nullptr;
} else {
- m_pCOPNumSamplers = pNumCO;
+ m_pCOPNumSamplers = pCOPNumSamplers;
}
}
// m_pCOPNumSamplers->get() fails on MacOs
- return m_pCOPNumSamplers ? (*m_pCOPNumSamplers).get() : 0;
+ return pCOPNumSamplers ? pCOPNumSamplers->get() : 0;
}
// static
unsigned int PlayerManager::numPreviewDecks() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- if (m_pCOPNumPreviewDecks == NULL) {
- ControlProxy* pNumCO = new ControlProxy(
+ ControlProxy* pCOPNumPreviewDecks = m_pCOPNumPreviewDecks.loadAcquire();
+ if (pCOPNumPreviewDecks == nullptr) {
+ pCOPNumPreviewDecks = new ControlProxy(
ConfigKey("[Master]", "num_preview_decks"));
- if (!pNumCO->valid()) {
- delete pNumCO;
- pNumCO = NULL;
+ if (!pCOPNumPreviewDecks->valid()) {
+ delete pCOPNumPreviewDecks;
+ pCOPNumPreviewDecks = nullptr;
} else {
- m_pCOPNumPreviewDecks = pNumCO;
+ m_pCOPNumPreviewDecks = pCOPNumPreviewDecks;
}
}
// m_pCOPNumPreviewDecks->get() fails on MacOs
- return m_pCOPNumPreviewDecks ? (*m_pCOPNumPreviewDecks).get() : 0;
+ return pCOPNumPreviewDecks ? pCOPNumPreviewDecks->get() : 0;
}
void PlayerManager::slotNumDecksControlChanged(double v) {
diff --git a/src/preferences/broadcastprofile.cpp b/src/preferences/broadcastprofile.cpp
index 824d2e9364..0b8a1aa9c1 100644
--- a/src/preferences/broadcastprofile.cpp
+++ b/src/preferences/broadcastprofile.cpp
@@ -16,6 +16,7 @@ using namespace QKeychain;
#include "broadcast/defs_broadcast.h"
#include "defs_urls.h"
+#include "util/compatibility.h"
#include "util/xml.h"
#include "util/memory.h"
#include "util/logger.h"
@@ -387,11 +388,11 @@ QString BroadcastProfile::getProfileName() const {
void BroadcastProfile::setConnectionStatus(int newState) {
m_connectionStatus = newState;
- emit connectionStatusChanged(m_connectionStatus);
+ emit connectionStatusChanged(connectionStatus());
}
int BroadcastProfile::connectionStatus() {
- return m_connectionStatus;
+ return load_atomic(m_connectionStatus);
}
void BroadcastProfile::setSecureCredentialStorage(bool value) {
diff --git a/src/soundio/soundmanager.cpp b/src/soundio/soundmanager.cpp
index ce2cb5dd1f..bcd3b8752b 100644
--- a/src/soundio/soundmanager.cpp
+++ b/src/soundio/soundmanager.cpp
@@ -35,6 +35,7 @@
#include "soundio/sounddevicenotfound.h"
#include "soundio/sounddeviceportaudio.h"
#include "soundio/soundmanagerutil.h"
+#include "util/compatibility.h"
#include "util/cmdlineargs.h"
#include "util/defs.h"
#include "util/sample.h"
@@ -363,8 +364,8 @@ SoundDeviceError SoundManager::setupDevices() {
m_pMasterAudioLatencyOverloadCount->set(0);
- // load with all configured devices.
- // all found devices are removed below
+ // load with all configured devices.
+ // all found devices are removed below
QSet<QString> devicesNotFound = m_config.getDevices();
// pair is isInput, isOutput
@@ -692,14 +693,14 @@ int SoundManager::getConfiguredDeckCount() const {
void SoundManager::processUnderflowHappened() {
if (m_underflowUpdateCount == 0) {
- if (m_underflowHappened) {
+ if (load_atomic(m_underflowHappened)) {
m_pMasterAudioLatencyOverload->set(1.0);
m_pMasterAudioLatencyOverloadCount->set(
m_pMasterAudioLatencyOverloadCount->get() + 1);
m_underflowUpdateCount = CPU_OVERLOAD_DURATION * m_config.getSampleRate()
/ m_config.getFramesPerBuffer() / 1000;
- m_underflowHappened = 0; // reseting her is not thread save,
+ m_underflowHappened = 0; // resetting here is not thread safe,
// but that is OK, because we count only
// 1 underflow each 500 ms
} else {
From 39ac01179aa5da33d6326983858d497701edfd27 Mon Sep 17 00:00:00 2001
From: RJ Skerry-Ryan <rryan@mixxx.org>
Date: Wed, 9 May 2018 03:37:51 -0700
Subject: [PATCH 3/6] Alow Qt5 build on Windows.
---
build/depends.py | 68 ++++++++++++++++++++++++++++++++++++++++++------
build/qt5.py | 6 ++++-
src/mixxxapplication.cpp | 17 ++++++++++++
3 files changed, 82 insertions(+), 9 deletions(-)
diff --git a/build/depends.py b/build/depends.py
index 25f1dd425a..5a8b5af564 100644
--- a/build/depends.py
+++ b/build/depends.py
@@ -233,12 +233,32 @@ def find_framework_libdir(qtdir, qt5):
def enabled_modules(build):
qt5 = Qt.qt5_enabled(build)
qt_modules = [
- 'QtCore', 'QtGui', 'QtOpenGL', 'QtXml', 'QtSvg',
- 'QtSql', 'QtScript', 'QtNetwork',
- 'QtTest', 'QtScriptTools'
+ # Keep alphabetized.
+ 'QtCore',
+ 'QtGui',
+ 'QtNetwork',
+ 'QtOpenGL',
+ 'QtScript',
+ 'QtScriptTools',
+ 'QtSql',
+ 'QtSvg',
+ 'QtTest',
+ 'QtXml',
]
if qt5:
- qt_modules.extend(['QtWidgets', 'QtConcurrent'])
+ qt_modules.extend([
+ # Keep alphabetized.
+ 'QtConcurrent',
+ 'QtWidgets',
+ ])
+ if build.platform_is_windows:
+ qt_modules.extend([
+ # Keep alphabetized.
+ 'QtAccessibilitySupport',
+ 'QtEventDispatcherSupport',
+ 'QtFontDatabaseSupport',
+ 'QtThemeSupport',
+ ])
return qt_modules
@staticmethod
@@ -391,6 +411,22 @@ def configure(self, build, conf):
# QtNetwork openssl-linked
build.env.Append(LIBS = 'crypt32')
+ # New libraries required by Qt5.
+ if qt5:
+ build.env.Append(LIBS = 'dwmapi') # qtwindows
+ build.env.Append(LIBS = 'iphlpapi') # qt5network
+ build.env.Append(LIBS = 'libEGL') # qt5opengl
+ build.env.Append(LIBS = 'libGLESv2') # qt5opengl
+ build.env.Append(LIBS = 'netapi32') # qt5core
+ build.env.Append(LIBS = 'userenv') # qt5core
+ build.env.Append(LIBS = 'uxtheme') # ?
+ build.env.Append(LIBS = 'version') # ?
+
+ build.env.Append(LIBS = 'qtfreetype')
+ build.env.Append(LIBS = 'qtharfbuzz')
+ build.env.Append(LIBS = 'qtlibpng')
+ build.env.Append(LIBS = 'qtpcre2')
+
# NOTE(rryan): If you are adding a plugin here, you must also
# update src/mixxxapplication.cpp to define a Q_IMPORT_PLUGIN
# for it. Not all imageformats plugins are built as .libs when
@@ -409,11 +445,27 @@ def configure(self, build, conf):
build.env.Append(LIBS = 'qico')
build.env.Append(LIBS = 'qsvg')
build.env.Append(LIBS = 'qtga')
+ build.env.Append(LIBS = 'qgif')
+ build.env.Append(LIBS = 'qjpeg')
+
+ # accessibility plugins (gone in Qt5)
+ if not qt5:
+ build.env.Append(LIBPATH=[
+ os.path.join(build.env['QTDIR'],'plugins/accessible')])
+ build.env.Append(LIBS = 'qtaccessiblewidgets')
+
+ # platform plugins (new in Qt5 for Windows)
+ if qt5:
+ build.env.Append(LIBPATH=[
+ os.path.join(build.env['QTDIR'],'plugins/platforms')])
+ build.env.Append(LIBS = 'qwindows')
+
+ # sqldrivers (new in Qt5? or did we just start enabling them)
+ if qt5:
+ build.env.Append(LIBPATH=[
+ os.path.join(build.env['QTDIR'],'plugins/sqldrivers')])
+ build.env.Append(LIBS = 'qsqlite')
- # accessibility plugins
- build.env.Append(LIBPATH=[
- os.path.join(build.env['QTDIR'],'plugins/accessible')])
- build.env.Append(LIBS = 'qtaccessiblewidgets')
# Set the rpath for linux/bsd/osx.
diff --git a/build/qt5.py b/build/qt5.py
index 674abef60a..c080e3243f 100644
--- a/build/qt5.py
+++ b/build/qt5.py
@@ -881,14 +881,18 @@ def enable_modules(self, modules, debug=False, crosscompiling=False, staticdeps=
'QtWebKitWidgets',
'QtWidgets',
# Qt Add-Ons
+ 'QtAccessibilitySupport',
'QtConcurrent',
'QtDBus',
+ 'QtEventDispatcherSupport',
+ 'QtFontDatabaseSupport',
'QtOpenGL',
'QtPrintSupport',
'QtDeclarative',
'QtScript',
'QtScriptTools',
'QtSvg',
+ 'QtThemeSupport',
'QtUiTools',
'QtXml',
'QtXmlPatterns',
@@ -967,7 +971,7 @@ def enable_modules(self, modules, debug=False, crosscompiling=False, staticdeps=
modules.append("QtAssistantClient")
self.AppendUnique(LIBS=['qtmain'+debugSuffix])
self.AppendUnique(LIBS=[lib.replace("Qt","Qt5")+debugSuffix for lib in modules if lib not in staticModules])
- self.PrependUnique(LIBS=[lib+debugSuffix for lib in modules if lib in staticModules])
+ self.PrependUnique(LIBS=[lib.replace("Qt", "Qt5")+debugSuffix for lib in modules if lib in staticModules])
if 'QtOpenGL' in modules:
self.AppendUnique(LIBS=['opengl32'])
self.AppendUnique(CPPPATH=[ '$QT5DIR/include/'])
diff --git a/src/mixxxapplication.cpp b/src/mixxxapplication.cpp
index f6a2281f3a..c2d1c83ffa 100644
--- a/src/mixxxapplication.cpp
+++ b/src/mixxxapplication.cpp
@@ -11,6 +11,22 @@
// plugins we link in build/depends.py.
#ifdef QT_NODLL
#include <QtPlugin>
+#if QT_VERSION >= 0x050000
+// sqldrivers plugins
+Q_IMPORT_PLUGIN(QSQLiteDriverPlugin)
+// platform plugins
+Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
+// imageformats plugins
+Q_IMPORT_PLUGIN(QSvgPlugin)
+Q_IMPORT_PLUGIN(QSvgIconPlugin)
+Q_IMPORT_PLUGIN(QICOPlugin)
+Q_IMPORT_PLUGIN(QTgaPlugin)
+Q_IMPORT_PLUGIN(QJpegPlugin)
+Q_IMPORT_PLUGIN(QGifPlugin)
+// accessible plugins
+// TODO(rryan): This is supposed to exist but does not in our builds.
+//Q_IMPORT_PLUGIN(AccessibleFactory)
+#else
// iconengines plugins
Q_IMPORT_PLUGIN(qsvgicon)
// imageformats plugins
@@ -20,6 +36,7 @@ Q_IMPORT_PLUGIN(qtga)
// accessible plugins
Q_IMPORT_PLUGIN(qtaccessiblewidgets)
#endif
+#endif
MixxxApplication::MixxxApplication(int& argc, char** argv)
From 03ce46e29a2e83d38a82f6c4d55c540a9df792ce Mon Sep 17 00:00:00 2001
From: RJ Skerry-Ryan <rryan@mixxx.org>
Date: Mon, 14 May 2018 23:36:59 -0700
Subject: [PATCH 4/6] One more missing library.
---
build/depends.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/build/depends.py b/build/depends.py
index 5a8b5af564..774c10cfd7 100644
--- a/build/depends.py
+++ b/build/depends.py
@@ -417,6 +417,7 @@ def configure(self, build, conf):
build.env.Append(LIBS = 'iphlpapi') # qt5network
build.env.Append(LIBS = 'libEGL') # qt5opengl
build.env.Append(LIBS = 'libGLESv2') # qt5opengl
+ build.env.Append(LIBS = 'mpr') # qt5core
build.env.Append(LIBS = 'netapi32') # qt5core
build.env.Append(LIBS = 'userenv') # qt5core
build.env.Append(LIBS = 'uxtheme') # ?
From 0c857e60511b65cebb08821ecebd636af10d7a56 Mon Sep 17 00:00:00 2001
From: RJ Skerry-Ryan <rryan@mixxx.org>
Date: Sat, 19 May 2018 20:54:17 -0700
Subject: [PATCH 5/6] Add QWindowsVistaStyle support.
---
build/depends.py | 6 ++++++
src/mixxxapplication.cpp | 2 ++
2 files changed, 8 insertions(+)
diff --git a/build/depends.py b/build/depends.py
index 774c10cfd7..fec53d681a 100644
--- a/build/depends.py
+++ b/build/depends.py
@@ -461,6 +461,12 @@ def configure(self, build, conf):
os.path.join(build.env['QTDIR'],'plugins/platforms')])
build.env.Append(LIBS = 'qwindows')
+ # styles (new in Qt5 for Windows)
+ if qt5:
+ build.env.Append(LIBPATH=[
+ os.path.join(build.env['QTDIR'],'plugins/styles')])
+ build.env.Append(LIBS = 'qwindowsvistastyle')
+
# sqldrivers (new in Qt5? or did we just start enabling them)
if qt5:
build.env.Append(LIBPATH=[
diff --git a/src/mixxxapplication.cpp b/src/mixxxapplication.cpp
index c2d1c83ffa..4b0ea8b353 100644
--- a/src/mixxxapplication.cpp
+++ b/src/mixxxapplication.cpp
@@ -16,6 +16,8 @@
Q_IMPORT_PLUGIN(QSQLiteDriverPlugin)
// platform plugins
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
+// style plugins
+Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin)
// imageformats plugins
Q_IMPORT_PLUGIN(QSvgPlugin)
Q_IMPORT_PLUGIN(QSvgIconPlugin)
From ed8b240c683a2ada65b11c092909d22469bd0c18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= <daschuer@mixxx.org>
Date: Thu, 24 May 2018 00:28:21 +0200
Subject: [PATCH 6/6] don't use loadAquire(), it is not available in Qt4
---
src/mixer/playermanager.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp
index b1fb18729e..5835c480f7 100644
--- a/src/mixer/playermanager.cpp
+++ b/src/mixer/playermanager.cpp
@@ -202,7 +202,7 @@ bool PlayerManager::isPreviewDeckGroup(const QString& group, int* number) {
unsigned int PlayerManager::numDecks() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- ControlProxy* pCOPNumDecks = m_pCOPNumDecks.loadAcquire();
+ ControlProxy* pCOPNumDecks = load_atomic_pointer(m_pCOPNumDecks);
if (pCOPNumDecks == nullptr) {
pCOPNumDecks = new ControlProxy(ConfigKey("[Master]", "num_decks"));
if (!pCOPNumDecks->valid()) {
@@ -220,7 +220,7 @@ unsigned int PlayerManager::numDecks() {
unsigned int PlayerManager::numSamplers() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- ControlProxy* pCOPNumSamplers = m_pCOPNumSamplers.loadAcquire();
+ ControlProxy* pCOPNumSamplers = load_atomic_pointer(m_pCOPNumSamplers);
if (pCOPNumSamplers == nullptr) {
pCOPNumSamplers = new ControlProxy(ConfigKey("[Master]", "num_samplers"));
if (!pCOPNumSamplers->valid()) {
@@ -238,7 +238,7 @@ unsigned int PlayerManager::numSamplers() {
unsigned int PlayerManager::numPreviewDecks() {
// We do this to cache the control once it is created so callers don't incur
// a hashtable lookup every time they call this.
- ControlProxy* pCOPNumPreviewDecks = m_pCOPNumPreviewDecks.loadAcquire();
+ ControlProxy* pCOPNumPreviewDecks = load_atomic_pointer(m_pCOPNumPreviewDecks);
if (pCOPNumPreviewDecks == nullptr) {
pCOPNumPreviewDecks = new ControlProxy(
ConfigKey("[Master]", "num_preview_decks"));

View File

@@ -1,44 +0,0 @@
From 11de4b0ce3e36887471ad818ddc023e23b517097 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Fri, 18 May 2018 17:15:00 +0200
Subject: [PATCH] Reduce log spam
---
src/sources/soundsourceproxy.cpp | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/sources/soundsourceproxy.cpp b/src/sources/soundsourceproxy.cpp
index 0d43f1fd70..4dbe1b4765 100644
--- a/src/sources/soundsourceproxy.cpp
+++ b/src/sources/soundsourceproxy.cpp
@@ -528,20 +528,23 @@ void SoundSourceProxy::updateTrackFromSource(
// once in the past. Only overwrite this information if
// new data has actually been imported, otherwise abort
// and preserve the existing data!
- if (metadataImported.first == mixxx::MetadataSource::ImportResult::Succeeded) {
- kLogger.info()
+ if (metadataImported.first != mixxx::MetadataSource::ImportResult::Succeeded) {
+ return; // abort
+ }
+ if (kLogger.debugEnabled()) {
+ kLogger.debug()
<< "Updating track metadata"
<< (pCoverImg ? "and embedded cover art" : "")
<< "from file"
<< getUrl().toString();
- } else {
- return; // abort
}
} else {
DEBUG_ASSERT(pCoverImg);
- kLogger.info()
- << "Initializing track metadata and embedded cover art from file"
- << getUrl().toString();
+ if (kLogger.debugEnabled()) {
+ kLogger.debug()
+ << "Initializing track metadata and embedded cover art from file"
+ << getUrl().toString();
+ }
}
// Fallback: If artist or title fields are blank then try to populate

View File

@@ -1,31 +0,0 @@
From 4148349efe700106de3c347708d5d8429c1ffbeb Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Mon, 16 Apr 2018 07:26:51 +0200
Subject: [PATCH] Swap default values for temp/perm rate changes
---
src/preferences/dialog/dlgprefdeck.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/preferences/dialog/dlgprefdeck.cpp b/src/preferences/dialog/dlgprefdeck.cpp
index 6cf2e0c327..0f73b68f3c 100644
--- a/src/preferences/dialog/dlgprefdeck.cpp
+++ b/src/preferences/dialog/dlgprefdeck.cpp
@@ -198,13 +198,13 @@ DlgPrefDeck::DlgPrefDeck(QWidget * parent, MixxxMainWindow * mixxx,
this, SLOT(slotRatePermFineSpinbox(double)));
m_dRateTempCoarse = m_pConfig->getValue(ConfigKey("[Controls]", "RateTempLeft"),
- kDefaultPermanentRateChangeCoarse);
+ kDefaultTemporaryRateChangeCoarse);
m_dRateTempFine = m_pConfig->getValue(ConfigKey("[Controls]", "RateTempRight"),
- kDefaultPermanentRateChangeFine);
+ kDefaultTemporaryRateChangeFine);
m_dRatePermCoarse = m_pConfig->getValue(ConfigKey("[Controls]", "RatePermLeft"),
- kDefaultTemporaryRateChangeCoarse);
+ kDefaultPermanentRateChangeCoarse);
m_dRatePermFine = m_pConfig->getValue(ConfigKey("[Controls]", "RatePermRight"),
- kDefaultTemporaryRateChangeFine);
+ kDefaultPermanentRateChangeFine);
spinBoxTemporaryRateCoarse->setValue(m_dRateTempCoarse);
spinBoxTemporaryRateFine->setValue(m_dRateTempFine);

View File

@@ -1,125 +0,0 @@
From dbe259e21ab3c65c3af149bb0cb152f2be31f522 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 27 May 2018 18:19:24 +0200
Subject: [PATCH 1/2] Update <id> and <launchable> tags according to AppStream
spec v0.12
---
res/linux/mixxx.appdata.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/res/linux/mixxx.appdata.xml b/res/linux/mixxx.appdata.xml
index 85498fc973..d2366c3170 100644
--- a/res/linux/mixxx.appdata.xml
+++ b/res/linux/mixxx.appdata.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Author 2014 Tuukka Pasanen <pasanen.tuukka@gmail.com> -->
<component>
- <id type="desktop">mixxx.desktop</id>
+ <id>org.mixxx.Mixxx</id>
+ <launchable type="desktop-id">mixxx.desktop</launchable>
<metadata_license>CC-BY-SA-3.0</metadata_license>
<project_license>GPL-2.0</project_license>
<name>Mixxx DJ Software</name>
From e56c4880874f33bd004f0164ccb7d11a182f88f0 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Sun, 27 May 2018 18:21:02 +0200
Subject: [PATCH 2/2] Re-generate desktop icon with 64x64px instead of 48x48px
The AppStream spec demands at least 64x64px.
---
res/images/mixxx-icon.png | Bin 1577 -> 2655 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/res/images/mixxx-icon.png b/res/images/mixxx-icon.png
index ab6b55a9d42a58152f8584faaf511e2172a7287b..5cb42785a781f9303a079a71e09429e3edf2c038 100644
GIT binary patch
literal 2655
zcmV-l3ZV6gP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00004b3#c}2nYxW
zd<bNS00009a7bBm000xO000xO0b}Nl!vFvP8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H13EW9UK~#90?OR)H6xSL4&N;K|*|m*#y}OPC>kGbMKvtACQNf{L
zLfgDn4N#hwO05*N;js^e5|C&VMKnr@NJzv}t13a55?U!rsM7W!2^efHr9x^#Vv6xP
zHWz#CwXxUU-I;UxFgv@myED5p>ovhDpFEng|GEADH~;zPT*km7Ji;S9!v8TyzTnWI
zSDpr;+X+GAH=)qdK|~<L`+N56?>9<w2srfGt1l9Qw>#R`D8XRJRc=>=kj33Wp#A0D
zOXcU?0Rob~&&*6Km#<u6b91x1f3s)*u>t~KfBj%k74FgPKicVDy}Gqr+iel^O|_Xw
zByi-d!$~!TmHYPXivob8XDW*8Nl@W#Zf-#$kw7Yya@6_5oEAa=0II60AcSyJil+d4
z3>XLiLmdP_Da}+c!^2>Z6QlKXj;Aox>B%esMNm%XUk(mpZ0xqBi(1t+E3<0VO04Vb
z1f{fOzs1sK{bUFrAhiMlLI_I_uw(pGEQVkGdJnFD`ITuK<zoH1wK)358>p}MJ2KiT
zUx$><glXh6W33nwhmX98xw%=qd|)3MLO~=F34HR&r?`0OGG=CGAOxThttrIQiW%iK
z)zw(Pt`lAB*Mh4Y6O&PV);ECHet#Ihd-au)#+l{k>Q93O1c1N`k!zHhp~Yl`5L_4-
z!1Ft|Lzdk*+jkaUe1086H*cY-sR^yCn*l;I<tZbegn>{3N+<{=040b`P2=*_e<Ko!
zpdsi-TU$HUwzuMJUmrN<MGdu*>B9#A1XsO<1Q?7mUUrN&=FQE;;q`hjH8q7uWEhd*
z2%4H2vAVSx)6>%+ARv^25+FP?14<ai8v-Cq0;3d+Q8b6cAe7)=SFb@$Eg%$XfZOfD
zTs-c`==^)pAz(&?9fQs8#?BN)MNMrjVzC$o2M0k20i_hJ6H#owFaQ8JwXFwVuUZL-
zF))dty^SGIUyqccrrYD-f)})1%3x!jRiHH`U@;y50D=o}g92uKdkpgoIgvEgA!7g+
z5L|1o*buNwh!I6Sz>eW&L~y|&L{`zof(ud91MC=X+XJkgz7qn3$Ud=3KyaSp0Zt6p
z@5Uf#gyj&(pL95i0o-~nQ4aDwz{y=tI|_p3xPIXfsGtW3UJwJE65%KY<QsM8&K(R~
z>PIv>ks~jzbOk+tXFcHE<A1VjTbKL&^?35zPazlxX5@}NKsR#m#vqQq^Co<CepGwC
zX2neuUOEqmO~p!<9~&D(-}!U+*-w9t=H`}k8)bL^0Q}{z@1v!;1slK9ZT>#XL+|Mi
zimoThfzbmtZ|*5wK?qzJxPUVspTRF*crh)qNkIPi9~~RTv)_LfimKqojX_%qSDFB$
z2VB4YdCBta?H%ao=)gbz`S+4#Ej>U80nRz<>U>Bf6KHs>0X4PNwiLEA1cdRmS;Dh~
zK*j@}_|_98`}caQad-SKYHMoC3xY-iwrt*lGk^OCj4=cPfs&o;o#_fwN|8(^v0_Cq
zU7vtbf>>Q0t}_NoD5lq~h2JBCQ3gq3kYx|<MW?{huVT(s=nJ*k+1Zl)-x|J!zP@wV
z+Ow_XgD4<CcVGQ=^Gwe+Kmebe`xKLtleP)aJN9^Gj6_D@tE)pt$C{jp)<{<uC}n7*
z6qHdgN<kUJ^vn#dT)l=Wmy~V~P`S1)=snq6vVWh?hpj!^(7mC%WLZ-WFupc~5ZK!D
z40^U~&E)0Zjp@zb`$3K@5Uj`O$ZhlwTq;=iTkQu3A>eXJ@YQ(I?Pfjl;DMJ*8s!9*
z1ei@Zt&BF6rPGX2)cI<WOeCSIDg@HrY#7&Cd97~_K%&|($;P6}22~?0V?aIuc1Zv<
z!+4&;Ok$vnnwBrUw&w*iK&P-B1ofw{6X28tU<uX&+`Jzr(CXQo2^xohQ};Lfy;vAM
zU~wq2E1d02Q(jfooZqF=ob$|K3O7t#DgmQMC6h_GT;-kG*<K6S83Os~R4Rpqg#~y#
zGUD+CJQfNeP#-{5RTW&48>*saf}Z{~Rh0uU1YD6_NeV6?(s@i`NX;tn$TAid7Bs~r
zTSpp2jW;F0ZVbpD2B}mEilX50t}gUnx`I$JfY#PF%+Jr`{{2}fiUQ6#R8<96Rj8b2
z?y9P2^L<r?nvtnmc}2n8d>rGG(|EkAtKthSOAk<0wWQHz<n7wA9Y@}N2Y-C`M8%W@
zfR?5v{AA~jocW0pIGzey1wkt?#vn-&Lct(@yZ<E&M@DdOeB6<eR%i%?(9{@)BuQY5
zS#EEYgQ8PmCoD^n1R+G`aJ6$y2RheuR7_EQo6hBOfiYIGc8hv|Q@C6%NRm|XaSCJ!
z&}WBEVO7VrFGWU%apL5A1@aRo-$P_%I7iV71AXYfcpj1@Wv;Q?qd0ZCH%BH(5>B1&
z#n|o999jRx^9A)s$G%4IpN~7%rxY9yCcocb@E&exXh3y!?p}e<=ZD|#U-J5P+p~ft
z0r@LJ-GyXX24gHoR_(2Z%jL?Ed1M)~EH7z&yX_SV<d#9O*sIPeKlhbsJ|(VHeJAbZ
zr;RAOA5g5ZoZl98jP=5+8u8;D&)cg1^v3VP<MHIwFWSEieH;<6Saf!*#flYmrg@W-
zlSn2D4@2{jOeS-7pn`!Ax;JjBn2tIYO+Yx@2v^>`JP-)N?RH~+e!if*nam8Ts^*mS
zcsytfH(`E$9;&Ls>+vESUi`P5iyi{q8#Y0fJq2YFi3Adfggq^6&Ncxc8jS(~>gxmO
z-muABUyEU521^gfuMl3<h#k-EGR>cum?){Z6?Qzg3pMHO>vASIBO@b=YOmxMBKe3$
zqev!`w$2CbLf`7HRGUuPv+V&o;_-NyYFWefP+5ZZjGs=$0c{;n$;HOQ0>)TomkXTU
z*X7v{C5gBRP~05)FWTEW;Pd$&yp~Ih!NISz#T1hN(Ph~WB|+~)2z>a_2Uy+Gia;P}
z-pVpXG&+u<TSMugO{aBvK@8|<>qKmN%JwnXa)I0JMpI)8h9g5c@~j6ae1<TJDp|%#
zZ}@>L_#hCE&!toDj0fmJkd2NGT?3FDAHVm&6?;$^pSZ^fA!B>@?v3a&3EF7^J9_jF
zu>%KR+H?2b?ZdI@DMhZ5%l?;{hYf@fF*`S#N~Mxmh|j+OfB{ee&3FpH1&s{X?%luG
z7-|UqkW$ttAP9uXamsQ4(aymrp&S6`TpheKF>(CZTgSctprkL5^yNa91mnfh`Ac&&
zyR_iYbXTA~?NmCQN?$6V87b0*Rb&Z4TCPCzkmXE(imZKlI<w=ezXcRSMUgH@ksTt-
zkpNw1-C&&n#gJDpz9}@f*NtD!1OUi<k6|Ps$ChFN&Pc#=gvh&0@jv2rgUTy!H1+@h
N002ovPDHLkV1gOS+eQEY
literal 1577
zcmV+^2G;qBP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru)(Z{=5dpoa!rcG>1-3~<
zK~!ko?OAJY6jd00&SiHCEh>~6p_Ge-gf5^0NhO3!5P>LB3D=^aQS=7@@e+fH8o~!O
zPzaZ(L5(qTtwli+zZm_Z&}swN8%1iNlu{K!TxfT9&czSAvzhMB%+Bt%W{teb$?Tak
z=bh(yFXy~x2e>PD<^L_j{IPY%*3v>6*k%Y(rIhmLBUnml)W`XuJ1X+#mQ7o_0Dzl=
zg*343u?36PRa68iV=OnT5HeVE{h?53{eh1^0Du?z5io?Ps;CIka5xODwX5>vtJ~N>
zJ!4`jDk>s|5LGDzlu~|5DU?#4Ko11qbXTo)qM7|T#zctoWGic}J-^^eXD6!n>_uJu
z&nd*cgvzYSO1!ptBPNU=?+V&_O%`sa*eiiud-q|&xUpEjb~U=YyK&;{lW6bgfKm!t
z11b(Ac8%#DQ#KlvGp1wc&_Xn}wBo%T)!4VY+7Wc}z2yAlZs6Sr5JGUKt{&^ER-yKI
z4Sqe}jMCClJic%N7-JxWfH4ZjI2fbgoP!X8=GHcxIQ1<`M%;rrbLQdTvD&m&w~nRt
z0HxFwwDq1+3WN|uA`wKw5sVu<77Y!*KuQTpDK`9g8iWuWUc3-KpAQ8?3NUTj!#G{v
zfM_%dtyRoJN_n!r9TDzjrAbF3kvo*YFpPu|%5L23r&|aCMri_slro_sQ{bL+z>QGs
z<udCv-z0Ama3bNB$SFBMDfR4ym=#sl1d=`A#S5N7$lB5o&^mVlQc6$O_e8*4rh5M9
z!Lgd7xX{+>y2j_?0Tn0k>KmJ#Y9Ew8I1x`iu@obVM`o4-HD4ZsQW|Skt_7j?^~q0l
z=Q7^F>^$&n)jHd8tuz|WHsG66C$avy=hG9g=D>xvR&0221KQi$5xO06Nko}5flKWd
zZO4Zd4a59-b8+C41CBauO9`bEDkcZf+|q<cD`&x}I<4OGVIqVGA<#<0=kq0ibrz54
zmoJ=i$oSp?05VQ~{=E5)1kco+#>DbT-UwJXm1mw_hT~t=V&|@%u3=(&AW#s%<ttY(
zW5&$HPTVqkHW=fWY1xSzn_5ud_r-G{rg!`M+Z}UYV)-O2UbMvfK420k8CimtUwXxH
z70_B^?!rY0a>d2Nak--d7k|6tS_}CD9EC%C{X*#Nx8BV<47r`#oR%-U<;^6(eH?{F
zLs6JPIbep6lXWvDptbHtzzMh=f$Wx1m9Y-jeIS{D9q42NasZamT*Nhm+&rL^0;Lqf
zFu*y_=75f<5Fmsg91bH82n>7(Ie7p8B9REDO`U@JhO>C&q3P)D>qY4A5TullLO?1B
zAtZz_Af<v30!m64LO=)sAtkzd{>0Q^5Pf}ppp?Sr^9`;Cl1t+?E0*JnBS*1&|3_IJ
zDT9+IW7$(nA%uXGGAmD}ct8l@T7O$Zplr+-yuN8;PBAQm0Amc)a!$y}170l|2n70-
z-npC!IOmB&P{z4rw@g{v!NZ?B_BrP`T5|}Du|&(XUsHP|R)(Z`ms2=XH}K}eqehMT
zSNiFmwF@zd|G4mUJDt;gr~c}dYjYa+@~#2(fC<PdU0q$SbFAZb^9R)ft5#H{Ja_f#
z)r@NxtC;icbf=q}mcYv8Yf|oac6NHUkllPYvFi3Rmu9Lo8_8vUy1CrCvq~w!7=sWZ
zKUW;i&A%;m3IRe0nwlFiB{&tiexVsGky4_mxe=7mXbJ%-CC;Behwp#*Zb0hv!4Sq6
z?z?w5gi^hBNgTbu<N<%_=(4=txbF1c!L3_2Zzm@)A%q;c-g8YFhLN}6qtPg?U%wU+
zQhb{10p9lerFY7u<Tq~qwH!cRer6?v^cjZnS##rs{QwvMY1YDin??cXJi+b*5Css4
zU(Mgb^neDS;!Pm-0bJ#g@kJbuwBVH15V8iovP{Sq5AZk^8OIheu_Yg;NIbS!9ulw`
bHX;82VmiZiqTq-!00000NkvXXu0mjf58U6r

View File

@@ -1,648 +0,0 @@
From dd9af16a5e8c7e6f61951547d6f1260df8c1f6d4 Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Fri, 20 Apr 2018 14:22:08 -0700
Subject: [PATCH 1/6] AA VMS4: Fix touch strip needle drop scale
---
res/controllers/American-Audio-VMS4-scripts.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index a29e82c632..754348d33f 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -395,7 +395,7 @@ VMS4.jog_move_msb = function(channel, control, value, status, group) {
VMS4.touch_strip = function(channel, control, value, status, group) {
// Only modify the playposition if the deck is NOT playing!
if (engine.getValue(group, "play") === 0) {
- engine.setValue(group, "playposition", value);
+ engine.setValue(group, "playposition", value/0x7F);
}
}
From 2d912dc18558b73153c43bf365c8a85c4084f0a0 Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Mon, 14 May 2018 12:48:57 -0700
Subject: [PATCH 2/6] Update AA VMS4 preset - Update Mixxx version - Add
cue_play on shifted CUE buttons (to match Traktor Edition label) - Add
sync_master on shifted PLAY buttons (to match Traktor Edition label) - Update
reloop buttons to use reloop_toggle - Make effect controls operate on
Unit1_EffectM, correcting behavior
---
res/controllers/American Audio VMS4.midi.xml | 50 +++++++++++++++++++-------
res/controllers/American-Audio-VMS4-scripts.js | 6 ++--
2 files changed, 40 insertions(+), 16 deletions(-)
diff --git a/res/controllers/American Audio VMS4.midi.xml b/res/controllers/American Audio VMS4.midi.xml
index 564863598b..147d89d857 100644
--- a/res/controllers/American Audio VMS4.midi.xml
+++ b/res/controllers/American Audio VMS4.midi.xml
@@ -4,7 +4,7 @@
<name>American Audio VMS4/4.1</name>
<author>Anders Gunnarsson &amp; Sean M. Pappalardo</author>
<wiki>http://mixxx.org/wiki/doku.php/american_audio_vms4</wiki>
- <description>2-deck control/4-deck mixer preset for Mixxx 2.0. Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
+ <description>2-deck control/4-deck mixer preset for Mixxx 2.1. Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
</info>
<controller id="American Audio VMS4">
<scriptfiles>
@@ -268,6 +268,18 @@
<status>0x80</status>
<midino>0x0C</midino>
</control>
+ <control><!-- on -->
+ <group>[Channel1]</group>
+ <key>cue_play</key>
+ <status>0x91</status>
+ <midino>0x0C</midino>
+ </control>
+ <control><!-- off -->
+ <group>[Channel1]</group>
+ <key>cue_play</key>
+ <status>0x81</status>
+ <midino>0x0C</midino>
+ </control>
<control><!-- on -->
<group>[Channel1]</group>
<key>play</key>
@@ -275,20 +287,20 @@
<midino>0x0D</midino>
</control>
<control><!-- off -->
- <group>[Channel1]</group>
- <key>play</key>
- <status>0x80</status>
- <midino>0x0D</midino>
+ <group>[Channel1]</group>
+ <key>play</key>
+ <status>0x80</status>
+ <midino>0x0D</midino>
</control>
<control><!-- Shifted Play -->
<group>[Channel1]</group>
- <key>start_play</key>
+ <key>sync_master</key>
<status>0x91</status>
<midino>0x0D</midino>
</control>
<control><!-- Shifted Play -->
<group>[Channel1]</group>
- <key>start_play</key>
+ <key>sync_master</key>
<status>0x81</status>
<midino>0x0D</midino>
</control>
@@ -487,7 +499,7 @@
</control>
<control><!-- on -->
<group>[Channel1]</group>
- <key>reloop_exit</key>
+ <key>reloop_toggle</key>
<status>0x90</status>
<midino>0x21</midino>
<options>
@@ -496,7 +508,7 @@
</control>
<control><!-- off -->
<group>[Channel1]</group>
- <key>reloop_exit</key>
+ <key>reloop_toggle</key>
<status>0x80</status>
<midino>0x21</midino>
<options>
@@ -922,6 +934,18 @@
<status>0x80</status>
<midino>0x2E</midino>
</control>
+ <control><!-- on -->
+ <group>[Channel2]</group>
+ <key>cue_play</key>
+ <status>0x91</status>
+ <midino>0x2E</midino>
+ </control>
+ <control><!-- off -->
+ <group>[Channel2]</group>
+ <key>cue_play</key>
+ <status>0x81</status>
+ <midino>0x2E</midino>
+ </control>
<control><!-- on -->
<group>[Channel2]</group>
<key>play</key>
@@ -930,13 +954,13 @@
</control>
<control><!-- Shifted Play -->
<group>[Channel2]</group>
- <key>start_play</key>
+ <key>sync_master</key>
<status>0x91</status>
<midino>0x2F</midino>
</control>
<control><!-- Shifted Play -->
<group>[Channel2]</group>
- <key>start_play</key>
+ <key>sync_master</key>
<status>0x81</status>
<midino>0x2F</midino>
</control>
@@ -1136,7 +1160,7 @@
</control>
<control><!-- on -->
<group>[Channel2]</group>
- <key>reloop_exit</key>
+ <key>reloop_toggle</key>
<status>0x90</status>
<midino>0x43</midino>
<options>
@@ -1145,7 +1169,7 @@
</control>
<control><!-- off -->
<group>[Channel2]</group>
- <key>reloop_exit</key>
+ <key>reloop_toggle</key>
<status>0x80</status>
<midino>0x43</midino>
<options>
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index 754348d33f..6f4d95a731 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -313,14 +313,14 @@ VMS4.effectSelect = function(channel, control, value, status, group) {
diff += wrapCount*128;
- engine.setValue("[EffectRack1_EffectUnit"+VMS4.GetDeckNum(group)+"]","chain_selector",diff);
+ engine.setValue("[EffectRack1_EffectUnit"+VMS4.GetDeckNum(group)+"_Effect1]","effect_selector",diff);
}
VMS4.effectSelectPress = function(channel, control, value, status, group) {
var deckNum = VMS4.GetDeckNum(group);
if (value > 0x40) {
- engine.setValue("[EffectRack1_EffectUnit"+deckNum+"]","enabled",
- !engine.getValue("[EffectRack1_EffectUnit"+deckNum+"]","enabled")
+ engine.setValue("[EffectRack1_EffectUnit"+deckNum+"_Effect1]","enabled",
+ !engine.getValue("[EffectRack1_EffectUnit"+deckNum+"_Effect1]","enabled")
);
}
}
From a8269117932b078e93b8b0f65a4178994c23214f Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Tue, 15 May 2018 15:52:32 -0700
Subject: [PATCH 3/6] American Audio VMS4 updates: - Change CUP button to use
cue_gotoandplay - Add strip scroll and touch functions that make the
absolute-position touch scripts behave like relative-mode ones for scrolling
through the library - Comment-out needle drop function in preparation for
replacing it with effect dry/wet - Update script version and date
---
res/controllers/American Audio VMS4.midi.xml | 91 +++++++++++++++++++++++---
res/controllers/American-Audio-VMS4-scripts.js | 49 ++++++++++++--
2 files changed, 124 insertions(+), 16 deletions(-)
diff --git a/res/controllers/American Audio VMS4.midi.xml b/res/controllers/American Audio VMS4.midi.xml
index 147d89d857..3116252a7a 100644
--- a/res/controllers/American Audio VMS4.midi.xml
+++ b/res/controllers/American Audio VMS4.midi.xml
@@ -4,7 +4,8 @@
<name>American Audio VMS4/4.1</name>
<author>Anders Gunnarsson &amp; Sean M. Pappalardo</author>
<wiki>http://mixxx.org/wiki/doku.php/american_audio_vms4</wiki>
- <description>2-deck control/4-deck mixer preset for Mixxx 2.1. Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
+ <description>2-deck control/4-deck mixer preset for Mixxx 2.1.
+Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
</info>
<controller id="American Audio VMS4">
<scriptfiles>
@@ -270,13 +271,13 @@
</control>
<control><!-- on -->
<group>[Channel1]</group>
- <key>cue_play</key>
+ <key>cue_gotoandplay</key>
<status>0x91</status>
<midino>0x0C</midino>
</control>
<control><!-- off -->
<group>[Channel1]</group>
- <key>cue_play</key>
+ <key>cue_gotoandplay</key>
<status>0x81</status>
<midino>0x0C</midino>
</control>
@@ -705,14 +706,50 @@
</options>
</control>
<control>
- <group>[Channel1]</group>
- <key>VMS4.touch_strip</key>
+ <group>[Library]</group>
+ <key>VMS4.strip_scroll</key>
<status>0xB0</status>
<midino>0x28</midino>
<options>
<Script-Binding/>
</options>
</control>
+ <control>
+ <group>[Channel1]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x90</status>
+ <midino>0x57</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel1]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x80</status>
+ <midino>0x57</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control> <!-- Shifted -->
+ <group>[Channel1]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x91</status>
+ <midino>0x57</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel1]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x81</status>
+ <midino>0x57</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
<!-- Deck B -->
<control>
@@ -936,13 +973,13 @@
</control>
<control><!-- on -->
<group>[Channel2]</group>
- <key>cue_play</key>
+ <key>cue_gotoandplay</key>
<status>0x91</status>
<midino>0x2E</midino>
</control>
<control><!-- off -->
<group>[Channel2]</group>
- <key>cue_play</key>
+ <key>cue_gotoandplay</key>
<status>0x81</status>
<midino>0x2E</midino>
</control>
@@ -1366,14 +1403,50 @@
</options>
</control>
<control>
- <group>[Channel2]</group>
- <key>VMS4.touch_strip</key>
+ <group>[Library]</group>
+ <key>VMS4.strip_scroll</key>
<status>0xB0</status>
<midino>0x2D</midino>
<options>
<Script-Binding/>
</options>
</control>
+ <control>
+ <group>[Channel2]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x90</status>
+ <midino>0x58</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel2]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x80</status>
+ <midino>0x58</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control> <!-- Shifted -->
+ <group>[Channel2]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x91</status>
+ <midino>0x58</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
+ <control>
+ <group>[Channel2]</group>
+ <key>VMS4.strip_touch</key>
+ <status>0x81</status>
+ <midino>0x58</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
<!-- Mixer main-->
<control>
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index 6f4d95a731..8096205cee 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -1,7 +1,7 @@
/**
- * American Audio VMS4 controller script v2.0 for Mixxx v2.0
+ * American Audio VMS4 controller script v2.1 for Mixxx v2.1.x
* Copyright (C) 2010 Anders Gunnarsson
- * Copyright (C) 2011-2015 Sean M. Pappalardo
+ * Copyright (C) 2011-2018 Sean M. Pappalardo
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -228,6 +228,8 @@ VMS4.Deck.prototype.keyLockButtonHandler = function(value) {
}
VMS4.Deck.prototype.effectParamButtonHandler = function(value) {
+ // Couldn't get this to work. The buttons are mapped instead to VMS4.effectParameterButton
+
// if(value == ButtonState.pressed) {
// this.controlEffectParameter=!this.controlEffectParameter;
// if (this.controlEffectParameter) {
@@ -244,6 +246,10 @@ VMS4.Deck.prototype.effectParamButtonHandler = function(value) {
VMS4.Decks = {"Left":new VMS4.Deck(1,"[Channel1]"), "Right":new VMS4.Deck(2,"[Channel2]")};
VMS4.GroupToDeck = {"[Channel1]":"Left", "[Channel2]":"Right"};
VMS4.GroupToDeckNum = {"[Channel1]":1, "[Channel2]":2, "[Channel3]":3, "[Channel4]":4};
+VMS4.StripToSide = {0x28:"Left", 0x2D:"Right"};
+VMS4.touchStripPos = {"Left":null, "Right":null}; // Stores the position on touch
+ // to convert the absolute sliders
+ // to relative ones
VMS4.GetDeck = function(group) {
try {
@@ -392,11 +398,40 @@ VMS4.jog_move_msb = function(channel, control, value, status, group) {
deck.jogMsb = value;
}
-VMS4.touch_strip = function(channel, control, value, status, group) {
- // Only modify the playposition if the deck is NOT playing!
- if (engine.getValue(group, "play") === 0) {
- engine.setValue(group, "playposition", value/0x7F);
- }
+// VMS4.touch_strip = function(channel, control, value, status, group) {
+// // Only modify the playposition if the deck is NOT playing!
+// if (engine.getValue(group, "play") === 0) {
+// engine.setValue(group, "playposition", value/0x7F);
+// }
+// }
+
+VMS4.strip_touch = function(channel, control, value, status, group) {
+ var deck = VMS4.GetDeckNum(group);
+ if (deck === 1) { // Left side
+ if ((status & 0xF0) === 0x90) { // If button down
+ // TODO: Need a CO to focus explicitly on category selection pane
+ // "[Library]","MoveFocus" just toggles and is frustrating
+ } else { // Button up
+ VMS4.touchStripPos["Left"] = null;
+ }
+ } else { // Right side
+ if ((status & 0xF0) === 0x90) { // If button down
+ // TODO: Need a CO to focus explicitly on track selection pane
+ // "[Library]","MoveFocus" just toggles and is frustrating
+ } else { // Button up
+ VMS4.touchStripPos["Right"] = null;
+ }
+ }
+}
+
+VMS4.strip_scroll = function(channel, control, value, status, group) {
+ var side = VMS4.StripToSide[control];
+ if (VMS4.touchStripPos[side] != null) {
+ // Higher on the strip gives a higher value, and up is negative on Library
+ // scroll controls
+ engine.setValue(group, "MoveVertical", VMS4.touchStripPos[side] - value);
+ }
+ VMS4.touchStripPos[side] = value;
}
VMS4.vinyl = function(channel, control, value, status, group) {
From 00dc8100a40c5b1ab10ced81567003b31865befb Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Wed, 16 May 2018 16:34:34 -0700
Subject: [PATCH 4/6] AA VMS4 preset update - touch strip FX - Add effects
dry/wet control to shifted touch strips - Replace setValue() with
setParameter() - Delete now-unneeded strip touch button down if branch
---
res/controllers/American Audio VMS4.midi.xml | 18 +++++++++++++
res/controllers/American-Audio-VMS4-scripts.js | 36 ++++++++++++--------------
2 files changed, 34 insertions(+), 20 deletions(-)
diff --git a/res/controllers/American Audio VMS4.midi.xml b/res/controllers/American Audio VMS4.midi.xml
index 3116252a7a..7e4d0330c8 100644
--- a/res/controllers/American Audio VMS4.midi.xml
+++ b/res/controllers/American Audio VMS4.midi.xml
@@ -714,6 +714,15 @@ Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
<Script-Binding/>
</options>
</control>
+ <control> <!-- Shifted -->
+ <group>[EffectRack1_EffectUnit1]</group>
+ <key>VMS4.strip_fx_dw</key>
+ <status>0xB1</status>
+ <midino>0x28</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
<control>
<group>[Channel1]</group>
<key>VMS4.strip_touch</key>
@@ -1411,6 +1420,15 @@ Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
<Script-Binding/>
</options>
</control>
+ <control> <!-- Shifted -->
+ <group>[EffectRack1_EffectUnit2]</group>
+ <key>VMS4.strip_fx_dw</key>
+ <status>0xB1</status>
+ <midino>0x2D</midino>
+ <options>
+ <Script-Binding/>
+ </options>
+ </control>
<control>
<group>[Channel2]</group>
<key>VMS4.strip_touch</key>
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index 8096205cee..0a001a77dc 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -319,7 +319,8 @@ VMS4.effectSelect = function(channel, control, value, status, group) {
diff += wrapCount*128;
- engine.setValue("[EffectRack1_EffectUnit"+VMS4.GetDeckNum(group)+"_Effect1]","effect_selector",diff);
+ engine.setValue("[EffectRack1_EffectUnit"+VMS4.GetDeckNum(group)+"_Effect1]",
+ "effect_selector",diff);
}
VMS4.effectSelectPress = function(channel, control, value, status, group) {
@@ -336,11 +337,9 @@ VMS4.effectControl = function(channel, control, value, status, group) {
var deck = VMS4.GetDeck(group);
var deckNum = VMS4.GetDeckNum(group);
if (deck.controlEffectParameter) {
- engine.setValue("[EffectRack1_EffectUnit"+deckNum+"]","super1",
- script.absoluteLin(value,0,1));
+ engine.setParameter("[EffectRack1_EffectUnit"+deckNum+"]","super1",value/0x7F);
} else {
- engine.setValue("[EffectRack1_EffectUnit"+deckNum+"]","mix",
- script.absoluteLin(value,0,1));
+ engine.setParameter("[EffectRack1_EffectUnit"+deckNum+"]","mix",value/0x7F);
}
}
@@ -398,27 +397,18 @@ VMS4.jog_move_msb = function(channel, control, value, status, group) {
deck.jogMsb = value;
}
-// VMS4.touch_strip = function(channel, control, value, status, group) {
-// // Only modify the playposition if the deck is NOT playing!
-// if (engine.getValue(group, "play") === 0) {
-// engine.setValue(group, "playposition", value/0x7F);
-// }
-// }
+VMS4.strip_fx_dw = function(channel, control, value, status, group) {
+ engine.setParameter(group,"mix",value/0x7F);
+}
VMS4.strip_touch = function(channel, control, value, status, group) {
var deck = VMS4.GetDeckNum(group);
if (deck === 1) { // Left side
- if ((status & 0xF0) === 0x90) { // If button down
- // TODO: Need a CO to focus explicitly on category selection pane
- // "[Library]","MoveFocus" just toggles and is frustrating
- } else { // Button up
+ if ((status & 0xF0) === 0x80) { // If button up
VMS4.touchStripPos["Left"] = null;
}
} else { // Right side
- if ((status & 0xF0) === 0x90) { // If button down
- // TODO: Need a CO to focus explicitly on track selection pane
- // "[Library]","MoveFocus" just toggles and is frustrating
- } else { // Button up
+ if ((status & 0xF0) === 0x80) { // If button up
VMS4.touchStripPos["Right"] = null;
}
}
@@ -429,7 +419,13 @@ VMS4.strip_scroll = function(channel, control, value, status, group) {
if (VMS4.touchStripPos[side] != null) {
// Higher on the strip gives a higher value, and up is negative on Library
// scroll controls
- engine.setValue(group, "MoveVertical", VMS4.touchStripPos[side] - value);
+ if (side === "Left") {
+ engine.setValue("[Playlist]", "SelectPlaylist",
+ VMS4.touchStripPos[side] - value);
+ } else {
+ engine.setValue("[Playlist]", "SelectTrackKnob",
+ VMS4.touchStripPos[side] - value);
+ }
}
VMS4.touchStripPos[side] = value;
}
From 89c951158c58296e21c8720ea336b8ea0523fd1a Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Mon, 21 May 2018 08:28:22 -0700
Subject: [PATCH 5/6] Address code review notes.
---
res/controllers/American-Audio-VMS4-scripts.js | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index 0a001a77dc..ab7cd72d0d 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -326,9 +326,7 @@ VMS4.effectSelect = function(channel, control, value, status, group) {
VMS4.effectSelectPress = function(channel, control, value, status, group) {
var deckNum = VMS4.GetDeckNum(group);
if (value > 0x40) {
- engine.setValue("[EffectRack1_EffectUnit"+deckNum+"_Effect1]","enabled",
- !engine.getValue("[EffectRack1_EffectUnit"+deckNum+"_Effect1]","enabled")
- );
+ script.toggleControl("[EffectRack1_EffectUnit"+deckNum+"_Effect1]","enabled");
}
}
@@ -416,7 +414,7 @@ VMS4.strip_touch = function(channel, control, value, status, group) {
VMS4.strip_scroll = function(channel, control, value, status, group) {
var side = VMS4.StripToSide[control];
- if (VMS4.touchStripPos[side] != null) {
+ if (VMS4.touchStripPos[side] !== null) {
// Higher on the strip gives a higher value, and up is negative on Library
// scroll controls
if (side === "Left") {
From 715548faf594a68c23ac8fccc32ce7d2108526bc Mon Sep 17 00:00:00 2001
From: "Sean M. Pappalardo" <pegasus@renegadetech.com>
Date: Mon, 21 May 2018 09:10:14 -0700
Subject: [PATCH 6/6] Add needle drop when deck isn't playing, FX dry/wet when
it is.
---
res/controllers/American Audio VMS4.midi.xml | 4 ++--
res/controllers/American-Audio-VMS4-scripts.js | 8 +++++++-
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/res/controllers/American Audio VMS4.midi.xml b/res/controllers/American Audio VMS4.midi.xml
index 7e4d0330c8..e1b83a2fc9 100644
--- a/res/controllers/American Audio VMS4.midi.xml
+++ b/res/controllers/American Audio VMS4.midi.xml
@@ -715,7 +715,7 @@ Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
</options>
</control>
<control> <!-- Shifted -->
- <group>[EffectRack1_EffectUnit1]</group>
+ <group>[Channel1]</group>
<key>VMS4.strip_fx_dw</key>
<status>0xB1</status>
<midino>0x28</midino>
@@ -1421,7 +1421,7 @@ Assumes "Post EQ" mode. (See Wiki for full setup instructions.)</description>
</options>
</control>
<control> <!-- Shifted -->
- <group>[EffectRack1_EffectUnit2]</group>
+ <group>[Channel2]</group>
<key>VMS4.strip_fx_dw</key>
<status>0xB1</status>
<midino>0x2D</midino>
diff --git a/res/controllers/American-Audio-VMS4-scripts.js b/res/controllers/American-Audio-VMS4-scripts.js
index ab7cd72d0d..c312e0394a 100644
--- a/res/controllers/American-Audio-VMS4-scripts.js
+++ b/res/controllers/American-Audio-VMS4-scripts.js
@@ -396,7 +396,13 @@ VMS4.jog_move_msb = function(channel, control, value, status, group) {
}
VMS4.strip_fx_dw = function(channel, control, value, status, group) {
- engine.setParameter(group,"mix",value/0x7F);
+ var deck = VMS4.GetDeckNum(group);
+ // When the deck is playing, adjust effect dry/wet. When it isn't, do needle drop.
+ if (engine.getValue(group, "play") === 0) {
+ engine.setValue(group, "playposition", value/0x7F);
+ } else {
+ engine.setParameter("[EffectRack1_EffectUnit"+deck+"]","mix",value/0x7F);
+ }
}
VMS4.strip_touch = function(channel, control, value, status, group) {

View File

@@ -1,79 +0,0 @@
From e41777469701d85069680984b6365fe7a22fd537 Mon Sep 17 00:00:00 2001
From: Uwe Klotz <uklotz@mixxx.org>
Date: Tue, 24 Apr 2018 00:56:02 +0200
Subject: [PATCH] Use an in-memory database to speed up library tests
---
src/database/mixxxdb.cpp | 10 ++++++----
src/database/mixxxdb.h | 3 ++-
src/test/librarytest.h | 5 ++++-
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/database/mixxxdb.cpp b/src/database/mixxxdb.cpp
index 2046129b44..ef01bcc0f1 100644
--- a/src/database/mixxxdb.cpp
+++ b/src/database/mixxxdb.cpp
@@ -19,11 +19,12 @@ const mixxx::Logger kLogger("MixxxDb");
// The connection parameters for the main Mixxx DB
mixxx::DbConnection::Params dbConnectionParams(
- const UserSettingsPointer& pConfig) {
+ const UserSettingsPointer& pConfig,
+ bool inMemoryConnection) {
mixxx::DbConnection::Params params;
params.type = "QSQLITE";
params.hostName = "localhost";
- params.filePath = QDir(pConfig->getSettingsPath()).filePath("mixxxdb.sqlite");
+ params.filePath = inMemoryConnection ? QString(":memory:") : QDir(pConfig->getSettingsPath()).filePath("mixxxdb.sqlite");
params.userName = "mixxx";
params.password = "mixxx";
return params;
@@ -32,8 +33,9 @@ mixxx::DbConnection::Params dbConnectionParams(
} // anonymous namespace
MixxxDb::MixxxDb(
- const UserSettingsPointer& pConfig)
- : m_pDbConnectionPool(std::make_shared<mixxx::DbConnectionPool>(dbConnectionParams(pConfig), "MIXXX")) {
+ const UserSettingsPointer& pConfig,
+ bool inMemoryConnection)
+ : m_pDbConnectionPool(std::make_shared<mixxx::DbConnectionPool>(dbConnectionParams(pConfig, inMemoryConnection), "MIXXX")) {
}
bool MixxxDb::initDatabaseSchema(
diff --git a/src/database/mixxxdb.h b/src/database/mixxxdb.h
index 4e5fe77182..0ca67631bc 100644
--- a/src/database/mixxxdb.h
+++ b/src/database/mixxxdb.h
@@ -23,7 +23,8 @@ class MixxxDb : public QObject {
int schemaVersion = kRequiredSchemaVersion);
explicit MixxxDb(
- const UserSettingsPointer& pConfig);
+ const UserSettingsPointer& pConfig,
+ bool inMemoryConnection = false);
mixxx::DbConnectionPoolPtr connectionPool() const {
return m_pDbConnectionPool;
diff --git a/src/test/librarytest.h b/src/test/librarytest.h
index 1baae898cf..7cf4459a21 100644
--- a/src/test/librarytest.h
+++ b/src/test/librarytest.h
@@ -9,6 +9,9 @@
#include "util/db/dbconnectionpooled.h"
#include "track/globaltrackcache.h"
+namespace {
+ const bool kInMemoryDbConnection = true;
+} // anonymous namespace
class LibraryTest : public MixxxTest,
public virtual /*implements*/ GlobalTrackCacheSaver {
@@ -21,7 +24,7 @@ class LibraryTest : public MixxxTest,
protected:
LibraryTest()
- : m_mixxxDb(config()),
+ : m_mixxxDb(config(), kInMemoryDbConnection),
m_dbConnectionPooler(m_mixxxDb.connectionPool()),
m_dbConnection(mixxx::DbConnectionPooled(m_mixxxDb.connectionPool())),
m_trackCollection(config()) {

View File

@@ -1,24 +0,0 @@
From bd9084d2d592bf34980e88428b7d1af40fce6b55 Mon Sep 17 00:00:00 2001
From: "S.Brandt" <s.brandt@mixxx.org>
Date: Sun, 22 Apr 2018 16:34:19 +0200
Subject: [PATCH] In ``Help --> Send Us Feedback``, use new link to updated 2.1
feedback form.
---
src/defs_urls.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/defs_urls.h b/src/defs_urls.h
index 993ad91d35..29b377d980 100644
--- a/src/defs_urls.h
+++ b/src/defs_urls.h
@@ -19,8 +19,8 @@
#define MIXXX_WEBSITE_URL "https://www.mixxx.org"
#define MIXXX_SUPPORT_URL "https://www.mixxx.org/support/"
-#define MIXXX_FEEDBACK_URL "https://docs.google.com/forms/d/14pLA_aeK0TZUgpfEa6uVLknRX2CBPBPf99gHNHkYgUc/viewform"
#define MIXXX_TRANSLATION_URL "https://www.transifex.com/projects/p/mixxxdj/"
+#define MIXXX_FEEDBACK_URL "https://goo.gl/forms/IHf3JK7Q9DXmExXc2"
#define MIXXX_MANUAL_URL "https://mixxx.org/manual/2.1"
#define MIXXX_SHORTCUTS_URL "https://mixxx.org/manual/2.1/chapters/appendix.html#keyboard-mapping-table"
#define MIXXX_MANUAL_FILENAME "Mixxx-Manual.pdf"

View File

@@ -1,164 +0,0 @@
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
EAPI=6
inherit flag-o-matic scons-utils toolchain-funcs
DESCRIPTION="Advanced Digital DJ tool based on Qt"
HOMEPAGE="https://www.mixxx.org/"
SRC_URI="https://github.com/mixxxdj/${PN}/archive/release-${PV}.tar.gz -> ${P}-src.tar.gz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="aac doc ffmpeg hid mp3 mp4 shout wavpack"
RDEPEND="
dev-db/sqlite
dev-libs/protobuf:0=
dev-qt/qtconcurrent:5
dev-qt/qtcore:5
dev-qt/qtgui:5
dev-qt/qtnetwork:5
dev-qt/qtopengl:5
dev-qt/qtscript:5[scripttools]
dev-qt/qtsql:5
dev-qt/qtsvg:5
dev-qt/qtwidgets:5
dev-qt/qtxml:5
media-libs/chromaprint
media-libs/flac
media-libs/libid3tag
media-libs/libogg
media-libs/libsndfile
>=media-libs/libsoundtouch-1.5
media-libs/libvorbis
>=media-libs/portaudio-19_pre
media-libs/portmidi
media-libs/rubberband
media-libs/taglib
media-libs/vamp-plugin-sdk
sci-libs/fftw:3.0=
virtual/libusb:1
virtual/opengl
x11-libs/libX11
aac? (
media-libs/faad2
media-libs/libmp4v2:0
)
hid? ( dev-libs/hidapi )
mp3? ( media-libs/libmad )
mp4? ( media-libs/libmp4v2:= )
shout? ( media-libs/libshout )
wavpack? ( media-sound/wavpack )
ffmpeg? ( media-video/ffmpeg:0= )
"
DEPEND="
${RDEPEND}
virtual/pkgconfig
dev-qt/qttest:5
dev-qt/qtxmlpatterns:5
dev-vcs/git
"
PATCHES=(
"${FILESDIR}"/${PN}-2.0.0-docs.patch
"${FILESDIR}"/${P}-swap-default-values-for-temp-perm-ratechanges.patch
"${FILESDIR}"/${P}-fix-invocation-args-of-pasuspender.patch
"${FILESDIR}"/${P}-fix-unresponsive-scrolling-through-crates-and-playlists-using-encoder.patch
"${FILESDIR}"/${P}-debug-assert-and-fix-false-poisitiv-restart-request.patch
"${FILESDIR}"/${P}-fidlib-thread-safe-and-reentrant-generation-of-filters.patch
"${FILESDIR}"/${P}-fix-navigation-usability-issues-in-sidebar-tree.patch
"${FILESDIR}"/${P}-fix-latenight-group-fx-buttons-in-deck.patch
"${FILESDIR}"/${P}-fix-crash-when-removing-a-quick-link.patch
"${FILESDIR}"/${P}-fix-clearing-of-replaygain-gain-ratio-in-file-tags.patch
"${FILESDIR}"/${P}-fix-memory-leak-when-loading-cover-art.patch
"${FILESDIR}"/${P}-use-an-in-memory-database-to-speed-up-library-tests.patch
"${FILESDIR}"/${P}-fix-integration-of-external-track-libraries.patch
"${FILESDIR}"/${P}-fix-flac-decoding-and-upgrade-db-schema.patch
"${FILESDIR}"/${P}-fix-s4-mk2-for-windows.patch
"${FILESDIR}"/${P}-pioneer-ddj-sx-mapping-bugfixes.patch
"${FILESDIR}"/${P}-deere-add-gain-knob-to-expanded-sampler-view.patch
"${FILESDIR}"/${P}-fix-decoding-of-improperly-encoded-flac-files.patch
"${FILESDIR}"/${P}-fix-spinback-inertia-effect-partial-revert-of-2b612c2.patch
"${FILESDIR}"/${P}-denon-mc6000mk2-use-ramping-for-back-spins.patch
"${FILESDIR}"/${P}-optimize-flac-decoding.patch
"${FILESDIR}"/${P}-detect-m4a-decoding-errors-on-windows.patch
"${FILESDIR}"/${P}-fix-cachingreader-compiler-warnings-about-non-trivial-types.patch
"${FILESDIR}"/${P}-components-js-fixes.patch
"${FILESDIR}"/${P}-denon-mc6000mk2-fix-looping.patch
"${FILESDIR}"/${P}-dlgtrackinfo-mismatching-signal-slot-connection.patch
"${FILESDIR}"/${P}-reduce-log-spam-from-soundsourceproxy.patch
"${FILESDIR}"/${P}-qt5-2.1.patch
"${FILESDIR}"/${P}-update-american-audio-vms4-preset-for-mixxx-v2.1.x.patch
"${FILESDIR}"/${P}-empty-library-fix-lp1772591.patch
#"${FILESDIR}"/${P}-try-to-fix-appstream-config-and-desktop-icon.patch
"${FILESDIR}"/${P}-use-new-link-to-updated-2-1-feedback-form.patch
#"${FILESDIR}"/${P}-library-improvements-for-all-skins-fix-lp1772202-in-tango.patch
"${FILESDIR}"/${P}-fix-crash-when-importing-id3v2-apic-frames.patch
"${FILESDIR}"/${P}-fix-some-log-levels-and-reduce-debug-log-spam.patch
"${FILESDIR}"/${P}-os-theme-shining-though-fix.patch
"${FILESDIR}"/${P}-beatsync-fix.patch
)
S="${WORKDIR}/${PN}-release-${PV}"
src_prepare() {
# use multilib compatible directory for plugins
sed -i -e "/unix_lib_path =/s/'lib'/'$(get_libdir)'/" src/SConscript || die
default
einfo "Applying ${P}-try-to-fix-appstream-config-and-desktop-icon.patch ..."
git apply --ignore-whitespace -p1 < "${FILESDIR}"/${P}-try-to-fix-appstream-config-and-desktop-icon.patch 2>/dev/null
einfo "Applying ${P}-library-improvements-for-all-skins-fix-lp1772202-in-tango.patch ..."
git apply --ignore-whitespace -p1 < "${FILESDIR}"/${P}-library-improvements-for-all-skins-fix-lp1772202-in-tango.patch 2>/dev/null
}
src_configure() {
local myoptimize=0
# Required for >=qt-5.7.0 (bug #590690)
append-cxxflags -std=c++11
# Try to get cpu type based on CFLAGS.
# Bug #591968
for i in $(get-flag mcpu) $(get-flag march) ; do
if [[ ${i} = native ]] ; then
myoptimize="native"
break
fi
done
myesconsargs=(
prefix="${EPREFIX}/usr"
qtdir="${EPREFIX}/usr/$(get_libdir)/qt5"
faad="$(usex aac 1 0)"
ffmpeg="$(usex ffmpeg 1 0)"
hid="$(usex hid 1 0)"
hifieq=1
m4a="$(usex mp4 1 0)"
mad="$(usex mp3 1 0)"
optimize="${myoptimize}"
# force qdebug enabled (https://bugs.launchpad.net/mixxx/+bug/1737546)
qdebug=1
qt5=1
shoutcast="$(usex shout 1 0)"
vinylcontrol=1
wv="$(usex wavpack 1 0)"
)
}
src_compile() {
CC="$(tc-getCC)" CXX="$(tc-getCXX)" LINKFLAGS="${LDFLAGS}" \
LIBDIR="${EPREFIX}/usr/$(get_libdir)" escons ${myesconsargs[@]}
}
src_install() {
CC="$(tc-getCC)" CXX="$(tc-getCXX)" LINKFLAGS="${LDFLAGS}" \
LIBDIR="${EPREFIX}/usr/$(get_libdir)" escons ${myesconsargs[@]} \
install_root="${ED}"/usr install
dodoc README Mixxx-Manual.pdf
}

View File

@@ -0,0 +1,122 @@
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
EAPI=6
inherit flag-o-matic scons-utils toolchain-funcs
DESCRIPTION="Advanced Digital DJ tool based on Qt"
HOMEPAGE="https://www.mixxx.org/"
SRC_URI="https://github.com/mixxxdj/${PN}/archive/release-${PV}.tar.gz -> ${P}-src.tar.gz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="aac doc ffmpeg hid mp3 mp4 shout wavpack"
RDEPEND="
dev-db/sqlite
dev-libs/protobuf:0=
dev-qt/qtconcurrent:5
dev-qt/qtcore:5
dev-qt/qtgui:5
dev-qt/qtnetwork:5
dev-qt/qtopengl:5
dev-qt/qtscript:5[scripttools]
dev-qt/qtsql:5
dev-qt/qtsvg:5
dev-qt/qtwidgets:5
dev-qt/qtxml:5
media-libs/chromaprint
media-libs/flac
media-libs/libid3tag
media-libs/libogg
media-libs/libsndfile
>=media-libs/libsoundtouch-2.0
media-libs/libvorbis
>=media-libs/portaudio-19_pre
media-libs/portmidi
media-libs/rubberband
media-libs/taglib
media-libs/vamp-plugin-sdk
sci-libs/fftw:3.0=
virtual/libusb:1
virtual/opengl
x11-libs/libX11
aac? (
media-libs/faad2
media-libs/libmp4v2:0
)
hid? ( dev-libs/hidapi )
mp3? ( media-libs/libmad )
mp4? ( media-libs/libmp4v2:= )
shout? ( media-libs/libshout )
wavpack? ( media-sound/wavpack )
ffmpeg? ( media-video/ffmpeg:0= )
"
DEPEND="
${RDEPEND}
virtual/pkgconfig
dev-qt/qttest:5
dev-qt/qtxmlpatterns:5
"
PATCHES=(
"${FILESDIR}"/${PN}-2.0.0-docs.patch
)
S="${WORKDIR}/${PN}-release-${PV}"
src_prepare() {
# use multilib compatible directory for plugins
sed -i -e "/unix_lib_path =/s/'lib'/'$(get_libdir)'/" src/SConscript || die
default
}
src_configure() {
local myoptimize=0
# Required for >=qt-5.7.0 (bug #590690)
append-cxxflags -std=c++11
# Try to get cpu type based on CFLAGS.
# Bug #591968
for i in $(get-flag mcpu) $(get-flag march) ; do
if [[ ${i} = native ]] ; then
myoptimize="native"
break
fi
done
myesconsargs=(
prefix="${EPREFIX}/usr"
qtdir="${EPREFIX}/usr/$(get_libdir)/qt5"
faad="$(usex aac 1 0)"
ffmpeg="$(usex ffmpeg 1 0)"
hid="$(usex hid 1 0)"
hifieq=1
m4a="$(usex mp4 1 0)"
mad="$(usex mp3 1 0)"
optimize="${myoptimize}"
# force qdebug enabled (https://bugs.launchpad.net/mixxx/+bug/1737546)
qdebug=1
qt5=1
shoutcast="$(usex shout 1 0)"
vinylcontrol=1
wv="$(usex wavpack 1 0)"
)
}
src_compile() {
CC="$(tc-getCC)" CXX="$(tc-getCXX)" LINKFLAGS="${LDFLAGS}" \
LIBDIR="${EPREFIX}/usr/$(get_libdir)" escons ${myesconsargs[@]}
}
src_install() {
CC="$(tc-getCC)" CXX="$(tc-getCXX)" LINKFLAGS="${LDFLAGS}" \
LIBDIR="${EPREFIX}/usr/$(get_libdir)" escons ${myesconsargs[@]} \
install_root="${ED}"/usr install
dodoc README Mixxx-Manual.pdf
}