summaryrefslogtreecommitdiff
path: root/media-sound/mixxx
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
committerV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
commit4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch)
treeba5f07bf3f9d22d82e54a462313f5d244036c768 /media-sound/mixxx
reinit the tree, so we can have metadata
Diffstat (limited to 'media-sound/mixxx')
-rw-r--r--media-sound/mixxx/Manifest23
-rw-r--r--media-sound/mixxx/files/mixxx-1.10.0-cflags.patch13
-rw-r--r--media-sound/mixxx/files/mixxx-1.10.0-docs.patch10
-rw-r--r--media-sound/mixxx/files/mixxx-1.10.0-no-bzr.patch37
-rw-r--r--media-sound/mixxx/files/mixxx-1.10.0-system-libs.patch172
-rw-r--r--media-sound/mixxx/files/mixxx-1.11.0-no-bzr.patch35
-rw-r--r--media-sound/mixxx/files/mixxx-1.11.0-system-libs.patch223
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-chromaprint-1.4.patch40
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-docs.patch10
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-eliminate-unnecessary-heap-allocation-of-qtime.patch55
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations.patch24
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations2.patch139
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-fix-missing-pointer-initialization.patch271
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-gcc62.patch24
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-move-definition-of-time-formatseconds-into-dot-cpp-file.patch88
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-rmx2-backport-controller-scripts.patch280
-rw-r--r--media-sound/mixxx/files/mixxx-2.0.0-sqlite3.patch14
-rw-r--r--media-sound/mixxx/metadata.xml16
-rw-r--r--media-sound/mixxx/mixxx-2.0.0-r4.ebuild142
19 files changed, 1616 insertions, 0 deletions
diff --git a/media-sound/mixxx/Manifest b/media-sound/mixxx/Manifest
new file mode 100644
index 000000000000..882f75750516
--- /dev/null
+++ b/media-sound/mixxx/Manifest
@@ -0,0 +1,23 @@
+AUX mixxx-1.10.0-cflags.patch 573 SHA256 2e37a38c7ac7fa14e495b999b9e81d9a10ea2aa36ec1f17142e3299c91d4f738 SHA512 1157161dc85314da07c47f5b42b654d5391ca3b84412f10915b5d15a9fe6cc0dbbf06f7e3156cb2f9cf21f0233ee50ae7e54cb10855332f0292b3bba915f857a WHIRLPOOL b71b3496256e8a18c6025b889ebde41caacab359115f9ed1d9866f26b150cbdb013e499841ae5ba5dd4e33797482649bef035d172a8fa27e8f1a980234a7683b
+AUX mixxx-1.10.0-docs.patch 327 SHA256 d092d360ccc533f1fa57d39577cd2fffb6089461744844ac3df3d4a0a60280bf SHA512 c785cab9ba558d5f4df04e6f89515a2056e2db84767061d0f0e1fa140fd419c384d49d78dae913e31663da4b8680a0ea966414be2c9309d4da5c2ba0dddadcc1 WHIRLPOOL 25ab693b9c64acaa8b74fc9dc9127c3b5ea91b7c6360cd1629642d53728918f2d83d4c431bf3b4ce2fc06fcaa1ac6d173a248e7d1826fc2f855da35ded1f91d4
+AUX mixxx-1.10.0-no-bzr.patch 1503 SHA256 7584acf4623f2dbbb70b675675242fe528729bf9d39c3eadff4fff87650f157c SHA512 faeedcdaa29ed6939b22ed6e60a8493c8d76f45904287667b4c7aa1b2e9acaa43810b005ad5d31eafb466e1717d18f773929ee41a9ab0e6c5c39b33fd07d8d59 WHIRLPOOL 0e3ce80f49deab8b7c13687495fccc2e0302313ef7a44e14977fecf44e7b72d22b58cc6c077848b4a9ecce6ec0350d7edc31e30fc3ffdd7268d8780703884fd9
+AUX mixxx-1.10.0-system-libs.patch 7152 SHA256 c3809896e75c6c4e5e714e75527ec5a970edca5e75124fa06bbe02fb9b08b0a1 SHA512 18d47f0a68c9cd333ebd719e58421db27df15e9babd913750907d2a725236c6a7ad90b7c2a67b6b746d14f94676e746db0f2dcce80af09c02b0d762d6eb7d2b8 WHIRLPOOL 199568040e70bac946a5f468de8f856e48be8973bb4011e14c77c5dcd59203c9664e6d14447d3d52834c1cd3e0343011aa174542ca7bfa9db4466aa7ddfa13b6
+AUX mixxx-1.11.0-no-bzr.patch 1390 SHA256 75d3394bde46bd423ca525a592a8d87f273439914f6fb041fc8e10c9ce931b1d SHA512 65f78fcb4c653b93d5ff0a308bca5ec16d0ccdd367e0ac8b15ca1d908aaee332316770cf6b11b2452b2ef8dfe44babd20fd60d58d2fca4cf794073601f6667bb WHIRLPOOL 13f129ff42a37bc5b8e8be698c217d8da853daf1ecac2eb2c14382f9b12defb831fe96cd22005552a6e4d491f7620ab515dd6e5e2a9f259c23e358fce308b919
+AUX mixxx-1.11.0-system-libs.patch 8877 SHA256 0b56ea63ecc1f5960cd3a0d163adf4f4591fc2ec8448fe50d0ed373002bb1c30 SHA512 baabba8c7c873bfe5da4230f13787133b69ee72b83328b41e7eb4ade5d81350765309ae9be8154d93aeb9e7e1f90ef0ac2d8a20153d0600d41173d876d51331f WHIRLPOOL 62683ea716b2408f8adc7b81ca385fe128b05534e0a2a4d5b0c76ea44a6920f37cd287148db1570d8ff6b0a8b7e9d0dac7e8a34a91b1cd974f92c4c1e6e3b968
+AUX mixxx-2.0.0-chromaprint-1.4.patch 1518 SHA256 dd2ee40a6dc2081f9c6592eb9f69001d85fb6fd7eb1860948f2b46c8e864e445 SHA512 31da87b64646188be144611fc6f601d58edfcf9e63b5382060f5088797c24d61ff4b48a4e80c5c3b919b7291287d3977c0f61829ddfe7a43f9fbae7db3b735c0 WHIRLPOOL 9dbcfa9fb14306d43b0294a5d4fc45a2c3644ba83b37868056e76b2c9e77822447ae0a5a8c94140f705f94e847da7a83b8ba5b8f23ba98989fd4423d6ca3bdd4
+AUX mixxx-2.0.0-docs.patch 435 SHA256 133436b8897de326be53e82ca09ce51a8fb956cd8d8c8f3e450ab7d00b50318c SHA512 01ab76466f782f538c894e460f7694553ae12804651f68aabb6aaa0dbdc89e2ff7e2b51529b0f112cee42c8053b75fc64241a9c8898def8cf1c76231b1ec5d59 WHIRLPOOL 9155ef87f9958927bb046a4359a2e7a74210d01dc259df772c8bf97a23081f1fd9e39fa7cd108d90fca502bd366770ad1b656809e431ba45a287fd67289bf98a
+AUX mixxx-2.0.0-eliminate-unnecessary-heap-allocation-of-qtime.patch 1615 SHA256 6e0bb9063974a39384af2a4c9a55c64bd5187fe341d28d0bbff3da4a126322ae SHA512 825599d1bdfbcc673c64226bde25f2ae56b046d32139c3347cb2aae698aa27158b17609dd097ce772e62bcd58b7f711d352386069683239541f3f4160dc6d915 WHIRLPOOL 697f730c9bda3d62935b335b3cf79bbd71d2e8d379a7e839f58515b914c5a403fbcaa2b10c3f0f16bdbd9634e7d3974cbe6384f5a90926e3353c88c9d27f7281
+AUX mixxx-2.0.0-fix-formatting-of-time-durations.patch 866 SHA256 8b3da1f2ce481748926d0447ef41bea6c136e53cd146fd5f2a753250406edc00 SHA512 4850724ba1a6809a242976dcec5337b1f9c6c8c93c60c3ce5fa9cf6b6b714aa83485e58e7b97f849720da17e664c89adf33ed53d73d13d249a01700f638de3e2 WHIRLPOOL 43fb9d37735f7da3337c85974062dbe8d4afee544c8b650168bf236088c18b5229a8089b9f250ae5959bb4550e7a11c699c2ef7fdb93c645559a709d2d76e877
+AUX mixxx-2.0.0-fix-formatting-of-time-durations2.patch 5912 SHA256 8188c3019cc7eea1f4c4bae1ea55bf807461e8f78d3c9b0a8a97dc66899886f0 SHA512 c7e7480fb6880e3543ade9455cafa9ef1cfdde0af813cb54c8dc3cd98ad964dcdf7b2c4b209dac89d7654551e54dc0bd185fb00783c0f0507f0f72f21d61a599 WHIRLPOOL 1758e747abf003aa325e45bb7bd81499126a896e2034c0cdd8192623e4fd7c1d6fccbfa7b2ccd634a5396735b52e6e6e444e98b578bd6d9b6f9b3283daaf7ef3
+AUX mixxx-2.0.0-fix-missing-pointer-initialization.patch 9702 SHA256 2cd076c5c09ed5bbbececc91659ee6f70e6fcf4d61fd9be8b58f6fd9e7cc9cad SHA512 048f74fb3c0079f5935f41a4a3b5c04a691f6eaec199a8261dba119e8fa2efe15c4f8e6c24befbfadb7cf1af3db49c75ac52b3a265f52480889d4f9c9ad89eba WHIRLPOOL 4e362b72da4013b35128806515837470f788ef32daa8860318a8bb67479139bf7f1d627f79d6c14a841a527280ae0215ef8580695f2080ce30e97549a35a7cca
+AUX mixxx-2.0.0-gcc62.patch 726 SHA256 8df567f6a13479e9ab0f49c578ea05bdffd9fdbc56da09779d8de3ff28f1298c SHA512 cd0469d29ebf3b0d30154bc178b60383d52abfe5c6a34ed6de83da3ed425ed55630d0bf4159e00b7bd9ddc9822e98a9805051a29b2372f2ae952a43cced34c47 WHIRLPOOL 79b13e725572357f5818d9096dc8b9c7fc87d4b4f75c810467b8131be501e1043c1eef84fd47a7913778c340b3f6a31e25c3cc2f712d2ff4f3afc600338e0631
+AUX mixxx-2.0.0-move-definition-of-time-formatseconds-into-dot-cpp-file.patch 3113 SHA256 487e3c5b180599a480f92c58c15abe3ae3ac4b53b61c759ac98202537dbf3107 SHA512 73ea80adbc32cf8c087cd97d8c8225f1d94ea138835557dac1f8b9cd8e4415ae0f6eb4548a6581aa4a8d3bada01f7c6ad3a538d3907c233a69327f4b3d31b316 WHIRLPOOL d687ba5c3f7cb43ced241f3d98206b6237fd7e37eb52529b7f18b1567308e8748fb6ba1876168f0d68012116c9297e0e5bd73a0bd6001ed863f540c480502039
+AUX mixxx-2.0.0-rmx2-backport-controller-scripts.patch 10840 SHA256 515b8f1d16d13a299770400fb0dfdb09aeaf9dee6c03b94cb73742fd0464f755 SHA512 6ffced1c2368b1c5ad2cadf72fd21c917626318784cfcdbaf2d85ac63955ecdb96aefafd268a005962ced766cf8150b3daf409d587edab6a8b854ab6c7e812c5 WHIRLPOOL 03fb90054dcd30d0b7fb412d46c685cd49b1ed4ea029d7e4b8de56578899e47b1269102fbfc9940190babe1454cc1007653618fe2ceda507cdf27bfadc92955c
+AUX mixxx-2.0.0-sqlite3.patch 345 SHA256 751a9f68555cf01a3675af699652615a9891f1041efbd8c339d702701a175348 SHA512 18e390daf6ec7530614e7601f0695f2e42a4742d4502992b2d86d98a5c0d357c424325fd4e6fec4dad11333730afc34aaf9f3be1d3b6e4c26250e4817468345b WHIRLPOOL 5c82370ad2e35a0a3bd0b7ac1384dbaad033bee3fd9da8916625e984457a4be849a33b307cdf795a3a21dfddd020f0bd956e7cf64d71e33c96f28026eff92dad
+DIST mixxx-2.0.0-ffmpeg30.patch 714 SHA256 a5b6e8fd94ae6572efbff79529dcdb8ec2fc78a2c8fc0864d222516c8dc7b272 SHA512 60788ecab1fa92b825815fff5dfdfefe02fb097e46f7f55f318bb8a8677da42e4601cce51eaaec51988990eebb72d59346d1ec45ed76cac3c8a7f9a9d1e8cf54 WHIRLPOOL 8c780336a5f86ba8134603c1f5e3dd310006f62abe228edb2390e611f2734b0ee7c0bfe5cd91de7fab28e56809804c95fd26da6d198513fc705263e8ceca1612
+DIST mixxx-2.0.0-ffmpeg31.patch 2844 SHA256 d03109463fa1191ca07bc2be6b6503c4b57272e97064f99aae812e132737f905 SHA512 7207ad72d0ea851b1425ff7472aafe5f828ca70aad0821a1ef1eb54845527532489ac7913f6584e3af5fb53bf3459abc173fbf482f83be8a22358d28b1b5cf74 WHIRLPOOL 9284dd52c4ffe04ca7977dc4ee1b6c3a6396375a48dcb9673f39a5ceb2698021f93984d57a774b36b3dfaffa15f9ca603eeae169fa146e9951da0a587fed34dd
+DIST mixxx-2.0.0-src.tar.gz 25300881 SHA256 e1b8f33bba35046608578095ed3209967034579252d84c99e6bc03ec030f676d SHA512 8878c0f785e4c5f67724deeca61154d2587969a81d28aef8fa9d526aec8419a218ce2a7ef88d6fcf468d30fa13d31ac9a56ca9082431a35b7e4e040a7ccfbb1a WHIRLPOOL d3e4cf26846b54380f9b11eed26b90cf031a902ca82f20e71f85fb495f99179e8d783f2ba92b51d21fcc77d4779b7bcc16d8456a68e890cfe77daa57f0d3b431
+EBUILD mixxx-2.0.0-r4.ebuild 3655 SHA256 4416a460d27ac10aa35d7b24f57d7f53c339fdb2d6d94d3cb423c5a7526d3427 SHA512 f5c31c079f440b381e5f9407a97ce3738789345052f764b997361fe1af5098c3d081d6a7508631f897651be52da58a3bebb14d6e4e0c2951c4072e89015ab463 WHIRLPOOL b5e07d542d2d007fd8e49e8266554ec70092b0b3329d43c496f488c43457fbf101bbb573b51e85d1b1d30c67cb568bb9e1ecbbea9bb308437eade5db28fd797d
+MISC ChangeLog 6005 SHA256 0489d41495e44479a18688f1fa1f58f78fd794d6ea4448ad6af5edf17699bbdb SHA512 aae005f426ce3a4e808913b29bbee96d83ec8b6369692567607c555877d7085384be3cfbcce8723ca06e194c6e10180c4bcdb42ee4fbeba2918b8784f6a8047d WHIRLPOOL d5cba52ca1433cfe1abf41737e0ace192f68ab332d48e6c04801a77e9138015a7eb0cef845a2ca4c2c720dcfd3b8c02b32ff2367382c5bff5838f068d8dea368
+MISC ChangeLog-2015 2344 SHA256 f7aad21a96df5f5cb305f5b0721afd36a3b7f662888e9681011de89d097f049c SHA512 51a04ccfb376a141bc9a74346caefb33180cb70e77281850e33ce779586752b2ad50b3b238283100efae387b54f5c40d1159946e0304cb4b1d32d2b5122d6e45 WHIRLPOOL 89a6173c1f8aff226b1c9ef6b3396eb86975fe50c63d71f3718a07de95ed9523378e29e6a06bf2ee94df0afff6731eaf0f15839f4bd655df13c3bd563cd39fb5
+MISC metadata.xml 549 SHA256 7021bc46cf6acdd5fa15dfbe03aee4afd97ff5b2c7f1b4165f673d659761c95b SHA512 c89877382e9baf90038ca7c6175ef8edc3296950dc7386b00f861a90fcc3296ec4d21df665c8aa62042c1b952cd270af77b85a5959518600f43f963ffce51296 WHIRLPOOL fc44885e723d1fa6e1799b293d110ea5268d9da79136cf2358f6eff026d495c113af785ee7ee0384f4b0d4b44ef5a48741f73da9709f4dc846c1008e57a29615
diff --git a/media-sound/mixxx/files/mixxx-1.10.0-cflags.patch b/media-sound/mixxx/files/mixxx-1.10.0-cflags.patch
new file mode 100644
index 000000000000..b6c8655a73a6
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.10.0-cflags.patch
@@ -0,0 +1,13 @@
+--- mixxx-1.10.0/build/depends.py
++++ mixxx-1.10.0/build/depends.py
+@@ -623,10 +555,8 @@
+ if build.toolchain_is_gnu:
+ # Default GNU Options
+ # TODO(XXX) always generate debugging info?
+- build.env.Append(CCFLAGS = '-pipe')
+ build.env.Append(CCFLAGS = '-Wall')
+ build.env.Append(CCFLAGS = '-Wextra')
+- build.env.Append(CCFLAGS = '-g')
+
+ # Check that g++ is present (yeah, SCONS is a bit dumb here)
+ if os.system("which g++ > /dev/null"): #Checks for non-zero return code
diff --git a/media-sound/mixxx/files/mixxx-1.10.0-docs.patch b/media-sound/mixxx/files/mixxx-1.10.0-docs.patch
new file mode 100644
index 000000000000..c9205179881c
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.10.0-docs.patch
@@ -0,0 +1,10 @@
+--- mixxx-1.10.0/src/SConscript
++++ mixxx-1.10.0/src/SConscript
+@@ -219,7 +218,6 @@
+ env.Alias('install', keyboardmappings)
+ if int(flags['ladspa']):
+ env.Alias('install', ladspapresets)
+- env.Alias('install', docs)
+ env.Alias('install', dotdesktop)
+ env.Alias('install', icon)
+ env.Alias('install', promotracks)
diff --git a/media-sound/mixxx/files/mixxx-1.10.0-no-bzr.patch b/media-sound/mixxx/files/mixxx-1.10.0-no-bzr.patch
new file mode 100644
index 000000000000..40f32266bb5e
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.10.0-no-bzr.patch
@@ -0,0 +1,37 @@
+--- mixxx-1.10.0/src/SConscript.env
++++ mixxx-1.10.0/src/SConscript.env
+@@ -19,21 +19,6 @@
+ print "Deleting deprecated build file: %s" % defs
+ os.remove(defs)
+
+-#env.Append(CPPDEFINES=[('BUILD_REV', '"%s"' % getBZRRevision())]) #doing this forces a rebuild of everything whenever a commit happens -- not much fun
+-## instead, embed BZR version into build
+-## Put version info into a file, so it doesn't force a rebuild of everything :)
+-f = open("build.h","w")
+-try:
+- branch_name = util.get_bzr_branch_name()
+- modified = util.get_bzr_modified() > 0
+- # Do not emit BUILD_BRANCH on release branches.
+- if not branch_name.startswith('release'):
+- f.write('#define BUILD_BRANCH "%s"\n' % branch_name)
+- f.write('#define BUILD_REV "%s%s"\n' % (util.get_bzr_revision(),
+- '+' if modified else ''))
+-finally:
+- f.close()
+-
+ #Check for dependencies if we're not doing a clean...
+ #if not env.GetOption('clean') and not SCons.Util.containsAny(os.sys.argv, ['-h', '--help']):
+ conf = Configure(env, custom_tests = { 'CheckForPKGConfig' : util.CheckForPKGConfig,
+--- mixxx-1.10.0/src/SConscript
++++ mixxx-1.10.0/src/SConscript
+@@ -12,8 +12,8 @@
+ from build import util
+
+ mixxx_version = util.get_mixxx_version()
+-branch_name = util.get_bzr_branch_name()
+-bazaar_revision = util.get_bzr_revision()
++#branch_name = util.get_bzr_branch_name()
++#bazaar_revision = util.get_bzr_revision()
+ print "WE ARE IN:", os.getcwd()
+
+ plugins = []
diff --git a/media-sound/mixxx/files/mixxx-1.10.0-system-libs.patch b/media-sound/mixxx/files/mixxx-1.10.0-system-libs.patch
new file mode 100644
index 000000000000..d2e21f3e005b
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.10.0-system-libs.patch
@@ -0,0 +1,172 @@
+--- mixxx-1.10.0/build/depends.py
++++ mixxx-1.10.0/build/depends.py
+@@ -21,7 +21,7 @@
+
+ def configure(self, build, conf):
+ #Check for PortTime
+- if not conf.CheckLib(['porttime', 'libporttime']) and \
++ if not conf.CheckLib(['porttime', 'libportmidi']) and \
+ not conf.CheckHeader(['porttime.h']):
+ raise Exception("Did not find PortTime or its development headers.")
+ if not conf.CheckLib(['portmidi', 'libportmidi']) and \
+@@ -189,25 +189,10 @@
+
+ class FidLib(Dependence):
+
+- def sources(self, build):
+- symbol = None
+- if build.platform_is_windows:
+- if build.toolchain_is_msvs:
+- symbol = 'T_MSVC'
+- elif build.crosscompile:
+- # Not sure why, but fidlib won't build with mingw32msvc and
+- # T_MINGW
+- symbol = 'T_LINUX'
+- elif build.toolchain_is_gnu:
+- symbol = 'T_MINGW'
+- else:
+- symbol = 'T_LINUX'
+-
+- return [build.env.StaticObject('#lib/fidlib-0.9.9/fidlib.c',
+- CPPDEFINES=symbol)]
+-
+ def configure(self, build, conf):
+- build.env.Append(CPPPATH='#lib/fidlib-0.9.9/')
++ if not conf.CheckLib('fidlib'):
++ raise Exception('Did not find fidlib library, exiting!')
++ build.env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/fidlib'])
+
+ class KissFFT(Dependence):
+
+@@ -226,68 +211,15 @@
+ build.env.Append(CPPPATH="#lib/replaygain")
+
+ class SoundTouch(Dependence):
+- SOUNDTOUCH_PATH = 'soundtouch-1.5.0'
+
+ def sources(self, build):
+- sources = ['engine/enginebufferscalest.cpp',
+- '#lib/%s/SoundTouch.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/TDStretch.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/RateTransposer.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/AAFilter.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/FIFOSampleBuffer.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/FIRFilter.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/PeakFinder.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/BPMDetect.cpp' % self.SOUNDTOUCH_PATH]
+- if build.platform_is_windows and build.toolchain_is_msvs:
+- if build.machine_is_64bit:
+- sources.append(
+- '#lib/%s/cpu_detect_x64_win.cpp' % self.SOUNDTOUCH_PATH)
+- elif build.machine == 'x86':
+- sources.append(
+- '#lib/%s/cpu_detect_x86_win.cpp' % self.SOUNDTOUCH_PATH)
+- else:
+- raise Exception("Unhandled CPU configuration for SoundTouch")
+- elif build.toolchain_is_gnu:
+- if build.machine == 'x86_64':
+- sources.append(
+- '#lib/%s/cpu_detect_x64_gcc.cpp' % self.SOUNDTOUCH_PATH)
+- else:
+- sources.append(
+- '#lib/%s/cpu_detect_x86_gcc.cpp' % self.SOUNDTOUCH_PATH)
+- else:
+- raise Exception("Unhandled CPU configuration for SoundTouch")
+-
+- # TODO(XXX) when we figure out a better way to represent features, fix
+- # this.
+- optimize = int(util.get_flags(build.env, 'optimize', 1))
+- if build.machine_is_64bit or \
+- (build.toolchain_is_msvs and optimize > 1) or \
+- (build.toolchain_is_gnu and optimize > 2):
+- sources.extend(
+- ['#lib/%s/mmx_optimized.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/sse_optimized.cpp' % self.SOUNDTOUCH_PATH,
+- ])
+- if build.toolchain_is_msvs and not build.machine_is_64bit:
+- sources.append('#lib/%s/3dnow_win.cpp' % self.SOUNDTOUCH_PATH)
+- else:
+- # TODO(XXX) the docs refer to a 3dnow_gcc, but we don't seem to have
+- # it.
+- pass
+-
+- return sources
++ return ['engine/enginebufferscalest.cpp']
+
+ def configure(self, build, conf):
+- if build.platform_is_windows:
+- build.env.Append(CPPDEFINES = 'WIN%s' % build.bitwidth)
+- build.env.Append(CPPPATH=['#lib/%s' % self.SOUNDTOUCH_PATH])
+-
+- # TODO(XXX) when we figure out a better way to represent features, fix
+- # this.
+- optimize = int(util.get_flags(build.env, 'optimize', 1))
+- if build.machine_is_64bit or \
+- (build.toolchain_is_msvs and optimize > 1) or \
+- (build.toolchain_is_gnu and optimize > 2):
+- build.env.Append(CPPDEFINES='ALLOW_X86_OPTIMIZATIONS')
++ if not conf.CheckLib(['SoundTouch','libSoundTouch']):
++ raise Exception('Did not find SoundTouch library, exiting!')
++ build.env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/soundtouch'])
++ build.env.Append(LIBS='SoundTouch')
+
+ class TagLib(Dependence):
+ def configure(self, build, conf):
+--- mixxx-1.10.0/build/features.py
++++ mixxx-1.10.0/build/features.py
+@@ -665,25 +659,15 @@
+ test_env.Append(CCFLAGS = '-pthread')
+ test_env.Append(LINKFLAGS = '-pthread')
+
+- test_env.Append(CPPPATH="#lib/gtest-1.5.0/include")
+- gtest_dir = test_env.Dir("#lib/gtest-1.5.0")
+- #gtest_dir.addRepository(build.env.Dir('#lib/gtest-1.5.0'))
+- #build.env['EXE_OUTPUT'] = '#/lib/gtest-1.3.0/bin' # example, optional
+- test_env['LIB_OUTPUT'] = '#/lib/gtest-1.5.0/lib'
+-
+- env = test_env
+- SCons.Export('env')
+- env.SConscript(env.File('SConscript', gtest_dir))
+-
+- # build and configure gmock
+- test_env.Append(CPPPATH="#lib/gmock-1.5.0/include")
+- gmock_dir = test_env.Dir("#lib/gmock-1.5.0")
+- #gmock_dir.addRepository(build.env.Dir('#lib/gmock-1.5.0'))
+- test_env['LIB_OUTPUT'] = '#/lib/gmock-1.5.0/lib'
+-
+- env.SConscript(env.File('SConscript', gmock_dir))
+-
+- return []
++ if not conf.CheckLib('gtest'):
++ raise Exception('Did not find gtest library, exiting!')
++ test_env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/gtest'])
++ test_env.Append(LIBS='gtest')
++
++ if not conf.CheckLib('gmock'):
++ raise Exception('Did not find gmock library, exiting!')
++ test_env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/gmock'])
++ test_env.Append(LIBS='gmock')
+
+ class Shoutcast(Feature):
+ def description(self):
+--- mixxx-1.10.0/src/engine/enginefilterbutterworth8.cpp
++++ mixxx-1.10.0/src/engine/enginefilterbutterworth8.cpp
+@@ -20,7 +20,6 @@
+ #include "engine/enginefilterbutterworth8.h"
+ #include "engine/enginefilter.h"
+ #include "engine/engineobject.h"
+-#include "../lib/fidlib-0.9.9/fidlib.h"
+
+ /* Local Prototypes */
+ inline double _processLowpass(double *coef, double *buf, register double val);
+--- mixxx-1.10.0/src/engine/enginefilter.h
++++ mixxx-1.10.0/src/engine/enginefilter.h
+@@ -20,7 +20,7 @@
+
+ #define MIXXX
+ #include "engine/engineobject.h"
+-#include "../lib/fidlib-0.9.9/fidlib.h"
++#include "fidlib.h"
+ #include "defs.h"
+
+ enum filterType{
diff --git a/media-sound/mixxx/files/mixxx-1.11.0-no-bzr.patch b/media-sound/mixxx/files/mixxx-1.11.0-no-bzr.patch
new file mode 100644
index 000000000000..b89d7f92f76e
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.11.0-no-bzr.patch
@@ -0,0 +1,35 @@
+--- mixxx-1.11.0/src/SConscript
++++ mixxx-1.11.0/src/SConscript
+@@ -12,8 +12,8 @@
+ from build import util, depends
+
+ mixxx_version = util.get_mixxx_version()
+-branch_name = util.get_bzr_branch_name()
+-bazaar_revision = util.get_bzr_revision()
++#branch_name = util.get_bzr_branch_name()
++#bazaar_revision = util.get_bzr_revision()
+ print "WE ARE IN:", os.getcwd()
+
+ plugins = []
+--- mixxx-1.11.0/src/SConscript.env
++++ mixxx-1.11.0/src/SConscript.env
+@@ -20,19 +20,6 @@
+ print "Deleting deprecated build file: %s" % defs
+ os.remove(defs)
+
+-#env.Append(CPPDEFINES=[('BUILD_REV', '"%s"' % getBZRRevision())]) #doing this forces a rebuild of everything whenever a commit happens -- not much fun
+-## instead, embed BZR version into build
+-## Put version info into a file, so it doesn't force a rebuild of everything :)
+-
+-if os.path.exists(os.path.join('..', 'build.h')):
+- # If a build.h exists in the project root mixxx/ directory then use that
+- # instead of writing our own. This is mostly since when we build Debian
+- # packages we don't have any of the Bazaar metadata so we can't write one
+- # ourselves.
+- shutil.copy(os.path.join('..', 'build.h'), 'build.h')
+-else:
+- util.write_build_header('build.h')
+-
+
+ #Check for dependencies if we're not doing a clean...
+ #if not env.GetOption('clean') and not SCons.Util.containsAny(os.sys.argv, ['-h', '--help']):
diff --git a/media-sound/mixxx/files/mixxx-1.11.0-system-libs.patch b/media-sound/mixxx/files/mixxx-1.11.0-system-libs.patch
new file mode 100644
index 000000000000..2f6b62c3440a
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-1.11.0-system-libs.patch
@@ -0,0 +1,223 @@
+--- mixxx-1.11.0/build/depends.py
++++ mixxx-1.11.0/build/depends.py
+@@ -179,8 +179,8 @@
+ # times.
+
+ qt_modules = [
+- 'QtCore', 'QtGui', 'QtOpenGL', 'QtXml', 'QtSvg',
+- 'QtSql', 'QtScript', 'QtXmlPatterns', 'QtNetwork'
++ 'QtCore', 'QtGui', 'QtOpenGL', 'QtXml',
++ 'QtSql', 'QtScript', 'QtNetwork'
+ #'QtUiTools', #'QtDesigner',
+ ]
+
+@@ -298,25 +298,10 @@
+
+ class FidLib(Dependence):
+
+- def sources(self, build):
+- symbol = None
+- if build.platform_is_windows:
+- if build.toolchain_is_msvs:
+- symbol = 'T_MSVC'
+- elif build.crosscompile:
+- # Not sure why, but fidlib won't build with mingw32msvc and
+- # T_MINGW
+- symbol = 'T_LINUX'
+- elif build.toolchain_is_gnu:
+- symbol = 'T_MINGW'
+- else:
+- symbol = 'T_LINUX'
+-
+- return [build.env.StaticObject('#lib/fidlib-0.9.10/fidlib.c',
+- CPPDEFINES=symbol)]
+-
+ def configure(self, build, conf):
+- build.env.Append(CPPPATH='#lib/fidlib-0.9.10/')
++ if not conf.CheckLib('fidlib'):
++ raise Exception('Did not find fidlib library, exiting!')
++ build.env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/fidlib'])
+
+ class ReplayGain(Dependence):
+
+@@ -327,7 +312,6 @@
+ build.env.Append(CPPPATH="#lib/replaygain")
+
+ class SoundTouch(Dependence):
+- SOUNDTOUCH_PATH = 'soundtouch-1.6.0'
+
+ def sse_enabled(self, build):
+ optimize = int(util.get_flags(build.env, 'optimize', 1))
+@@ -336,30 +320,7 @@
+ (build.toolchain_is_gnu and optimize > 1))
+
+ def sources(self, build):
+- sources = ['engine/enginebufferscalest.cpp',
+- '#lib/%s/SoundTouch.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/TDStretch.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/RateTransposer.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/AAFilter.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/FIFOSampleBuffer.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/FIRFilter.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/PeakFinder.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/BPMDetect.cpp' % self.SOUNDTOUCH_PATH]
+-
+- # SoundTouch CPU optimizations are only for x86
+- # architectures. SoundTouch automatically ignores these files when it is
+- # not being built for an architecture that supports them.
+- cpu_detection = '#lib/%s/cpu_detect_x86_win.cpp' if build.toolchain_is_msvs else \
+- '#lib/%s/cpu_detect_x86_gcc.cpp'
+- sources.append(cpu_detection % self.SOUNDTOUCH_PATH)
+-
+- # Check if the compiler has SSE extention enabled
+- # Allways the case on x64 (core instructions)
+- if self.sse_enabled(build):
+- sources.extend(
+- ['#lib/%s/mmx_optimized.cpp' % self.SOUNDTOUCH_PATH,
+- '#lib/%s/sse_optimized.cpp' % self.SOUNDTOUCH_PATH,])
+- return sources
++ return ['engine/enginebufferscalest.cpp']
+
+ def configure(self, build, conf, env=None):
+ if env is None:
+@@ -367,13 +328,10 @@
+ if build.platform_is_windows:
+ # Regardless of the bitwidth, ST checks for WIN32
+ env.Append(CPPDEFINES = 'WIN32')
+- env.Append(CPPPATH=['#lib/%s' % self.SOUNDTOUCH_PATH])
+-
+- # Check if the compiler has SSE extention enabled
+- # Allways the case on x64 (core instructions)
+- optimize = int(util.get_flags(env, 'optimize', 1))
+- if self.sse_enabled(build):
+- env.Append(CPPDEFINES='SOUNDTOUCH_ALLOW_X86_OPTIMIZATIONS')
++ if not conf.CheckLib(['SoundTouch','libSoundTouch']):
++ raise Exception('Did not find SoundTouch library, exiting!')
++ build.env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/soundtouch'])
++ build.env.Append(LIBS='SoundTouch')
+
+ class TagLib(Dependence):
+ def configure(self, build, conf):
+--- mixxx-1.11.0/build/features.py
++++ mixxx-1.11.0/build/features.py
+@@ -48,7 +48,6 @@
+ 'controllers/midi/hss1394enumerator.cpp']
+
+ class HID(Feature):
+- HIDAPI_INTERNAL_PATH = '#lib/hidapi-0.8.0-pre'
+ def description(self):
+ return "HID controller support"
+
+@@ -64,9 +63,6 @@
+ def configure(self, build, conf):
+ if not self.enabled(build):
+ return
+- # TODO(XXX) allow external hidapi install, but for now we just use our
+- # internal one.
+- build.env.Append(CPPPATH=[os.path.join(self.HIDAPI_INTERNAL_PATH, 'hidapi')])
+
+ if build.platform_is_linux:
+ build.env.ParseConfig('pkg-config libusb-1.0 --silence-errors --cflags --libs')
+@@ -86,19 +82,17 @@
+
+ build.env.Append(CPPDEFINES = '__HID__')
+
++ if not conf.CheckLib('hidapi-libusb'):
++ raise Exception('Did not find HID API library, exiting!')
++ build.env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/hidapi'])
++ build.env.Append(LIBS='hidapi-libusb')
++
++
+ def sources(self, build):
+ sources = ['controllers/hid/hidcontroller.cpp',
+ 'controllers/hid/hidenumerator.cpp',
+ 'controllers/hid/hidcontrollerpresetfilehandler.cpp']
+
+- if build.platform_is_windows:
+- # Requires setupapi.lib which is included by the above check for
+- # setupapi.
+- sources.append(os.path.join(self.HIDAPI_INTERNAL_PATH, "windows/hid.c"))
+- elif build.platform_is_linux:
+- sources.append(os.path.join(self.HIDAPI_INTERNAL_PATH, 'linux/hid-libusb.c'))
+- elif build.platform_is_osx:
+- sources.append(os.path.join(self.HIDAPI_INTERNAL_PATH, 'mac/hid.c'))
+ return sources
+
+ class Bulk(Feature):
+@@ -455,19 +449,6 @@
+
+ build.env.Append(CPPDEFINES = '__VAMP__')
+
+- # Needed on Linux at least. Maybe needed elsewhere?
+- if build.platform_is_linux:
+- # Optionally link libdl and libX11. Required for some distros.
+- conf.CheckLib(['dl', 'libdl'])
+- conf.CheckLib(['X11', 'libX11'])
+-
+- # FFTW3 support
+- have_fftw3_h = conf.CheckHeader('fftw3.h')
+- have_fftw3 = conf.CheckLib('fftw3', autoadd=False)
+- if(have_fftw3_h and have_fftw3 and build.platform_is_linux):
+- build.env.Append(CPPDEFINES = 'HAVE_FFTW3')
+- build.env.ParseConfig('pkg-config fftw3 --silence-errors --cflags --libs')
+-
+ def sources(self, build):
+ sources = ['vamp/vampanalyser.cpp',
+ 'vamp/vamppluginloader.cpp',
+@@ -725,25 +706,15 @@
+ test_env.Append(CCFLAGS = '-pthread')
+ test_env.Append(LINKFLAGS = '-pthread')
+
+- test_env.Append(CPPPATH="#lib/gtest-1.5.0/include")
+- gtest_dir = test_env.Dir("#lib/gtest-1.5.0")
+- #gtest_dir.addRepository(build.env.Dir('#lib/gtest-1.5.0'))
+- #build.env['EXE_OUTPUT'] = '#/lib/gtest-1.3.0/bin' # example, optional
+- test_env['LIB_OUTPUT'] = '#/lib/gtest-1.5.0/lib'
+-
+- env = test_env
+- SCons.Export('env')
+- env.SConscript(env.File('SConscript', gtest_dir))
+-
+- # build and configure gmock
+- test_env.Append(CPPPATH="#lib/gmock-1.5.0/include")
+- gmock_dir = test_env.Dir("#lib/gmock-1.5.0")
+- #gmock_dir.addRepository(build.env.Dir('#lib/gmock-1.5.0'))
+- test_env['LIB_OUTPUT'] = '#/lib/gmock-1.5.0/lib'
+-
+- env.SConscript(env.File('SConscript', gmock_dir))
+-
+- return []
++ if not conf.CheckLib('gtest'):
++ raise Exception('Did not find gtest library, exiting!')
++ test_env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/gtest'])
++ test_env.Append(LIBS='gtest')
++
++ if not conf.CheckLib('gmock'):
++ raise Exception('Did not find gmock library, exiting!')
++ test_env.Append(CPPPATH=[SCons.ARGUMENTS.get('prefix') + '/include/gmock'])
++ test_env.Append(LIBS='gmock')
+
+ class Shoutcast(Feature):
+ def description(self):
+--- mixxx-1.11.0/src/engine/enginefilterbutterworth8.cpp
++++ mixxx-1.11.0/src/engine/enginefilterbutterworth8.cpp
+@@ -20,7 +20,7 @@
+ #include "engine/enginefilterbutterworth8.h"
+ #include "engine/enginefilter.h"
+ #include "engine/engineobject.h"
+-#include "../lib/fidlib-0.9.10/fidlib.h"
++#include <fidlib.h>
+
+ /* Local Prototypes */
+ inline double _processLowpass(double *coef, double *buf, register double val);
+--- mixxx-1.11.0/src/engine/enginefilter.h
++++ mixxx-1.11.0/src/engine/enginefilter.h
+@@ -20,7 +20,7 @@
+
+ #define MIXXX
+ #include "engine/engineobject.h"
+-#include "../lib/fidlib-0.9.10/fidlib.h"
++#include <fidlib.h>
+ #include "defs.h"
+
+ enum filterType{
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-chromaprint-1.4.patch b/media-sound/mixxx/files/mixxx-2.0.0-chromaprint-1.4.patch
new file mode 100644
index 000000000000..77827f3d8d81
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-chromaprint-1.4.patch
@@ -0,0 +1,40 @@
+Backported chromaprint-1.4 API changes based on the fix suggested in:
+https://github.com/mixxxdj/mixxx/pull/1073
+
+and the work done by Charlie Gehlin in:
+https://bugs.gentoo.org/604528
+
+--- mixxx-2.0.0/src/musicbrainz/chromaprinter.cpp
++++ mixxx-2.0.0/src/musicbrainz/chromaprinter.cpp
+@@ -25,6 +25,16 @@
+
+ QString ChromaPrinter::calcFingerPrint(const Mixxx::SoundSourcePointer& pSoundSource) {
+
++ // Type declarations of *fprint and *encoded pointers need to account for Chromaprint API version
++ // (void* -> uint32_t*) and (void* -> char*) changed in versions v1.4.0 or later -- alyptik 12/2016
++ #if (CHROMAPRINT_VERSION_MINOR > 3) || (CHROMAPRINT_VERSION_MAJOR > 1)
++ typedef uint32_t* uint32_p;
++ typedef char* char_p;
++ #else
++ typedef void* uint32_p;
++ typedef void* char_p;
++ #endif
++
+ // this is worth 2min of audio, multiply by 2 because we have 2 channels
+ // AcoustID only stores a fingerprint for the first two minutes of a song
+ // on their server so we need only a fingerprint of the first two minutes
+@@ -57,12 +67,12 @@
+ }
+ chromaprint_finish(ctx);
+
+- void* fprint = NULL;
++ uint32_p fprint = NULL;
+ int size = 0;
+ int ret = chromaprint_get_raw_fingerprint(ctx, &fprint, &size);
+ QByteArray fingerprint;
+ if (ret == 1) {
+- void* encoded = NULL;
++ char_p encoded = NULL;
+ int encoded_size = 0;
+ chromaprint_encode_fingerprint(fprint, size,
+ CHROMAPRINT_ALGORITHM_DEFAULT,
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-docs.patch b/media-sound/mixxx/files/mixxx-2.0.0-docs.patch
new file mode 100644
index 000000000000..702ce6cd8df5
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-docs.patch
@@ -0,0 +1,10 @@
+--- mixxx-9999/src/SConscript
++++ mixxx-9999/src/SConscript
+@@ -290,7 +290,6 @@
+ env.Alias('install', controllermappings)
+ env.Alias('install', translations)
+ env.Alias('install', keyboardmappings)
+- env.Alias('install', docs)
+ env.Alias('install', dotdesktop)
+ env.Alias('install', icon)
+ env.Alias('install', promotracks)
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-eliminate-unnecessary-heap-allocation-of-qtime.patch b/media-sound/mixxx/files/mixxx-2.0.0-eliminate-unnecessary-heap-allocation-of-qtime.patch
new file mode 100644
index 000000000000..04538a01e15a
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-eliminate-unnecessary-heap-allocation-of-qtime.patch
@@ -0,0 +1,55 @@
+diff -dNur a/src/analyserwaveform.cpp b/src/analyserwaveform.cpp
+--- a/src/analyserwaveform.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/analyserwaveform.cpp 2017-02-04 21:12:30.127952910 +0100
+@@ -1,6 +1,3 @@
+-#include <QImage>
+-#include <QtDebug>
+-#include <QTime>
+ #include <QtDebug>
+
+ #include "analyserwaveform.h"
+@@ -40,7 +37,6 @@
+ }
+ }
+
+- m_timer = new QTime();
+ m_analysisDao = new AnalysisDao(m_database, pConfig);
+ }
+
+@@ -48,14 +44,13 @@
+ qDebug() << "AnalyserWaveform::~AnalyserWaveform()";
+ destroyFilters();
+ m_database.close();
+- delete m_timer;
+ delete m_analysisDao;
+ }
+
+ bool AnalyserWaveform::initialise(TrackPointer tio, int sampleRate, int totalSamples) {
+ m_skipProcessing = false;
+
+- m_timer->start();
++ m_timer.start();
+
+ if (totalSamples == 0) {
+ qWarning() << "AnalyserWaveform::initialise - no waveform/waveform summary";
+@@ -320,7 +315,7 @@
+ #endif
+
+ qDebug() << "Waveform generation for track" << tio->getId() << "done"
+- << m_timer->elapsed()/1000.0 << "s";
++ << m_timer.elapsed()/1000.0 << "s";
+ }
+
+ void AnalyserWaveform::storeIfGreater(float* pDest, float source) {
+diff -dNur a/src/analyserwaveform.h b/src/analyserwaveform.h
+--- a/src/analyserwaveform.h 2015-12-29 17:10:41.000000000 +0100
++++ b/src/analyserwaveform.h 2017-02-04 21:12:45.367713395 +0100
+@@ -171,7 +171,7 @@
+ EngineFilterIIRBase* m_filter[FilterCount];
+ std::vector<float> m_buffers[FilterCount];
+
+- QTime* m_timer;
++ QTime m_timer;
+ QSqlDatabase m_database;
+ AnalysisDao* m_analysisDao;
+
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations.patch b/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations.patch
new file mode 100644
index 000000000000..654c01f53b9d
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations.patch
@@ -0,0 +1,24 @@
+From 76c53b0f0a2be7b5cf85fa523f3521a5725affb2 Mon Sep 17 00:00:00 2001
+From: Uwe Klotz <uwe_klotz@web.de>
+Date: Fri, 8 Jan 2016 18:22:33 +0100
+Subject: [PATCH] Fix formatting of time durations
+
+---
+ src/util/time.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/util/time.h b/src/util/time.h
+index 29187ad..7b38eb4 100644
+--- a/src/util/time.h
++++ b/src/util/time.h
+@@ -75,7 +75,9 @@ class Time {
+ const int days = static_cast<int>(dSeconds) / kSecondsPerDay;
+ dSeconds -= days * kSecondsPerDay;
+
+- QTime t = QTime().addMSecs(dSeconds * kMillisPerSecond);
++ // NOTE(uklotzde): Time() constructs a 'null' object, but
++ // we need 'zero' here.
++ QTime t = QTime(0, 0).addMSecs(dSeconds * kMillisPerSecond);
+
+ QString formatString =
+ (days > 0 ? (QString::number(days) %
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations2.patch b/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations2.patch
new file mode 100644
index 000000000000..f8c041e4043e
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-fix-formatting-of-time-durations2.patch
@@ -0,0 +1,139 @@
+diff -dNur a/src/library/basesqltablemodel.cpp b/src/library/basesqltablemodel.cpp
+--- a/src/library/basesqltablemodel.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/library/basesqltablemodel.cpp 2017-02-04 21:33:39.403861857 +0100
+@@ -559,7 +559,7 @@
+ if (column == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_DURATION)) {
+ int duration = value.toInt();
+ if (duration > 0) {
+- value = Time::formatSeconds(duration, false);
++ value = Time::formatSeconds(duration);
+ } else {
+ value = QString();
+ }
+diff -dNur a/src/library/browse/browsethread.cpp b/src/library/browse/browsethread.cpp
+--- a/src/library/browse/browsethread.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/library/browse/browsethread.cpp 2017-02-04 21:32:23.605066421 +0100
+@@ -185,8 +185,7 @@
+ item->setData(item->text(), Qt::UserRole);
+ row_data.insert(COLUMN_COMMENT, item);
+
+- QString duration = Time::formatSeconds(qVariantValue<int>(
+- tio.getDuration()), false);
++ QString duration = Time::formatSeconds(tio.getDuration());
+ item = new QStandardItem(duration);
+ item->setToolTip(item->text());
+ item->setData(item->text(), Qt::UserRole);
+diff -dNur a/src/library/cratefeature.cpp b/src/library/cratefeature.cpp
+--- a/src/library/cratefeature.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/library/cratefeature.cpp 2017-02-04 21:30:54.962474898 +0100
+@@ -493,7 +493,7 @@
+ crateListTableModel.index(row, durationColumn)).toInt();
+ m_crateList.append(qMakePair(id, QString("%1 (%2) %3")
+ .arg(name, QString::number(count),
+- Time::formatSeconds(duration, false))));
++ Time::formatSeconds(duration))));
+ }
+ }
+
+diff -dNur a/src/library/playlistfeature.cpp b/src/library/playlistfeature.cpp
+--- a/src/library/playlistfeature.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/library/playlistfeature.cpp 2017-02-04 21:33:06.920378091 +0100
+@@ -168,7 +168,7 @@
+ playlistTableModel.index(row, durationColumn)).toInt();
+ m_playlistList.append(qMakePair(id, QString("%1 (%2) %3")
+ .arg(name, QString::number(count),
+- Time::formatSeconds(duration, false))));
++ Time::formatSeconds(duration))));
+ }
+ }
+
+diff -dNur a/src/trackinfoobject.cpp b/src/trackinfoobject.cpp
+--- a/src/trackinfoobject.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/trackinfoobject.cpp 2017-02-04 21:42:36.423323807 +0100
+@@ -293,7 +293,7 @@
+ int iDuration = m_iDuration;
+ lock.unlock();
+
+- return Time::formatSeconds(iDuration, false);
++ return Time::formatSeconds(iDuration);
+ }
+
+ void TrackInfoObject::setLocation(const QString& location) {
+diff -dNur a/src/util/time.cpp b/src/util/time.cpp
+--- a/src/util/time.cpp 2017-02-04 21:29:44.439595305 +0100
++++ b/src/util/time.cpp 2017-02-04 21:37:54.739803100 +0100
+@@ -1,5 +1,7 @@
+ #include "util/time.h"
+
++#include "util/assert.h"
++
+ // static
+ LLTIMER Time::s_timer;
+ // static
+@@ -8,7 +10,7 @@
+ qint64 Time::s_testElapsed_nsecs = 0;
+
+ // static
+-QString Time::formatSeconds(double dSeconds, bool showCentis) {
++QString Time::formatSeconds(double dSeconds, Precision precision) {
+ if (dSeconds < 0) {
+ return "?";
+ }
+@@ -24,13 +26,14 @@
+ (days > 0 ? (QString::number(days) %
+ QLatin1String("'d', ")) : QString()) %
+ QLatin1String(days > 0 || t.hour() > 0 ? "hh:mm:ss" : "mm:ss") %
+- QLatin1String(showCentis ? ".zzz" : "");
++ QLatin1String(Precision::SECONDS == precision ? "" : ".zzz");
+
+ QString timeString = t.toString(formatString);
+
+ // The format string gives us milliseconds but we want
+ // centiseconds. Slice one character off.
+- if (showCentis) {
++ if (Precision::CENTISECONDS == precision) {
++ DEBUG_ASSERT(1 <= timeString.length());
+ timeString = timeString.left(timeString.length() - 1);
+ }
+
+diff -dNur a/src/util/time.h b/src/util/time.h
+--- a/src/util/time.h 2017-02-04 21:29:44.439595305 +0100
++++ b/src/util/time.h 2017-02-04 21:41:01.476833822 +0100
+@@ -55,10 +55,17 @@
+ s_testElapsed_nsecs = elapsed * 1000000;
+ }
+
+- // The standard way of formatting a time in seconds. Used for display of
+- // track duration, etc. showCentis indicates whether to include
+- // centisecond-precision or to round to the nearest second.
+- static QString formatSeconds(double dSeconds, bool showCentis);
++ enum class Precision {
++ SECONDS,
++ CENTISECONDS,
++ MILLISECONDS
++ };
++
++ // The standard way of formatting a time in seconds. Used for display
++ // of track duration, etc.
++ static QString formatSeconds(
++ double dSeconds,
++ Precision precision = Time::Precision::SECONDS);
+
+ private:
+ static LLTIMER s_timer;
+diff -dNur a/src/widget/wnumberpos.cpp b/src/widget/wnumberpos.cpp
+--- a/src/widget/wnumberpos.cpp 2015-12-29 17:10:41.000000000 +0100
++++ b/src/widget/wnumberpos.cpp 2017-02-04 21:41:57.023950430 +0100
+@@ -92,10 +92,10 @@
+ QString valueString;
+ if (valueMillis >= 0) {
+ valueString = m_skinText % Time::formatSeconds(
+- valueMillis / Time::kMillisPerSecond, true);
++ valueMillis / Time::kMillisPerSecond, Time::Precision::MILLISECONDS);
+ } else {
+ valueString = m_skinText % QLatin1String("-") % Time::formatSeconds(
+- -valueMillis / Time::kMillisPerSecond, true);
++ -valueMillis / Time::kMillisPerSecond, Time::Precision::CENTISECONDS);
+ }
+ setText(valueString);
+ }
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-fix-missing-pointer-initialization.patch b/media-sound/mixxx/files/mixxx-2.0.0-fix-missing-pointer-initialization.patch
new file mode 100644
index 000000000000..3364995ce4f5
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-fix-missing-pointer-initialization.patch
@@ -0,0 +1,271 @@
+diff -dNur a/src/analyserwaveform.cpp b/src/analyserwaveform.cpp
+--- a/src/analyserwaveform.cpp 2017-02-04 21:14:33.266016824 +0100
++++ b/src/analyserwaveform.cpp 2017-02-04 21:19:09.205671982 +0100
+@@ -11,8 +11,8 @@
+
+ AnalyserWaveform::AnalyserWaveform(ConfigObject<ConfigValue>* pConfig) :
+ m_skipProcessing(false),
+- m_waveformData(NULL),
+- m_waveformSummaryData(NULL),
++ m_waveformData(nullptr),
++ m_waveformSummaryData(nullptr),
+ m_stride(0, 0),
+ m_currentStride(0),
+ m_currentSummaryStride(0) {
+@@ -37,14 +37,13 @@
+ }
+ }
+
+- m_analysisDao = new AnalysisDao(m_database, pConfig);
++ m_pAnalysisDao = std::make_unique<AnalysisDao>(m_database, pConfig);
+ }
+
+ AnalyserWaveform::~AnalyserWaveform() {
+ qDebug() << "AnalyserWaveform::~AnalyserWaveform()";
+ destroyFilters();
+ m_database.close();
+- delete m_analysisDao;
+ }
+
+ bool AnalyserWaveform::initialise(TrackPointer tio, int sampleRate, int totalSamples) {
+@@ -115,7 +114,7 @@
+
+ if (trackId != -1 && (missingWaveform || missingWavesummary)) {
+ QList<AnalysisDao::AnalysisInfo> analyses =
+- m_analysisDao->getAnalysesForTrack(trackId);
++ m_pAnalysisDao->getAnalysesForTrack(trackId);
+
+ QListIterator<AnalysisDao::AnalysisInfo> it(analyses);
+ while (it.hasNext()) {
+@@ -130,7 +129,7 @@
+ missingWaveform = false;
+ } else if (vc != WaveformFactory::VC_KEEP) {
+ // remove all other Analysis except that one we should keep
+- m_analysisDao->deleteAnalysis(analysis.analysisId);
++ m_pAnalysisDao->deleteAnalysis(analysis.analysisId);
+ }
+ } if (analysis.type == AnalysisDao::TYPE_WAVESUMMARY) {
+ vc = WaveformFactory::waveformSummaryVersionToVersionClass(analysis.version);
+@@ -140,7 +139,7 @@
+ missingWavesummary = false;
+ } else if (vc != WaveformFactory::VC_KEEP) {
+ // remove all other Analysis except that one we should keep
+- m_analysisDao->deleteAnalysis(analysis.analysisId);
++ m_pAnalysisDao->deleteAnalysis(analysis.analysisId);
+ }
+ }
+ }
+@@ -273,13 +272,13 @@
+ tio->setWaveform(ConstWaveformPointer());
+ // Since clear() could delete the waveform, clear our pointer to the
+ // waveform's vector data first.
+- m_waveformData = NULL;
++ m_waveformData = nullptr;
+ m_waveform.clear();
+
+ tio->setWaveformSummary(ConstWaveformPointer());
+ // Since clear() could delete the waveform, clear our pointer to the
+ // waveform's vector data first.
+- m_waveformSummaryData = NULL;
++ m_waveformSummaryData = nullptr;
+ m_waveformSummary.clear();
+ }
+
+@@ -295,7 +294,7 @@
+ m_waveform->setDescription(WaveformFactory::currentWaveformDescription());
+ // Since clear() could delete the waveform, clear our pointer to the
+ // waveform's vector data first.
+- m_waveformData = NULL;
++ m_waveformData = nullptr;
+ m_waveform.clear();
+ }
+
+@@ -306,7 +305,7 @@
+ m_waveformSummary->setDescription(WaveformFactory::currentWaveformSummaryDescription());
+ // Since clear() could delete the waveform, clear our pointer to the
+ // waveform's vector data first.
+- m_waveformSummaryData = NULL;
++ m_waveformSummaryData = nullptr;
+ m_waveformSummary.clear();
+ }
+
+diff -dNur a/src/analyserwaveform.h b/src/analyserwaveform.h
+--- a/src/analyserwaveform.h 2017-02-04 21:14:33.266016824 +0100
++++ b/src/analyserwaveform.h 2017-02-04 21:20:17.308598419 +0100
+@@ -4,12 +4,14 @@
+ #include <QTime>
+ #include <QImage>
+ #include <QSqlDatabase>
++
+ #include <limits>
+
+ #include "configobject.h"
+ #include "analyser.h"
+ #include "waveform/waveform.h"
+ #include "util/math.h"
++#include "util/memory.h"
+
+ //NOTS vrince some test to segment sound, to apply color in the waveform
+ //#define TEST_HEAT_MAP
+@@ -173,7 +175,7 @@
+
+ QTime m_timer;
+ QSqlDatabase m_database;
+- AnalysisDao* m_analysisDao;
++ std::unique_ptr<AnalysisDao> m_pAnalysisDao;
+
+ #ifdef TEST_HEAT_MAP
+ QImage* test_heatMap;
+diff -dNur a/src/util/memory.h b/src/util/memory.h
+--- a/src/util/memory.h 1970-01-01 01:00:00.000000000 +0100
++++ b/src/util/memory.h 2017-02-04 22:19:41.846922929 +0100
+@@ -0,0 +1,149 @@
++// Taken from https://github.com/bstreiff/cppbits
++// Thank you Brandon Streiff!
++
++// Implementation of C++14's make_unique for C++11 compilers.
++//
++// This has been tested with:
++// - MSVC 11.0 (Visual Studio 2012)
++// - gcc 4.6.3
++// - Xcode 4.4 (with clang "4.0")
++//
++// It is based off an implementation proposed by Stephan T. Lavavej for
++// inclusion in the C++14 standard:
++// http://isocpp.org/files/papers/N3656.txt
++// Where appropriate, it borrows the use of MSVC's _VARIADIC_EXPAND_0X macro
++// machinery to compensate for lack of variadic templates.
++//
++// This file injects make_unique into the std namespace, which I acknowledge is
++// technically forbidden ([C++11: 17.6.4.2.2.1/1]), but is necessary in order
++// to have syntax compatibility with C++14.
++//
++// I perform compiler version checking for MSVC, gcc, and clang to ensure that
++// we don't add make_unique if it is already there (instead, we include
++// <memory> to get the compiler-provided one). You can override the compiler
++// version checking by defining the symbol COMPILER_SUPPORTS_MAKE_UNIQUE.
++//
++//
++// ===============================================================================
++// This file is released into the public domain. See LICENCE for more information.
++// ===============================================================================
++
++#ifndef MIXXX_UTIL_MEMORY_H
++#define MIXXX_UTIL_MEMORY_H
++
++// If user hasn't specified COMPILER_SUPPORTS_MAKE_UNIQUE then try to figure out
++// based on compiler version if std::make_unique is provided.
++#if !defined(COMPILER_SUPPORTS_MAKE_UNIQUE)
++ // Compiling with -std=c++11 sets __cplusplus=201103L and disables
++ // std::make_unique() from C++14! We need to take this into account.
++ #define CPLUSPLUS_SUPPORTS_MAKE_UNIQUE (__cplusplus > 201103L)
++ #if defined(_MSC_VER)
++ // std::make_unique was added in MSVC 12.0
++ #if _MSC_VER >= 1800 // MSVC 12.0 (Visual Studio 2013)
++ #define COMPILER_SUPPORTS_MAKE_UNIQUE
++ #endif
++ #elif defined(__clang__)
++ // std::make_unique was added in clang 3.4, but not until Xcode 6.
++ // Annoyingly, Apple makes the clang version defines match the version
++ // of Xcode, not the version of clang.
++ #define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
++ #if defined(__APPLE__) && CLANG_VERSION >= 60000 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE
++ #define COMPILER_SUPPORTS_MAKE_UNIQUE
++ #elif !defined(__APPLE__) && CLANG_VERSION >= 30400 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE
++ #define COMPILER_SUPPORTS_MAKE_UNIQUE
++ #endif
++ #elif defined(__GNUC__)
++ // std::make_unique was added in gcc 4.9
++ #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
++ #if GCC_VERSION >= 40900 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE
++ #define COMPILER_SUPPORTS_MAKE_UNIQUE
++ #endif
++ #endif
++#endif
++
++#if defined(COMPILER_SUPPORTS_MAKE_UNIQUE)
++
++// If the compiler supports std::make_unique, then pull in <memory> to get it.
++#include <memory>
++
++#else
++
++// Otherwise, the compiler doesn't provide it, so implement it ourselves.
++
++#include <cstddef>
++#include <memory>
++#include <type_traits>
++#include <utility>
++
++namespace std {
++
++template<class _Ty> struct _Unique_if {
++ typedef unique_ptr<_Ty> _Single_object;
++};
++
++template<class _Ty> struct _Unique_if<_Ty[]> {
++ typedef unique_ptr<_Ty[]> _Unknown_bound;
++};
++
++template<class _Ty, size_t N> struct _Unique_if<_Ty[N]> {
++ typedef void _Known_bound;
++};
++
++//
++// template< class T, class... Args >
++// unique_ptr<T> make_unique( Args&&... args);
++//
++
++#if defined(_MSC_VER) && (_MSC_VER < 1800)
++
++// Macro machinery because MSVC 11.0 doesn't support variadic templates.
++// The _VARIADIC_EXPAND_0X stuff is defined in <xstddef>
++#define _MAKE_UNIQUE( \
++ TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, X1, X2, X3, X4) \
++ template<class _Ty COMMA LIST(_CLASS_TYPE)> inline \
++ typename _Unique_if<_Ty>::_Single_object make_unique(LIST(_TYPE_REFREF_ARG)) \
++ { \
++ return unique_ptr<_Ty>(new _Ty(LIST(_FORWARD_ARG))); \
++ } \
++
++_VARIADIC_EXPAND_0X(_MAKE_UNIQUE, , , , )
++#undef _MAKE_UNIQUE
++
++#else // not MSVC 11.0 or earlier
++
++template<class _Ty, class... Args>
++ typename _Unique_if<_Ty>::_Single_object
++ make_unique(Args&&... args) {
++ return unique_ptr<_Ty>(new _Ty(std::forward<Args>(args)...));
++ }
++
++#endif
++
++// template< class T >
++// unique_ptr<T> make_unique( std::size_t size );
++
++template<class _Ty>
++ typename _Unique_if<_Ty>::_Unknown_bound
++ make_unique(size_t n) {
++ typedef typename remove_extent<_Ty>::type U;
++ return unique_ptr<_Ty>(new U[n]());
++ }
++
++// template< class T, class... Args >
++// /* unspecified */ make_unique( Args&&... args ) = delete;
++
++// MSVC 11.0 doesn't support deleted functions, so the best we can do
++// is simply not define the function.
++#if !(defined(_MSC_VER) && (_MSC_VER < 1800))
++
++template<class T, class... Args>
++ typename _Unique_if<T>::_Known_bound
++ make_unique(Args&&...) = delete;
++
++#endif
++
++} // namespace std
++
++#endif // !COMPILER_SUPPORTS_MAKE_UNIQUE
++
++#endif /* MIXXX_UTIL_MEMORY_H */
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-gcc62.patch b/media-sound/mixxx/files/mixxx-2.0.0-gcc62.patch
new file mode 100644
index 000000000000..c19c914b330e
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-gcc62.patch
@@ -0,0 +1,24 @@
+--- a/src/util/math.h 2015-12-29 17:10:41.000000000 +0100
++++ b/src/util/math.h 2016-09-25 12:54:18.345291146 +0200
+@@ -3,8 +3,20 @@
+
+ // Causes MSVC to define M_PI and friends.
+ // http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx
++// Our SConscript defines this but check anyway.
++#ifdef __WINDOWS__
++#ifndef _USE_MATH_DEFINES
+ #define _USE_MATH_DEFINES
+-#include <cmath>
++#endif
++#endif
++
++#include <math.h>
++#include <cmath>
++// Note: Because of our fpclassify hack, we actualy need to inlude both,
++// the c and the c++ version of the math header.
++// From GCC 6.1.1 math.h depends on cmath, which failes to compile if included
++// after our fpclassify hack
++
+ #include <algorithm>
+
+ #include "util/assert.h"
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-move-definition-of-time-formatseconds-into-dot-cpp-file.patch b/media-sound/mixxx/files/mixxx-2.0.0-move-definition-of-time-formatseconds-into-dot-cpp-file.patch
new file mode 100644
index 000000000000..9a95a5d675ec
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-move-definition-of-time-formatseconds-into-dot-cpp-file.patch
@@ -0,0 +1,88 @@
+From c2af9e6eeb469718b9aa069b90a719fac80dd0d9 Mon Sep 17 00:00:00 2001
+From: Uwe Klotz <uwe_klotz@web.de>
+Date: Fri, 8 Jan 2016 19:25:58 +0100
+Subject: [PATCH] Move definition of Time::formatSeconds() into .cpp file
+
+---
+ src/util/time.cpp | 30 ++++++++++++++++++++++++++++++
+ src/util/time.h | 29 +----------------------------
+ 2 files changed, 31 insertions(+), 28 deletions(-)
+
+diff --git a/src/util/time.cpp b/src/util/time.cpp
+index 998fa73..d8a122b 100644
+--- a/src/util/time.cpp
++++ b/src/util/time.cpp
+@@ -6,3 +6,33 @@ LLTIMER Time::s_timer;
+ bool Time::s_testMode = false;
+ // static
+ qint64 Time::s_testElapsed_nsecs = 0;
++
++// static
++QString Time::formatSeconds(double dSeconds, bool showCentis) {
++ if (dSeconds < 0) {
++ return "?";
++ }
++
++ const int days = static_cast<int>(dSeconds) / kSecondsPerDay;
++ dSeconds -= days * kSecondsPerDay;
++
++ // NOTE(uklotzde): Time() constructs a 'null' object, but
++ // we need 'zero' here.
++ QTime t = QTime(0, 0).addMSecs(dSeconds * kMillisPerSecond);
++
++ QString formatString =
++ (days > 0 ? (QString::number(days) %
++ QLatin1String("'d', ")) : QString()) %
++ QLatin1String(days > 0 || t.hour() > 0 ? "hh:mm:ss" : "mm:ss") %
++ QLatin1String(showCentis ? ".zzz" : "");
++
++ QString timeString = t.toString(formatString);
++
++ // The format string gives us milliseconds but we want
++ // centiseconds. Slice one character off.
++ if (showCentis) {
++ timeString = timeString.left(timeString.length() - 1);
++ }
++
++ return timeString;
++}
+diff --git a/src/util/time.h b/src/util/time.h
+index 7b38eb4..b4e2c2d 100644
+--- a/src/util/time.h
++++ b/src/util/time.h
+@@ -67,34 +67,7 @@ class Time {
+ // The standard way of formatting a time in seconds. Used for display of
+ // track duration, etc. showCentis indicates whether to include
+ // centisecond-precision or to round to the nearest second.
+- static QString formatSeconds(double dSeconds, bool showCentis) {
+- if (dSeconds < 0) {
+- return "?";
+- }
+-
+- const int days = static_cast<int>(dSeconds) / kSecondsPerDay;
+- dSeconds -= days * kSecondsPerDay;
+-
+- // NOTE(uklotzde): Time() constructs a 'null' object, but
+- // we need 'zero' here.
+- QTime t = QTime(0, 0).addMSecs(dSeconds * kMillisPerSecond);
+-
+- QString formatString =
+- (days > 0 ? (QString::number(days) %
+- QLatin1String("'d', ")) : QString()) %
+- QLatin1String(days > 0 || t.hour() > 0 ? "hh:mm:ss" : "mm:ss") %
+- QLatin1String(showCentis ? ".zzz" : "");
+-
+- QString timeString = t.toString(formatString);
+-
+- // The format string gives us milliseconds but we want
+- // centiseconds. Slice one character off.
+- if (showCentis) {
+- timeString = timeString.left(timeString.length() - 1);
+- }
+-
+- return timeString;
+- }
++ static QString formatSeconds(double dSeconds, bool showCentis);
+
+ private:
+ static LLTIMER s_timer;
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-rmx2-backport-controller-scripts.patch b/media-sound/mixxx/files/mixxx-2.0.0-rmx2-backport-controller-scripts.patch
new file mode 100644
index 000000000000..a82f27166abc
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-rmx2-backport-controller-scripts.patch
@@ -0,0 +1,280 @@
+diff -dNur a/res/controllers/Hercules-DJ-Console-RMX-2-scripts.js b/res/controllers/Hercules-DJ-Console-RMX-2-scripts.js
+--- a/res/controllers/Hercules-DJ-Console-RMX-2-scripts.js 2015-12-29 17:10:41.000000000 +0100
++++ b/res/controllers/Hercules-DJ-Console-RMX-2-scripts.js 2017-02-04 22:01:01.629506434 +0100
+@@ -1,128 +1,159 @@
+-/*╔══:::Made Lovingly By Circuitfry:::═════════════════════════════════╗
+- ║ Hercules DJConsole RMX 2 Mapping Scripts v. 0.1.3 ║
+- ╚════════════════════════════════════════════════════════════════════╝
+- * Version 0.1.0: Basic Midi Wizard Mapping
+- * Version 0.1.1: Partially-Functional platters (version 1).
+- * Version 0.1.2: Functional platters (version 1)
+- * Version 0.1.3: Functional EQ Kill/Pitch Bending buttons
+- Functional Looping/Sample/Effect pads
+- Bugfix: Source 2 Gain knob doesn't load tracks.
+- Overhaul: MIDI Scripting file.
+- Worklog: Need to implement Microphone/Source1/Source2 input.
+- * Note 1: [DEP] Means the command is meant for Mixxx v1.10.x + below.
+- * Note 2: [FUT] Means the command is meant for Mixxx v1.11.x + above.
+-*/
+-function DJCRMX2(){}
+-DJCRMX2.scratching = [];
++/* ╔══:::Made Lovingly By Circuitfry:::═════════════════════════════════╗
++ * ║ Hercules DJConsole RMX 2 Mapping Scripts ║
++ * ╚════════════════════════════════════════════════════════════════════╝
++ */
+
+-/* [ Function init ] - Version 0.1.3
+- * Initiates some global variables and assigns an ID. Required.
+-*/
+-DJCRMX2.init = function(id){
+- DJCRMX2.id = id;
+- DJCRMX2.scratching[1]=false;
+- DJCRMX2.scratching[2]=false;
+- engine.setValue("[Microphone]","enabled",0);
+- engine.setValue("[Microphone]","talkover",0);
++function DJCRMX2() {}
++DJCRMX2.decks = [];
++
++/* [ Function init ]
++ * Initiates some global variables and assigns an ID. Required.
++ */
++DJCRMX2.init = function (id) {
++ DJCRMX2.id = id;
++ DJCRMX2.decks[1] = new DJCRMX2.Deck(1);
++ DJCRMX2.decks[2] = new DJCRMX2.Deck(2);
++ engine.setValue("[Microphone]", "enabled", 0);
++ engine.setValue("[Microphone]", "talkover", 0);
+ }
+
+-/* [ Function wheelPress ] - Version 0.1.2
+- * Detects whether a jog wheel is pressed or not and sets a specific
+- * variable on and off accordingly.
+-*/
+-DJCRMX2.wheelPress = function (channel, control, value, status, group){
+- if (status == 0x90) // If status #144 is active (2 possibilities)
+- {
+- if (value == 0x7F) // And the jog wheel is pressed down:
+- { /* engine.scratchEnable(int,int,float,float,float,bool);
+- * [ int deck ] Which track/platter is playing?
+- * [ int intervalsPerRev ] # of MIDI signals sent in 1 spin.
+- * [ float rpm ] Imaginary vinyl rotation speed.
+- * [ float alpha ] Just a fine-tuning variable.
+- * [ float beta ] Just a fine-tuning variable.
+- * [ bool ramp ] As far as I know, nothing...
+- */
+- var alpha = 1.0/8;
+- var beta = alpha/32;
+- if(group=="[Channel1]")
+- {
+- engine.scratchEnable(1, 250, 50, alpha, beta);
+- DJCRMX2.scratching[1] = true; //[DEP]
+- }
+- if(group=="[Channel2]")
+- {
+- engine.scratchEnable(2, 250, 50, alpha, beta);
+- DJCRMX2.scratching[2] = true; //[DEP]
+- }
+-
+- }
+- if (value == 0x00 ) // If the jog wheel is released:
+- {
+- if(group=="[Channel1]")
+- {
+- DJCRMX2.scratching[1] = false; // <- v1.10.x and below
+- engine.scratchDisable(1);
+- }
+- if(group=="[Channel2]")
+- {
+- DJCRMX2.scratching[2] = false; // <- v1.10.x and below
+- engine.scratchDisable(2);
+- }
+- }
+- }
+- else //Default setting where button is not held down.
+- {
+- DJCRMX2.scratching[1] = false; // Only for v1.10.x and below
+- DJCRMX2.scratching[2] = false; // Only for v1.10.x and below
+- engine.scratchDisable(1);
+- engine.scratchDisable(2);
+- }
+- return;
++////////////////////////////////////////////////////////////////////////
++// Decks //
++////////////////////////////////////////////////////////////////////////
++
++DJCRMX2.Deck = function(number) {
++ this.number = number;
++ this.group = "[Channel" + this.number + "]";
++ this.scratchTimer = 0;
++};
++
++DJCRMX2.Deck.prototype.wheelPress = function (value) {
++ if (this.scratchTimer != 0) {
++ // The wheel was touched again, reset the timer.
++ engine.stopTimer(this.scratchTimer);
++ this.scratchTimer = 0;
++ }
++ if (value == 0x7F) {
++ // And the jog wheel is pressed down:
++
++ /* engine.scratchEnable(int,int,float,float,float,bool);
++ * [ int deck ] Which track/platter is playing?
++ * [ int intervalsPerRev ] # of MIDI signals sent in 1 spin.
++ * [ float rpm ] Imaginary vinyl rotation speed.
++ * [ float alpha ] Just a fine-tuning variable.
++ * [ float beta ] Just a fine-tuning variable.
++ * [ bool ramp ] As far as I know, nothing...
++ */
++
++ var alpha = 1.0 / 8;
++ var beta = alpha / 32;
++ engine.scratchEnable(this.number, 256, 33 + 1/3, alpha, beta);
++ } else {
++ // The wheel touch sensor can be overly sensitive, so don't release scratch mode right away.
++ // Depending on how fast the platter was moving, lengthen the time we'll wait.
++ var scratchRate = Math.abs(engine.getValue(this.group, "scratch2"));
++ var inertiaTime = Math.pow(1.8, scratchRate) * 50;
++ if (inertiaTime < 100) {
++ // Just do it now.
++ this.finishWheelPress();
++ } else {
++ this.scratchTimer = engine.beginTimer(
++ 100, "DJCRMX2.decks[" + this.number + "].finishWheelPress()", true);
++ }
++ }
++}
++
++DJCRMX2.Deck.prototype.finishWheelPress = function() {
++ this.scratchTimer = 0;
++ var play = engine.getValue(this.group, "play");
++ if (play != 0) {
++ // If we are playing, just hand off to the engine.
++ engine.scratchDisable(this.number, true);
++ } else {
++ // If things are paused, there will be a non-smooth handoff between scratching and jogging.
++ // Instead, keep scratch on until the platter is not moving.
++ var scratchRate = Math.abs(engine.getValue(this.group, "scratch2"));
++ if (scratchRate < 0.01) {
++ // The platter is basically stopped, now we can disable scratch and hand off to jogging.
++ engine.scratchDisable(this.number, false);
++ } else {
++ // Check again soon.
++ this.scratchTimer = engine.beginTimer(
++ 100, "DJCRMX2.decks[" + this.number + "].finishWheelPress()", true);
++ }
++ }
++};
++
++
++/* [ Function wheelTurn ]
++ * Pays attention to the current deck, checks scratching, affects the
++ * song accordingly.
++ */
++DJCRMX2.Deck.prototype.wheelTurn = function (value) {
++ var newValue = 0;
++ // Spinning backwards = 127 or less (less meaning faster)
++ // Spinning forwards = 1 or more (more meaning faster)
++ if (value - 64 > 0) {
++ newValue = value - 128;
++ } else {
++ newValue = value;
++ }
++
++ if (engine.isScratching(this.number)) {
++ engine.scratchTick(this.number, newValue);
++ } else {
++ engine.setValue(this.group, "jog", newValue);
++ }
+ }
++
++/* [ Function wheelPress ]
++ * Detects whether a jog wheel is pressed or not and sets a specific
++ * variable on and off accordingly.
++ */
++DJCRMX2.wheelPress = function (channel, control, value, status, group) {
++ var deck = 0;
++ if (group == "[Channel1]") {
++ deck = 1;
++ } else if (group == "[Channel2]") {
++ deck = 2;
++ } else {
++ return;
++ }
++ DJCRMX2.decks[deck].wheelPress(value);
++}
++
+
+-/* [ Function wheelTurn ] - Version 0.1.2
+- * Pays attention to the current deck, checks scratching, affects the
+- * song accordingly.
+-*/
+-DJCRMX2.wheelTurn = function (channel, control, value, status, group){
+- var newValue=0;
+- // Spinning backwards = 127 or less (less meaning faster)
+- // Spinning forwards = 1 or more (more meaning faster)
+- if (value-64 > 0) newValue = (value-128);
+- else newValue=value;
+- //if (!engine.isScratching(DJCRMX2.currentDeck)) // [FUT]
+- if(group=="[Channel1]")
+- {
+- if(DJCRMX2.scratching[1]==true) {engine.scratchTick(1,newValue);return;}
+- }
+- else if(group=="[Channel2]")
+- {
+- if(DJCRMX2.scratching[2]==true) {engine.scratchTick(2,newValue);return;}
+- }
+- engine.setValue(group, "jog", newValue);
+- return;
++/* [ Function wheelTurn ]
++ * Pays attention to the current deck, checks scratching, affects the
++ * song accordingly.
++ */
++DJCRMX2.wheelTurn = function (channel, control, value, status, group) {
++ var deck = 0;
++ if (group == "[Channel1]") {
++ deck = 1;
++ } else if (group == "[Channel2]") {
++ deck = 2;
++ } else {
++ return;
++ }
++ DJCRMX2.decks[deck].wheelTurn(value);
+ }
+
+-DJCRMX2.micSwitch = function (channel, control, value, status) //???
++DJCRMX2.micSwitch = function (channel, control, value, status)
+ {
+- if(status == 0x90 && control == 0x48 && value == 0x7F)
+- {
+- engine.setValue("[Microphone]","enabled",1);
+- engine.setValue("[Microphone]","talkover",1);
+- }
+- if(status == 0x90 && control == 0x48 && value == 0x00)
+- {
+- engine.setValue("[Microphone]","enabled",0);
+- engine.setValue("[Microphone]","talkover",0);
+- }
++ if (status == 0x90 && control == 0x48 && value == 0x7F) {
++ engine.setValue("[Microphone]","enabled",1);
++ engine.setValue("[Microphone]","talkover",1);
++ } else if (status == 0x90 && control == 0x48 && value == 0x00) {
++ engine.setValue("[Microphone]","enabled",0);
++ engine.setValue("[Microphone]","talkover",0);
++ }
+ }
+
+-/* [ Function shutdown ] - Version 0.1.3
+- * Sets variables down for shutoff.
+-*/
+-DJCRMX2.shutdown = function(id){
+- DJCRMX2.scratching[1]=false;
+- DJCRMX2.scratching[2]=false;
+- engine.setValue("[Microphone]","enabled",0);
+- engine.setValue("[Microphone]","talkover",0);
++/* [ Function shutdown ] - Version 0.1.3
++ * Sets variables down for shutoff.
++ */
++DJCRMX2.shutdown = function (id) {
++ engine.setValue("[Microphone]", "enabled", 0);
++ engine.setValue("[Microphone]", "talkover", 0);
+ }
diff --git a/media-sound/mixxx/files/mixxx-2.0.0-sqlite3.patch b/media-sound/mixxx/files/mixxx-2.0.0-sqlite3.patch
new file mode 100644
index 000000000000..a8cb15e63c65
--- /dev/null
+++ b/media-sound/mixxx/files/mixxx-2.0.0-sqlite3.patch
@@ -0,0 +1,14 @@
+https://bugs.gentoo.org/622776
+
+--- mixxx-2.0.0/src/library/trackcollection.h
++++ mixxx-2.0.0/src/library/trackcollection.h
+@@ -34,8 +34,7 @@
+ #include "library/dao/libraryhashdao.h"
+
+ #ifdef __SQLITE3__
+-typedef struct sqlite3_context sqlite3_context;
+-typedef struct Mem sqlite3_value;
++#include <sqlite3.h>
+ #endif
+
+ class TrackInfoObject;
diff --git a/media-sound/mixxx/metadata.xml b/media-sound/mixxx/metadata.xml
new file mode 100644
index 000000000000..4627d1b0b257
--- /dev/null
+++ b/media-sound/mixxx/metadata.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="project">
+ <email>proaudio@gentoo.org</email>
+ <name>Gentoo ProAudio Project</name>
+ </maintainer>
+ <use>
+ <flag name="hid">Enable HID controller support</flag>
+ <flag name="shout">Enable broadcasting support via <pkg>media-libs/libshout</pkg></flag>
+ </use>
+ <upstream>
+ <remote-id type="sourceforge">mixxx</remote-id>
+ <remote-id type="github">mixxxdj/mixxx</remote-id>
+ </upstream>
+</pkgmetadata>
diff --git a/media-sound/mixxx/mixxx-2.0.0-r4.ebuild b/media-sound/mixxx/mixxx-2.0.0-r4.ebuild
new file mode 100644
index 000000000000..d8a4bb179981
--- /dev/null
+++ b/media-sound/mixxx/mixxx-2.0.0-r4.ebuild
@@ -0,0 +1,142 @@
+# Copyright 1999-2017 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://downloads.${PN}.org/${P}/${P}-src.tar.gz"
+
+# Upstream patches
+SRC_URI+=" https://github.com/mixxxdj/mixxx/commit/51d95ba58d99309f439cb7e2d1285cfb33aa0f63.patch -> ${PN}-2.0.0-ffmpeg30.patch"
+SRC_URI+=" https://github.com/mixxxdj/mixxx/commit/869e07067b15e09bf7ef886a8772afdfb79cbc3c.patch -> ${PN}-2.0.0-ffmpeg31.patch"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="amd64 x86"
+IUSE="aac debug doc ffmpeg hid mp3 mp4 shout wavpack"
+
+# fails to compile system-fidlib. Add ">media-libs/fidlib-0.9.10-r1" once this
+# got fixed
+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= )
+"
+# media-libs/rubberband RDEPENDs on sci-libs/fftw:3.0
+DEPEND="
+ ${RDEPEND}
+ virtual/pkgconfig
+ dev-qt/qttest:5
+ dev-qt/qtxmlpatterns:5
+"
+
+PATCHES=(
+ "${FILESDIR}"/${PN}-2.0.0-docs.patch
+
+ "${DISTDIR}"/${P}-ffmpeg30.patch
+ "${DISTDIR}"/${P}-ffmpeg31.patch
+
+ "${FILESDIR}"/${P}-chromaprint-1.4.patch #604528
+ "${FILESDIR}"/${P}-gcc62.patch #595090
+
+ "${FILESDIR}"/${PN}-2.0.0-sqlite3.patch #622776
+
+ # The following patches were taken from sunny-overlay (bug #608430)
+ "${FILESDIR}"/${P}-fix-formatting-of-time-durations.patch
+ "${FILESDIR}"/${P}-eliminate-unnecessary-heap-allocation-of-qtime.patch
+ "${FILESDIR}"/${P}-fix-missing-pointer-initialization.patch
+ "${FILESDIR}"/${P}-move-definition-of-time-formatseconds-into-dot-cpp-file.patch
+ "${FILESDIR}"/${P}-fix-formatting-of-time-durations2.patch
+ "${FILESDIR}"/${P}-rmx2-backport-controller-scripts.patch
+)
+
+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}"
+ qdebug="$(usex debug 1 0)"
+ 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
+}