diff -Nru mixxx-2.2.3~dfsg/build/depends.py mixxx-2.2.4~dfsg/build/depends.py --- mixxx-2.2.3~dfsg/build/depends.py 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/depends.py 2020-05-15 21:26:10.000000000 +0000 @@ -1304,7 +1304,7 @@ 'preferences/dialog/dlgprefvinyldlg.ui', 'preferences/dialog/dlgprefwaveformdlg.ui', ] - map(Qt.uic(build), ui_files) + list(map(Qt.uic(build), ui_files)) if build.platform_is_windows: # Add Windows resource file with icons and such diff -Nru mixxx-2.2.3~dfsg/build/features.py mixxx-2.2.4~dfsg/build/features.py --- mixxx-2.2.3~dfsg/build/features.py 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/features.py 2020-05-15 21:26:10.000000000 +0000 @@ -814,6 +814,8 @@ class LiveBroadcasting(Feature): + INTERNAL_LINK = False + def description(self): return "Live Broadcasting Support" @@ -830,11 +832,22 @@ if not self.enabled(build): return - libshout_found = conf.CheckLib(['libshout', 'shout']) build.env.Append(CPPDEFINES='__BROADCAST__') - if not libshout_found: - raise Exception('Could not find libshout or its development headers. Please install it or compile Mixxx without Shoutcast support using the shoutcast=0 flag.') + if build.platform_is_linux: + # Check if system lib is lower at least 2.4.4 and not suffering bug + # https://bugs.launchpad.net/mixxx/+bug/1833225 + if not conf.CheckForPKG('shout', '2.4.4'): + self.INTERNAL_LINK = True + + if not self.INTERNAL_LINK: + self.INTERNAL_LINK = not conf.CheckLib(['libshout', 'shout']) + + if self.INTERNAL_LINK: + print("Using internal shout_mixxx from lib/libshout") + build.env.Append(CPPPATH='include') + build.env.Append(CPPPATH='src') + return if build.platform_is_windows and build.static_dependencies: conf.CheckLib('winmm') @@ -842,6 +855,32 @@ conf.CheckLib('gdi32') def sources(self, build): + if self.INTERNAL_LINK: + # Clone our main environment so we don't change any settings in the + # Mixxx environment + libshout_env = build.env.Clone() + libshout_env['LIB_OUTPUT'] = '#lib/libshout/lib' + + if build.toolchain_is_gnu: + libshout_env.Append(CCFLAGS='-pthread') + libshout_env.Append(LINKFLAGS='-pthread') + + libshout_env.Append(CPPPATH="#lib/libshout") + libshout_dir = libshout_env.Dir("#lib/libshout") + + env = libshout_env + SCons.Export('env') + SCons.Export('build') + env.SConscript( + env.File('SConscript', libshout_dir), + variant_dir="lib/libshout2", + duplicate=0, + exports=['build']) + + build.env.Append(CPPPATH="#lib/libshout/include") + build.env.Append(LIBPATH='#lib/libshout/lib') + build.env.Append(LIBS=['shout_mixxx', 'ogg', 'vorbis', 'theora', 'speex', 'ssl', 'crypto']) + depends.Qt.uic(build)('preferences/dialog/dlgprefbroadcastdlg.ui') return ['preferences/dialog/dlgprefbroadcast.cpp', 'broadcast/broadcastmanager.cpp', diff -Nru mixxx-2.2.3~dfsg/build/wix/Localization/po/es-ES.po mixxx-2.2.4~dfsg/build/wix/Localization/po/es-ES.po --- mixxx-2.2.3~dfsg/build/wix/Localization/po/es-ES.po 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/wix/Localization/po/es-ES.po 2020-05-15 21:26:10.000000000 +0000 @@ -2,7 +2,7 @@ # Translators: # Jorge Marcos (Jorgeelalto) , 2016 # Jorge Marcos (Jorgeelalto) , 2016 -# Jose Manuel López , 2018 +# Jose Manuel López , 2018 # Josep Maria Antolin , 2016-2017 # Josep Maria Antolin , 2016 # Michael , 2017 diff -Nru mixxx-2.2.3~dfsg/build/wix/Localization/po/nl-NL.po mixxx-2.2.4~dfsg/build/wix/Localization/po/nl-NL.po --- mixxx-2.2.3~dfsg/build/wix/Localization/po/nl-NL.po 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/wix/Localization/po/nl-NL.po 2020-05-15 21:26:10.000000000 +0000 @@ -1,6 +1,7 @@ # # Translators: # Henk Gordebeke , 2017 +# Mario Moens , 2020 # Raf Van De Meirssche , 2016 # Raf Van De Meirssche , 2016 # S.Brandt , 2018 @@ -9,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2019-04-17 21:53+0000\n" -"Last-Translator: S.Brandt \n" +"PO-Revision-Date: 2020-05-05 13:41+0000\n" +"Last-Translator: Mario Moens \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -166,23 +167,23 @@ #. Bootstrapper msgctxt "Caption" msgid "[WixBundleName] Setup" -msgstr "" +msgstr "[WixBundleName] Setup" msgctxt "Title" msgid "[WixBundleName]" -msgstr "" +msgstr "[WixBundleName]" msgctxt "ConfirmCancelMessage" msgid "Are you sure you want to cancel?" -msgstr "" +msgstr "Weet je zeker dat je dit wilt annuleren?" msgctxt "ExecuteUpgradeRelatedBundleMessage" msgid "Previous version" -msgstr "" +msgstr "Vorige versie" msgctxt "HelpHeader" msgid "Setup Help" -msgstr "" +msgstr "Setup Help" msgctxt "HelpText" msgid "" @@ -196,178 +197,178 @@ " /norestart - suppress any attempts to restart. By default user interface will prompt before restart.\n" "\n" " /log log.txt - logs to a specific file. By default a log file is created in %TEMP%." -msgstr "" +msgstr "/installeren | /herstellen | /verwijderen | /layout [directory] - installeert, repareert, verwijdert of\n maakt een complete lokale kopie van de bundel in de directory.\n Installeren is de standaard.\n\n /passief | /stil - geeft een minimale gebruikersinterface weer zonder prompts of geeft geen gebruikersinterface weer\n en geen prompts. Standaard worden de gebruikersinterface en alle prompts weergegeven.\n\n /norestart - onderdruk pogingen om opnieuw op te starten. Standaard vraagt de gebruikersinterface om opnieuw op te starten.\n\n /log log.txt - logt in op een specifiek bestand. Standaard wordt een logbestand gemaakt in% TEMP%." msgctxt "HelpCloseButton" msgid "&Close" -msgstr "" +msgstr "&Sluiten" msgctxt "InstallHeader" msgid "Welcome" -msgstr "" +msgstr "Welkom" msgctxt "InstallMessage" msgid "" "Setup will install Mixxx on your computer.\n" "It will first install required third party libraries, then Mixxx itself.\n" "Click Install to continue or Close to exit." -msgstr "" +msgstr "Setup installeert Mixxx op uw computer.\nHet zal eerst de vereiste bibliotheken van derden installeren en vervolgens Mixxx zelf.\nKlik op Installeren om door te gaan of op Sluiten om af te sluiten." msgctxt "InstallVersion" msgid "Version [WixBundleVersion]" -msgstr "" +msgstr "[WixBundleVersion] Versie" msgctxt "InstallOptionsButton" msgid "&Options" -msgstr "" +msgstr "&Opties" msgctxt "InstallInstallButton" msgid "&Install" -msgstr "" +msgstr "&Installeer" msgctxt "InstallCloseButton" msgid "&Close" -msgstr "" +msgstr "&Sluiten" msgctxt "OptionsHeader" msgid "Setup Options" -msgstr "" +msgstr "Setup Opties" msgctxt "OptionsLocationLabel" msgid "Install location:" -msgstr "" +msgstr "Installatielocatie:" msgctxt "OptionsBrowseButton" msgid "&Browse" -msgstr "" +msgstr "&Bladeren" msgctxt "OptionsOkButton" msgid "&OK" -msgstr "" +msgstr "&OK" msgctxt "OptionsCancelButton" msgid "&Cancel" -msgstr "" +msgstr "&Anulleren" msgctxt "FilesInUseHeader" msgid "Files In Use" -msgstr "" +msgstr "Bestanden in gebruik" msgctxt "FilesInUseLabel" msgid "The following applications are using files that need to be updated:" -msgstr "" +msgstr "De volgende toepassingen maken gebruik van bestanden die moeten worden bijgewerkt:" msgctxt "FilesInUseCloseRadioButton" msgid "Close the &applications and attempt to restart them." -msgstr "" +msgstr "Sluit de &applicaties en probeer ze opnieuw op te starten." msgctxt "FilesInUseDontCloseRadioButton" msgid "&Do not close applications. A reboot will be required." -msgstr "" +msgstr "&Sluit applicaties niet. Opnieuw opstarten is vereist." msgctxt "FilesInUseOkButton" msgid "&OK" -msgstr "" +msgstr "&OK" msgctxt "FilesInUseCancelButton" msgid "&Cancel" -msgstr "" +msgstr "&Anulleren" msgctxt "ProgressHeader" msgid "Setup Progress" -msgstr "" +msgstr "Setup Voortgang" msgctxt "ProgressLabel" msgid "Processing:" -msgstr "" +msgstr "Verwerken:" msgctxt "OverallProgressPackageText" msgid "Initializing..." -msgstr "" +msgstr "Initialiseren..." msgctxt "ProgressCancelButton" msgid "&Cancel" -msgstr "" +msgstr "&Anulleren" msgctxt "ModifyHeader" msgid "Modify Setup" -msgstr "" +msgstr "Setup wijzigen" msgctxt "ModifyRepairButton" msgid "&Repair" -msgstr "" +msgstr "&Herstellen" msgctxt "ModifyUninstallButton" msgid "&Uninstall" -msgstr "" +msgstr "&Verwijderen" msgctxt "ModifyCloseButton" msgid "&Close" -msgstr "" +msgstr "&Sluten" msgctxt "SuccessHeader" msgid "Setup Successful" -msgstr "" +msgstr "Setup succesvol" msgctxt "SuccessInstallHeader" msgid "Mixxx installation has been successful" -msgstr "" +msgstr "Mixxx-installatie is geslaagd" msgctxt "SuccessRepairHeader" msgid "Mixxx repair has been successful" -msgstr "" +msgstr "Mixxx-herstel is geslaagd" msgctxt "SuccessUninstallHeader" msgid "Mixxx uninstall has been successful" -msgstr "" +msgstr "Mixxx verwijderen is geslaagd" msgctxt "SuccessLaunchButton" msgid "&Launch" -msgstr "" +msgstr "&Opstarten" msgctxt "SuccessRestartText" msgid "You must restart your computer before you can use the software." -msgstr "" +msgstr "U moet uw computer opnieuw opstarten voordat u de software kunt gebruiken." msgctxt "SuccessRestartButton" msgid "&Restart" -msgstr "" +msgstr "&Herstarten" msgctxt "SuccessCloseButton" msgid "&Close" -msgstr "" +msgstr "&Sluten" msgctxt "FailureHeader" msgid "Setup Failed" -msgstr "" +msgstr "Installatie mislukt" msgctxt "FailureInstallHeader" msgid "Mixxx installation failed" -msgstr "" +msgstr "Mixxx-installatie mislukt" msgctxt "FailureRepairHeader" msgid "Mixxx repair failed" -msgstr "" +msgstr "Mixxx-herstel mislukt" msgctxt "FailureUninstallHeader" msgid "Mixxx uninstall failed" -msgstr "" +msgstr "Mixxx verwijderen is mislukt" msgctxt "FailureHyperlinkLogText" msgid "" "One or more issues caused the setup to fail. Please fix the issues and then " "retry setup. For more information see the log file." -msgstr "" +msgstr "Door een of meer problemen is de installatie mislukt. Los de problemen op en probeer het opnieuw. Zie het logbestand voor meer informatie." msgctxt "FailureRestartText" msgid "" "You must restart your computer to complete the rollback of the software." -msgstr "" +msgstr "U moet uw computer opnieuw opstarten om het terugdraaien van de software te voltooien." msgctxt "FailureRestartButton" msgid "&Restart" -msgstr "" +msgstr "&Herstarten" msgctxt "FailureCloseButton" msgid "&Close" -msgstr "" +msgstr "&Sluten" diff -Nru mixxx-2.2.3~dfsg/build/wix/Localization/po/pt-BR.po mixxx-2.2.4~dfsg/build/wix/Localization/po/pt-BR.po --- mixxx-2.2.3~dfsg/build/wix/Localization/po/pt-BR.po 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/wix/Localization/po/pt-BR.po 2020-05-15 21:26:10.000000000 +0000 @@ -2,15 +2,17 @@ # Translators: # Felipe Morato , 2017 # Fer22f , 2016 +# Radagásio Fernandes , 2020 # Rui , 2018 # S.Brandt , 2018 # Sebastien BLAISOT , 2016 # Sebastien BLAISOT , 2016 +# Seila Oxe , 2020 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2019-04-17 21:53+0000\n" -"Last-Translator: S.Brandt \n" +"PO-Revision-Date: 2020-04-11 18:29+0000\n" +"Last-Translator: Radagásio Fernandes \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -100,7 +102,7 @@ "Installer was not able to find Microsoft Visual C++ 2015 Redistributable on " "this system. This is likely an installer bug that should be reported to " "Mixxx developers." -msgstr "" +msgstr "O instalador não conseguiu encontrar o Microsoft Visual C ++ 2015 Redistributable neste sistema. Provavelmente, é um erro do instalador que deve ser relatado aos desenvolvedores do Mixxx." #. Custom Warning Dialog msgctxt "WarningDlgTitle" @@ -166,7 +168,7 @@ #. Bootstrapper msgctxt "Caption" msgid "[WixBundleName] Setup" -msgstr "" +msgstr "Configuração" msgctxt "Title" msgid "[WixBundleName]" @@ -174,15 +176,15 @@ msgctxt "ConfirmCancelMessage" msgid "Are you sure you want to cancel?" -msgstr "" +msgstr "Você tem certeza que deseja cancelar?" msgctxt "ExecuteUpgradeRelatedBundleMessage" msgid "Previous version" -msgstr "" +msgstr "Versão anterior" msgctxt "HelpHeader" msgid "Setup Help" -msgstr "" +msgstr "Ajuda de configuração" msgctxt "HelpText" msgid "" @@ -196,7 +198,7 @@ " /norestart - suppress any attempts to restart. By default user interface will prompt before restart.\n" "\n" " /log log.txt - logs to a specific file. By default a log file is created in %TEMP%." -msgstr "" +msgstr "/instalar | /reparar | /desinstalar | /layout [diretório] - instala, repara, desinstala ou\ncria uma cópia local completa do pacote configurável no diretório.\nInstalar é o padrão.\n\n/passivo | /silencioso - exibe uma interface de usuário mínima sem prompts ou nenhuma interface de usuário\n     e sem avisos. Por padrão, a interface do usuário e todos os prompts são exibidos.\n\n/sem reinício - suprime qualquer tentativa de reiniciar. Por padrão, a interface do usuário solicitará antes de reiniciar.\n/log log.txt - registra em um arquivo específico. Por padrão, um arquivo de log é criado em %TEMP%." msgctxt "HelpCloseButton" msgid "&Close" @@ -211,7 +213,7 @@ "Setup will install Mixxx on your computer.\n" "It will first install required third party libraries, then Mixxx itself.\n" "Click Install to continue or Close to exit." -msgstr "" +msgstr "O instalador instalará o Mixxx no seu computador.\nPrimeiro ele instala as bibliotecas de terceiros necessárias e depois o próprio Mixxx.\nClique em Instalar para continuar ou Fechar para sair." msgctxt "InstallVersion" msgid "Version [WixBundleVersion]" @@ -231,19 +233,19 @@ msgctxt "OptionsHeader" msgid "Setup Options" -msgstr "" +msgstr "Opções de Configuração" msgctxt "OptionsLocationLabel" msgid "Install location:" -msgstr "" +msgstr "Local de instalação:" msgctxt "OptionsBrowseButton" msgid "&Browse" -msgstr "" +msgstr "&Navegador" msgctxt "OptionsOkButton" msgid "&OK" -msgstr "" +msgstr "&OK" msgctxt "OptionsCancelButton" msgid "&Cancel" @@ -251,23 +253,23 @@ msgctxt "FilesInUseHeader" msgid "Files In Use" -msgstr "" +msgstr "Arquivos em Uso" msgctxt "FilesInUseLabel" msgid "The following applications are using files that need to be updated:" -msgstr "" +msgstr "Os seguintes aplicativos estão usando arquivos que precisam ser atualizados:" msgctxt "FilesInUseCloseRadioButton" msgid "Close the &applications and attempt to restart them." -msgstr "" +msgstr "Feche os &aplicativos e tente reiniciá-los." msgctxt "FilesInUseDontCloseRadioButton" msgid "&Do not close applications. A reboot will be required." -msgstr "" +msgstr "&Não feche as aplicações. Uma reinicialização será necessária." msgctxt "FilesInUseOkButton" msgid "&OK" -msgstr "" +msgstr "&OK" msgctxt "FilesInUseCancelButton" msgid "&Cancel" @@ -275,15 +277,15 @@ msgctxt "ProgressHeader" msgid "Setup Progress" -msgstr "" +msgstr "Progresso da instalação" msgctxt "ProgressLabel" msgid "Processing:" -msgstr "" +msgstr "Processando:" msgctxt "OverallProgressPackageText" msgid "Initializing..." -msgstr "" +msgstr "Inicializando..." msgctxt "ProgressCancelButton" msgid "&Cancel" @@ -291,15 +293,15 @@ msgctxt "ModifyHeader" msgid "Modify Setup" -msgstr "" +msgstr "Modificar a instalação" msgctxt "ModifyRepairButton" msgid "&Repair" -msgstr "" +msgstr "&Reparar" msgctxt "ModifyUninstallButton" msgid "&Uninstall" -msgstr "" +msgstr "&Desinstalar" msgctxt "ModifyCloseButton" msgid "&Close" @@ -307,31 +309,31 @@ msgctxt "SuccessHeader" msgid "Setup Successful" -msgstr "" +msgstr "Instalação bem sucedida" msgctxt "SuccessInstallHeader" msgid "Mixxx installation has been successful" -msgstr "" +msgstr "A instalação do Mixxx foi bem-sucedida" msgctxt "SuccessRepairHeader" msgid "Mixxx repair has been successful" -msgstr "" +msgstr "O reparo do Mixxx foi bem sucedido" msgctxt "SuccessUninstallHeader" msgid "Mixxx uninstall has been successful" -msgstr "" +msgstr "A desinstalação do Mixxx foi bem sucedida" msgctxt "SuccessLaunchButton" msgid "&Launch" -msgstr "" +msgstr "&Iniciar o Mixxx" msgctxt "SuccessRestartText" msgid "You must restart your computer before you can use the software." -msgstr "" +msgstr "Você deve reiniciar o computador antes de poder usar o software." msgctxt "SuccessRestartButton" msgid "&Restart" -msgstr "" +msgstr "&Reiniciar" msgctxt "SuccessCloseButton" msgid "&Close" @@ -339,34 +341,34 @@ msgctxt "FailureHeader" msgid "Setup Failed" -msgstr "" +msgstr "Falha na instalação" msgctxt "FailureInstallHeader" msgid "Mixxx installation failed" -msgstr "" +msgstr "Falha na instalação do Mixxx" msgctxt "FailureRepairHeader" msgid "Mixxx repair failed" -msgstr "" +msgstr "Falha no reparo do MIxxx" msgctxt "FailureUninstallHeader" msgid "Mixxx uninstall failed" -msgstr "" +msgstr "Falha na desinstalação do Mixxx" msgctxt "FailureHyperlinkLogText" msgid "" "One or more issues caused the setup to fail. Please fix the issues and then " "retry setup. For more information see the log file." -msgstr "" +msgstr "Um ou mais problemas causaram falha na instalação. Corrija os problemas e tente novamente a instalação. Para mais informações, consulte o arquivo de log." msgctxt "FailureRestartText" msgid "" "You must restart your computer to complete the rollback of the software." -msgstr "" +msgstr "Você deve reiniciar o computador para concluir a reversão do software." msgctxt "FailureRestartButton" msgid "&Restart" -msgstr "" +msgstr "&Reiniciar" msgctxt "FailureCloseButton" msgid "&Close" diff -Nru mixxx-2.2.3~dfsg/build/wix/Localization/po/tr-TR.po mixxx-2.2.4~dfsg/build/wix/Localization/po/tr-TR.po --- mixxx-2.2.3~dfsg/build/wix/Localization/po/tr-TR.po 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/build/wix/Localization/po/tr-TR.po 2020-05-15 21:26:10.000000000 +0000 @@ -1,13 +1,14 @@ # # Translators: +# abc Def , 2020 # Salih Tekin , 2017 # Salih Tekin , 2017 # S.Brandt , 2018 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2019-04-17 21:53+0000\n" -"Last-Translator: S.Brandt \n" +"PO-Revision-Date: 2020-03-29 00:15+0000\n" +"Last-Translator: abc Def \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -175,7 +176,7 @@ msgctxt "ExecuteUpgradeRelatedBundleMessage" msgid "Previous version" -msgstr "" +msgstr "Önceki Uyarlama" msgctxt "HelpHeader" msgid "Setup Help" diff -Nru mixxx-2.2.3~dfsg/CHANGELOG mixxx-2.2.4~dfsg/CHANGELOG --- mixxx-2.2.3~dfsg/CHANGELOG 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/CHANGELOG 2020-05-15 21:26:10.000000000 +0000 @@ -1,4 +1,26 @@ +==== 2.2.4 2020-05-10 ==== +* Store default recording format after "Restore Defaults" lp:1857806 #2414 +* Prevent infinite loop when decoding corrupt MP3 files #2417 +* Add workaround for broken libshout versions #2040 #2438 +* Speed up purging of tracks lp:1845837 #2393 +* Don't stop playback if vinyl passthrough input is configured and PASS button is pressed #2474 +* Fix debug assertion for invalid crate names lp:1861431 #2477 +* Fix crashes when executing actions on tracks that already disappeared from the DB #2527 +* AutoDJ: Skip next track when both deck are playing lp:1399974 #2531 +* Tweak scratch parameters for Mixtrack Platinum #2028 +* Fix auto tempo going to infinity on Pioneer DDJ-SB2 #2559 +* Fix bpm.tapButton logic and reject missed & double taps #2594 +* Add controller mapping for Native Instruments Traktor Kontrol S2 MK3 #2348 +* Add controller mapping for Soundless joyMIDI #2425 +* Add controller mapping for Hercules DJControl Inpulse 300 #2465 +* Add controller mapping for Denon MC7000 #2546 +* Add controller mapping for Stanton DJC.4 #2607 +* Fix broadcasting via broadcast/recording input lp:1876222 #2743 +* Only apply ducking gain in manual ducking mode when talkover is enabed lp:1394968 lp:1737113 lp:1662536 #2759 +* Ignore MIDI Clock Messages (0xF8) because they are not usable in Mixxx and inhibited the screensaver #2786 + ==== 2.2.3 2019-11-24 ==== + * Don't make users reconfigure sound hardware when it has not changed #2253 * Fix MusicBrainz metadata lookup lp:1848887 #2328 * Fix high DPI scaling of cover art #2247 diff -Nru mixxx-2.2.3~dfsg/debian/changelog mixxx-2.2.4~dfsg/debian/changelog --- mixxx-2.2.3~dfsg/debian/changelog 2020-07-26 08:18:01.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/changelog 2020-08-13 16:17:10.000000000 +0000 @@ -1,8 +1,25 @@ -mixxx (2.2.3~dfsg-1.1build1) groovy; urgency=medium +mixxx (2.2.4~dfsg-1) unstable; urgency=medium - * Rebuild against new libprotobuf23. + * Team upload - -- Gianfranco Costamagna Sun, 26 Jul 2020 10:18:01 +0200 + * New upstream release + * debian/patches/: patchset updated against v2.2.4 + - 0005-scons-3.patch dropped (applied upstream) + - 0005-remove_inappropriate_i386_flags.patch added (Closes: #950131) + - 0006-features_fix.patch added + * debian/copyright: by-tab indentation removed + * debian/control: + - debhelper bump 11 -> 13 + - S-V bump 4.4.1 -> 4.5.0 (no changes needed) + - RRR set + - add missing b-dep libmodplug-dev + - drop myself from Uploaders + * debian/mixxx.install: add missing install path + * debian/rules: + - update clean path for pyc files + - drop duplicate files on install + + -- Matteo F. Vescovi Thu, 13 Aug 2020 18:17:10 +0200 mixxx (2.2.3~dfsg-1.1) unstable; urgency=medium diff -Nru mixxx-2.2.3~dfsg/debian/control mixxx-2.2.4~dfsg/debian/control --- mixxx-2.2.3~dfsg/debian/control 2019-11-30 19:50:32.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/control 2020-08-13 16:14:54.000000000 +0000 @@ -4,11 +4,10 @@ Maintainer: Debian Multimedia Maintainers Uploaders: Paul Brossier , - Free Ekanayaka , - Matteo F. Vescovi + Free Ekanayaka Build-Depends: chrpath, - debhelper-compat (= 11), + debhelper-compat (= 13), docbook-to-man, gir1.2-rsvg-2.0, libavcodec-dev, @@ -26,6 +25,7 @@ libjack-dev, liblilv-dev, libmad0-dev, + libmodplug-dev, libogg-dev, libopus-dev, libopusfile-dev, @@ -53,7 +53,8 @@ scons, scour, vamp-plugin-sdk -Standards-Version: 4.4.1 +Standards-Version: 4.5.0 +Rules-Requires-Root: no Vcs-Git: https://salsa.debian.org/multimedia-team/mixxx.git Vcs-Browser: https://salsa.debian.org/multimedia-team/mixxx Homepage: https://www.mixxx.org/ diff -Nru mixxx-2.2.3~dfsg/debian/copyright mixxx-2.2.4~dfsg/debian/copyright --- mixxx-2.2.3~dfsg/debian/copyright 2019-11-30 19:50:32.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/copyright 2020-08-13 15:07:48.000000000 +0000 @@ -109,7 +109,7 @@ material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors + wiki.creativecommons.org/Considerations_for_licensors . Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the @@ -126,7 +126,7 @@ Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public: - wiki.creativecommons.org/Considerations_for_licensees + wiki.creativecommons.org/Considerations_for_licensees . ======================================================================= . @@ -574,4 +574,4 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru mixxx-2.2.3~dfsg/debian/mixxx.install mixxx-2.2.4~dfsg/debian/mixxx.install --- mixxx-2.2.3~dfsg/debian/mixxx.install 2018-04-30 20:48:25.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/mixxx.install 2020-08-13 15:49:12.000000000 +0000 @@ -1,4 +1,5 @@ usr/bin usr/lib +usr/share/appdata usr/share/applications usr/share/pixmaps diff -Nru mixxx-2.2.3~dfsg/debian/patches/0005-remove_inappropriate_i386_flags.patch mixxx-2.2.4~dfsg/debian/patches/0005-remove_inappropriate_i386_flags.patch --- mixxx-2.2.3~dfsg/debian/patches/0005-remove_inappropriate_i386_flags.patch 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/patches/0005-remove_inappropriate_i386_flags.patch 2020-08-13 15:07:48.000000000 +0000 @@ -0,0 +1,21 @@ +From: "Matteo F. Vescovi" +Date: Fri, 05 Jun 2020 23:18:54 +0100 +Subject: remove_inappropriate_i386_flags + +--- + build/features.py | 2 +- + 1 file changed, 1 insertions(+), 1 deletions(-) + +diff --git a/build/features.py b/build/features.py +index 7d5c762..e04f026 100644 +--- a/build/features.py ++++ b/build/features.py +@@ -1188,7 +1188,7 @@ class Optimize(Feature): + if not build.machine_is_64bit: + # the sse flags are not set by default on 32 bit builds + # but are not supported on arm builds +- build.env.Append(CCFLAGS='-msse2') ++ #build.env.Append(CCFLAGS='-msse2') + build.env.Append(CCFLAGS='-mfpmath=sse') + elif build.architecture_is_arm: + self.status = self.build_status(optimize_level) diff -Nru mixxx-2.2.3~dfsg/debian/patches/0005-scons-3.patch mixxx-2.2.4~dfsg/debian/patches/0005-scons-3.patch --- mixxx-2.2.3~dfsg/debian/patches/0005-scons-3.patch 2020-05-12 23:06:52.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/patches/0005-scons-3.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Description: Build correctly under scons on Python 3 -Bug-Upstream: https://bugs.launchpad.net/mixxx/+bug/1817742 -Bug-Debian: https://bugs.debian.org/947568 -Author: Jan Holthuis -Origin: upstream, https://github.com/mixxxdj/mixxx/pull/2201/commits/03fad27e1f0f18ec83c9a4bc5f03f28948cd44fb - ---- a/build/depends.py -+++ b/build/depends.py -@@ -1285,7 +1285,11 @@ - 'preferences/dialog/dlgprefvinyldlg.ui', - 'preferences/dialog/dlgprefwaveformdlg.ui', - ] -- map(Qt.uic(build), ui_files) -+ -+ # In Python 3.x, map() returns a "map object" (instead of a list), -+ # which is evaluated on-demand rather than at once. To invoke uic -+ # for all *.ui files at once, we need to cast it to a list here. -+ list(map(Qt.uic(build), ui_files)) - - if build.platform_is_windows: - # Add Windows resource file with icons and such diff -Nru mixxx-2.2.3~dfsg/debian/patches/0006-features_fix.patch mixxx-2.2.4~dfsg/debian/patches/0006-features_fix.patch --- mixxx-2.2.3~dfsg/debian/patches/0006-features_fix.patch 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/patches/0006-features_fix.patch 2020-08-13 15:35:31.000000000 +0000 @@ -0,0 +1,13 @@ +diff --git a/build/features.py b/build/features.py +index 7d5c7624..5580d863 100644 +--- a/build/features.py ++++ b/build/features.py +@@ -837,7 +837,7 @@ class LiveBroadcasting(Feature): + if build.platform_is_linux: + # Check if system lib is lower at least 2.4.4 and not suffering bug + # https://bugs.launchpad.net/mixxx/+bug/1833225 +- if not conf.CheckForPKG('shout', '2.4.4'): ++ if not conf.CheckForPKG('shout', '2.4.3'): + self.INTERNAL_LINK = True + + if not self.INTERNAL_LINK: diff -Nru mixxx-2.2.3~dfsg/debian/patches/series mixxx-2.2.4~dfsg/debian/patches/series --- mixxx-2.2.3~dfsg/debian/patches/series 2020-05-12 22:56:06.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/patches/series 2020-08-13 15:35:50.000000000 +0000 @@ -2,4 +2,5 @@ 0002-desktop_file.patch 0003-soundtouch.patch 0004-remove_inappropriate_arm_flags.patch -0005-scons-3.patch +0005-remove_inappropriate_i386_flags.patch +0006-features_fix.patch diff -Nru mixxx-2.2.3~dfsg/debian/rules mixxx-2.2.4~dfsg/debian/rules --- mixxx-2.2.3~dfsg/debian/rules 2019-01-20 20:46:53.000000000 +0000 +++ mixxx-2.2.4~dfsg/debian/rules 2020-08-13 15:54:17.000000000 +0000 @@ -46,15 +46,15 @@ scons $(SCONS_OPTS) -c || true rm -rf .sconf_temp/ cache/ linux_build/ dh_clean .sconsign.dblite cachecustom.py \ - config.log src/build.h build/*.pyc mixxx.1 + config.log src/build.h build/__pycache__/*.pyc mixxx.1 dh_auto_clean rm -rf lin*_build/ override_dh_auto_install: scons $(SCONS_OPTS) install find $(CURDIR)/debian/tmp \( -name COPYING -o -name Thumbs.db \ - -o -name shifter.sh -o -name '*.xsl' -o -name '*.php' \) \ - -exec rm -f {} \; + -o -name shifter.sh -o -name '*.xsl' -o -name '*.php' \ + -o -name LICENSE -o -name README \) -exec rm -f {} \; find $(CURDIR)/debian/tmp -name '*.js' -exec chmod -x {} \; find $(CURDIR)/debian/tmp/usr/share/mixxx/ -type f -exec chmod -x {} \; chrpath -d debian/tmp/usr/bin/mixxx \ diff -Nru mixxx-2.2.3~dfsg/.eslintignore mixxx-2.2.4~dfsg/.eslintignore --- mixxx-2.2.3~dfsg/.eslintignore 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/.eslintignore 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1 @@ +res/controllers/lodash.mixxx.js diff -Nru mixxx-2.2.3~dfsg/.eslintrc.json mixxx-2.2.4~dfsg/.eslintrc.json --- mixxx-2.2.3~dfsg/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/.eslintrc.json 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,52 @@ +{ + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 5, + "sourceType": "script" + }, + "rules": { + "array-bracket-spacing" : "warn", + "block-spacing": "warn", + "brace-style": ["warn", "1tbs", { + "allowSingleLine": true + }], + "camelcase": "warn", + "comma-spacing": "warn", + "computed-property-spacing" : ["warn", "never", { + "enforceForClassMembers": true + }], + "dot-location": "warn", + "eqeqeq": ["error", "always"], + "func-style": ["error", "expression", { + "allowArrowFunctions": true + }], + "indent": ["warn", 4], + "key-spacing": "warn", + "keyword-spacing": "warn", + "linebreak-style": ["warn", "unix"], + "no-trailing-spaces": "warn", + "no-unneeded-ternary": ["warn", { + "defaultAssignment": false + }], + "no-unused-vars": ["error", { + "argsIgnorePattern": "^_" + }], + "object-curly-newline" : ["warn", { + "consistent": true, + "multiline": true + }], + "object-curly-spacing" : "warn", + "quotes": ["warn", "double"], + "require-atomic-updates": "error", + "semi": "warn", + "semi-spacing": "warn", + "space-before-blocks": ["warn", "always"], + "space-before-function-paren": ["warn", "never"], + "space-in-parens": "warn" + }, + "globals": { + "console": "writable", + "svg": "writable", + "print": "readonly" + } +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/autogen.sh mixxx-2.2.4~dfsg/lib/libshout/autogen.sh --- mixxx-2.2.3~dfsg/lib/libshout/autogen.sh 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/autogen.sh 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,116 @@ +#!/bin/sh +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) + +package="libshout" + +olddir=`pwd` +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +cd "$srcdir" +DIE=0 + +echo "checking for autoconf... " +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9]\.[0-9]*\).*/\1/" +VERSIONMKINT="sed -e s/[^0-9]//" + +# do we need automake? +if test -r Makefile.am; then + AM_OPTIONS=`fgrep AUTOMAKE_OPTIONS Makefile.am` + AM_NEEDED=`echo $AM_OPTIONS | $VERSIONGREP` + if test "$AM_NEEDED" = "$AM_OPTIONS"; then + AM_NEEDED="" + fi + if test -z $AM_NEEDED; then + echo -n "checking for automake... " + AUTOMAKE=automake + ACLOCAL=aclocal + if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then + echo "yes" + else + echo "no" + AUTOMAKE= + fi + else + echo -n "checking for automake $AM_NEEDED or later... " + for am in automake-$AM_NEEDED automake$AM_NEEDED automake; do + ($am --version < /dev/null > /dev/null 2>&1) || continue + ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` + verneeded=`echo $AM_NEEDED | $VERSIONMKINT` + if test $ver -ge $verneeded; then + AUTOMAKE=$am + echo $AUTOMAKE + break + fi + done + test -z $AUTOMAKE && echo "no" + echo -n "checking for aclocal $AM_NEEDED or later... " + for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED aclocal; do + ($ac --version < /dev/null > /dev/null 2>&1) || continue + ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP | $VERSIONMKINT` + verneeded=`echo $AM_NEEDED | $VERSIONMKINT` + if test $ver -ge $verneeded; then + ACLOCAL=$ac + echo $ACLOCAL + break + fi + done + test -z $ACLOCAL && echo "no" + fi + test -z $AUTOMAKE || test -z $ACLOCAL && { + echo + echo "You must have automake installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + exit 1 + } +fi + +echo -n "checking for libtool... " +for LIBTOOLIZE in libtoolize glibtoolize nope; do + ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break +done +if test x$LIBTOOLIZE = xnope; then + echo "nope." + LIBTOOLIZE=libtoolize +else + echo $LIBTOOLIZE +fi +($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have libtool installed to compile $package." + echo "Download the appropriate package for your system," + echo "or get the source from one of the GNU ftp sites" + echo "listed in http://www.gnu.org/order/ftp.html" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +echo "Generating configuration files for $package, please wait...." + +ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4" +echo " $ACLOCAL $ACLOCAL_FLAGS" +$ACLOCAL $ACLOCAL_FLAGS || exit 1 +echo " autoheader" +autoheader || exit 1 +echo " $LIBTOOLIZE --automake" +$LIBTOOLIZE --automake || exit 1 +echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" +$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 +echo " autoconf" +autoconf || exit 1 + +cd $olddir +#$srcdir/configure "$@" && echo diff -Nru mixxx-2.2.3~dfsg/lib/libshout/config.h mixxx-2.2.4~dfsg/lib/libshout/config.h --- mixxx-2.2.3~dfsg/lib/libshout/config.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/config.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,217 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef __CONFIG_H__ +#define __CONFIG_H__ 1 + +/* Define if you have the C99 integer types */ +#define HAVE_C99_INTTYPES 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `endhostent' function. */ +#define HAVE_ENDHOSTENT 1 + +/* Define to 1 if you have the `ftime' function. */ +#define HAVE_FTIME 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define if you have the getnameinfo function */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `inet_aton' function. */ +#define HAVE_INET_ATON 1 + +/* Define to 1 if you have the `inet_pton' function. */ +#define HAVE_INET_PTON 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define if you have the nanosleep function */ +#define HAVE_NANOSLEEP 1 + +/* Define if you have libogg installed */ +#define HAVE_OGG 1 + +/* Define if you have libopenssl. */ +#define HAVE_OPENSSL 1 + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Define to 1 if you have the `pthread_spin_lock' function. */ +#define HAVE_PTHREAD_SPIN_LOCK 1 + +/* Define if you have the sethostent function */ +#define HAVE_SETHOSTENT 1 + +/* Define to 1 if the system has the type `socklen_t'. */ +#define HAVE_SOCKLEN_T 1 + +/* Define if you want speex streams supported */ +#define HAVE_SPEEX 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define if you want theora streams supported */ +#define HAVE_THEORA 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define if you have winsock2.h on MINGW */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the `writev' function. */ +#define HAVE_WRITEV 1 + +/* Shout library major version */ +#define LIBSHOUT_MAJOR 2 + +/* Shout library patch version */ +#define LIBSHOUT_MICRO 1 + +/* Shout library minor version */ +#define LIBSHOUT_MINOR 4 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define if you don't want to use the thread library */ +/* #undef NO_THREAD */ + +/* Name of package */ +#define PACKAGE "libshout" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "icecast-dev@xiph.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libshout" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libshout 2.4.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libshout" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.4.1" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The size of `int', as computed by sizeof. */ +/* #undef SIZEOF_INT */ + +/* The size of `long', as computed by sizeof. */ +/* #undef SIZEOF_LONG */ + +/* The size of `long long', as computed by sizeof. */ +/* #undef SIZEOF_LONG_LONG */ + +/* The size of `short', as computed by sizeof. */ +/* #undef SIZEOF_SHORT */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "2.4.1" + +#ifndef HAVE_C99_INTTYPES +# if SIZEOF_SHORT == 4 +typedef unsigned short uint32_t; +# elif SIZEOF_INT == 4 +typedef unsigned int uint32_t; +# elif SIZEOF_LONG == 4 +typedef unsigned long uint32_t; +# endif +# if SIZEOF_INT == 8 +typedef unsigned int uint64_t; +# elif SIZEOF_LONG == 8 +typedef unsigned long uint64_t; +# elif SIZEOF_LONG_LONG == 8 +typedef unsigned long long uint64_t; +# endif +#endif + + +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif + + +/* Define if you have POSIX and GNU specifications */ +#define _GNU_SOURCE /**/ + +/* Define if you have POSIX and XPG specifications */ +#define _XOPEN_SOURCE 600 + + +/* name mangling to protect code we share with other libraries */ +#define _mangle(proc) _shout_ ## proc + + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* define if va_copy is not available */ +/* #undef va_copy */ + +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/configure.ac mixxx-2.2.4~dfsg/lib/libshout/configure.ac --- mixxx-2.2.3~dfsg/lib/libshout/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/configure.ac 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,230 @@ +# Process this file with autoconf to produce a configure script. +# $Id$ + +m4_define(libshout_major, 2) +m4_define(libshout_minor, 4) +m4_define(libshout_micro, 1) +m4_define(libshout_version, libshout_major.libshout_minor.libshout_micro) + +AC_INIT([libshout], libshout_version, [icecast-dev@xiph.org]) +AC_PREREQ([2.54]) +AC_CONFIG_SRCDIR([src/shout.c]) +AM_CONFIG_HEADER(config.h) +# config.h guard +AH_TOP([#ifndef __CONFIG_H__ +#define __CONFIG_H__ 1]) +AH_BOTTOM([#endif]) + +AC_DEFINE([LIBSHOUT_MAJOR], libshout_major, [Shout library major version]) +AC_DEFINE([LIBSHOUT_MINOR], libshout_minor, [Shout library minor version]) +AC_DEFINE([LIBSHOUT_MICRO], libshout_micro, [Shout library patch version]) + +VERSION=libshout_version + +AM_INIT_AUTOMAKE([libshout], libshout_version) +AM_MAINTAINER_MODE + +dnl create our name mangling macro +dnl the prefix must be hardwired because of AH limitations +AH_VERBATIM([_mangle], [ +/* name mangling to protect code we share with other libraries */ +#define _mangle(proc) _shout_ ## proc +]) + +AC_PROG_CC +AM_PROG_LIBTOOL + +dnl Set some options based on environment + +dnl openbsd headers break when _XOPEN_SOURCE is defined but without it seems +dnl to be fine +case "$ac_cv_host" in + *openbsd* | *solaris* | *irix*) + ;; + *) AC_DEFINE(_XOPEN_SOURCE, 600, [Define if you have POSIX and XPG specifications]) + ;; +esac +if test -z "$GCC"; then + case $host in + *-*-irix*) + DEBUG="-g -signed" + CFLAGS="-O2 -w -signed" + PROFILE="-p -g3 -O2 -signed" + ;; + sparc-sun-solaris*) + DEBUG="-v -g" + CFLAGS="-xO4 -fast -w -fsimple -native -xcg92" + PROFILE="-v -xpg -g -xO4 -fast -native -fsimple -xcg92 -Dsuncc" + ;; + *) + DEBUG="-g" + CFLAGS="-O" + PROFILE="-g -p" + ;; + esac +else + XIPH_CFLAGS="-Wall -ffast-math -fsigned-char" + AC_DEFINE(_GNU_SOURCE, ,[Define if you have POSIX and GNU specifications]) + DEBUG="-g" + PROFILE="-pg -g" +fi + +dnl Checks for programs. + +dnl Checks for header files. +AC_HEADER_STDC +AC_HEADER_TIME +AC_CHECK_HEADERS([strings.h sys/timeb.h]) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +XIPH_C99_INTTYPES + +dnl Checks for library functions. +AC_CHECK_FUNCS([gettimeofday ftime]) +AC_SEARCH_LIBS([nanosleep], [rt], + [AC_DEFINE([HAVE_NANOSLEEP], [1], + [Define if you have the nanosleep function])]) + +dnl Module checks +XIPH_NET + +dnl Extra dependencies +AC_ARG_ENABLE([thread], + AC_HELP_STRING([--disable-thread],[do not build with thread support even if it is available])) + +SHOUT_THREADSAFE="0" +if test "$enable_thread" != "no" +then + ACX_PTHREAD([ + LIBS="$LIBS $PTHREAD_LIBS" + XIPH_CFLAGS="$XIPH_CFLAGS $PTHREAD_CFLAGS $PTHREAD_CPPFLAGS" + CC="$PTHREAD_CC" + SHOUT_THREADSAFE="1" + ]) +fi +AC_SUBST([SHOUT_THREADSAFE]) +AM_CONDITIONAL([HAVE_THREAD], [test "$SHOUT_THREADSAFE" = "1"]) +if test "$SHOUT_THREADSAFE" != "1" +then + AC_DEFINE([NO_THREAD], 1, [Define if you don't want to use the thread library]) +fi + +SHOUT_REQUIRES="ogg" + +PKG_CHECK_MODULES(VORBIS, vorbis, [ + HAVE_VORBIS="yes" + SHOUT_REQUIRES="$SHOUT_REQUIRES, vorbis" + ], [ + XIPH_PATH_VORBIS(, [AC_MSG_ERROR([required Ogg Vorbis library not found])]) + ]) +VORBIS_LIBS="$VORBIS_LDFLAGS $VORBIS_LIBS" +XIPH_CFLAGS="$XIPH_CFLAGS $VORBIS_CFLAGS" + +AC_ARG_ENABLE([theora], + AC_HELP_STRING([--disable-theora],[do not build with Theora support])) + +if test "x$enable_theora" != "xno"; then +PKG_CHECK_MODULES(THEORA, theora, [ + HAVE_THEORA="yes" + SHOUT_REQUIRES="$SHOUT_REQUIRES, theora" + ], [ + XIPH_PATH_THEORA(, [AC_MSG_WARN([Theora library not found, disabling])]) + ]) +fi +XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$THEORA_CFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$THEORA LDFLAGS $THEORA_LIBS]) +AM_CONDITIONAL([HAVE_THEORA], [test -n "$THEORA_LIBS"]) +if test -n "$THEORA_LIBS" +then + AC_DEFINE([HAVE_THEORA], 1, [Define if you want theora streams supported]) +fi + +AC_ARG_ENABLE([speex], + AC_HELP_STRING([--disable-speex],[do not build with Speex support])) + +if test "x$enable_speex" != "xno"; then +PKG_CHECK_MODULES(SPEEX, speex, [ + HAVE_SPEEX="yes" + SHOUT_REQUIRES="$SHOUT_REQUIRES, speex" + ], [ + XIPH_PATH_SPEEX(, [AC_MSG_WARN([Speex library not found, disabling])]) + ]) +fi +XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$SPEEX_CFLAGS]) +XIPH_VAR_PREPEND([XIPH_LIBS],[$SPEEX LDFLAGS $SPEEX_LIBS]) +AM_CONDITIONAL([HAVE_SPEEX], [test -n "$SPEEX_LIBS"]) +if test -n "$SPEEX_LIBS" +then + AC_DEFINE([HAVE_SPEEX], 1, [Define if you want speex streams supported]) +fi + +dnl If pkgconfig is found, install a shout.pc file. + +AC_ARG_ENABLE([pkgconfig], + AC_HELP_STRING([--disable-pkgconfig],[disable pkgconfig data files (auto)]), + [dopkgconfig="$enableval"], [dopkgconfig="maybe"]) +if test "$dopkgconfig" = "maybe" +then + AC_CHECK_PROG([PKGCONFIG], [pkg-config], [yes], [no]) +else + AC_MSG_CHECKING([whether pkgconfig should be used]) + PKGCONFIG="$dopkgconfig" + AC_MSG_RESULT([$PKGCONFIG]) +fi +AM_CONDITIONAL([HAVE_PKGCONFIG], [test "$PKGCONFIG" != "no"]) + +# Collect flags for shout.pc + +# I hate myself for doing this. +save_prefix="$prefix" +if test "$prefix" = "NONE" +then + prefix="$ac_default_prefix" +fi +eval shout_includedir="$includedir" +prefix="$save_prefix" + +XIPH_PATH_OPENSSL([ + XIPH_VAR_APPEND([XIPH_CPPFLAGS],[$OPENSSL_CFLAGS]) + XIPH_VAR_APPEND([XIPH_LDFLAGS],[$OPENSSL_LDFLAGS]) + XIPH_VAR_PREPEND([XIPH_LIBS],[$OPENSSL_LIBS]) + SHOUT_TLS="1" + ], + [ AC_MSG_NOTICE([SSL disabled!]) + SHOUT_TLS="0" + ]) +AC_SUBST([SHOUT_TLS]) +AM_CONDITIONAL([HAVE_TLS], [test -n "$OPENSSL_LIBS"]) + +SHOUT_VERSION="$VERSION" +SHOUT_CPPFLAGS="-I$shout_includedir $VORBIS_CFLAGS $PTHREAD_CPPFLAGS" +SHOUT_CFLAGS="$PTHREAD_CFLAGS" +SHOUT_LIBS="-lshout" + +XIPH_CLEAN_CCFLAGS([$SHOUT_CPPFLAGS], [SHOUT_CPPFLAGS]) +XIPH_CLEAN_CCFLAGS([$SHOUT_CFLAGS], [SHOUT_CFLAGS]) +XIPH_CLEAN_CCFLAGS([$VORBIS_LIBS $THEORA_LIBS $SPEEX_LIBS $PTHREAD_LIBS $OPENSSL_LIBS $OPENSSL_LIBS $LIBS], [SHOUT_LIBDEPS]) +AC_SUBST(PTHREAD_CPPFLAGS) +AC_SUBST(SHOUT_LIBDEPS) +AC_SUBST(SHOUT_REQUIRES) +AC_SUBST(SHOUT_CPPFLAGS) +AC_SUBST(SHOUT_CFLAGS) + +dnl Make substitutions + +AC_SUBST(LIBTOOL_DEPS) +AC_SUBST(OPT) +AC_SUBST(LIBS) +AC_SUBST(DEBUG) +AC_SUBST(CFLAGS) +AC_SUBST(PROFILE) +AC_SUBST(XIPH_CFLAGS) +AC_SUBST(XIPH_CPPFLAGS) +AC_SUBST(XIPH_LIBS) + +AC_OUTPUT([Makefile include/Makefile include/shout/Makefile + include/shout/shout.h src/Makefile src/common/net/Makefile src/common/timing/Makefile + src/common/thread/Makefile src/common/avl/Makefile src/common/httpp/Makefile doc/Makefile + examples/Makefile win32/Makefile shout.pc]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/COPYING mixxx-2.2.4~dfsg/lib/libshout/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/doc/libshout.xml mixxx-2.2.4~dfsg/lib/libshout/doc/libshout.xml --- mixxx-2.2.3~dfsg/lib/libshout/doc/libshout.xml 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/doc/libshout.xml 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,1307 @@ + + + +Programming With Libshout 2 + + + Xiph.org + $Id: libshout.xml,v 1.5 2003/07/10 01:46:24 brendan Exp $ + 09 September 2015 + + +Overview + + +libshout is a library for streaming audio to icecast or shoutcast-compatible +servers. Currently it supports three formats and three protocols. + + +Audio Formats + Ogg (audio any video with different codecs) + WebM (audio and video) + MP3 + + +Protocols + HTTP + RoarAudio + Audiocast + ShoutCast + + + + +Reference + +
Functions + +
Global functions + + + + void shout_init + + + + +Initializes the shout library. Currently this initializes the networking +mutexes when the library is built with thread safety. This function must +always be called before any other libshout function. + + + + + void shout_shutdown + + + + +Releases any resources which may have been allocated by a call to +shout_init. An +application should call this function after it has finished using libshout. + + + + + const char *shout_version + int *major + int *minor + int *patch + + + +Returns the version of the libshout library, both as a string via the +return value, and as a set of integers corresponding to the major, +minor and patch levels of the library. The application must allocate +the integer parameters. If any parameter is NULL, libshout will not +attempt to set it. + + +
+ +
Managing connections + + + + shout_t *shout_new + + + + +Allocates a new shout_t structure. May return NULL if no memory +is available. The result should be disposed of with +shout_free when you are +finished with it. + + + + + void shout_free + shout_t *self + + + +Frees a shout_t allocated by +shout_new. + + + + + int shout_open + shout_t *self + + + +Opens a connection to a server. All connection parameters must have been +set prior to this call. + +Return Values + + SHOUTERR_SUCCESS + The connection was successfully opened. + + + + SHOUTERR_INSANE + self is corrupt or incorrect. Possible reasons + include an unset host, port, or password. + + + + SHOUTERR_CONNECTED + The connection has already been opened. + + + + SHOUTERR_UNSUPPORTED + The protocol/format combination is unsupported. For instance, + Ogg Vorbis may only be sent via the HTTP protocol. + + + + SHOUTERR_NOCONNECT + A connection to the server could not be established. + + + + SHOUTERR_SOCKET + An error occured while talking to the server. + + + + SHOUTERR_NOLOGIN + The server refused login, probably because authentication + failed. + + + + SHOUTERR_MALLOC + There wasn't enough memory to complete the operation. + + + + + + int shout_close + shout_t *self + + + +Closes a connection to the server. + + +Return Values + + SHOUTERR_SUCCESS + The connection was successfully closed. + + + + SHOUTERR_INSANE + self is not a valid shout_t + object. + + + + SHOUTERR_UNCONNECTED + self is not currently connected. + + + + + + int shout_get_connected + shout_t *self + + + +Returns the connection status of the given shout_t object. + + +Return Values + + SHOUTERR_INSANE + self is not a valid shout_t + object. + + + + SHOUTERR_UNCONNECTED + self is not currently connected. + + + + SHOUTERR_CONNECTED + self is currently connected. + + + + + + const char *shout_get_error + shout_t *self + + + +Returns a statically allocated string describing the last shout error +that occured in this connection. Only valid until the next call affecting +this connection. + + + + + int shout_get_errno + shout_t *self + + + +Returns the shout error code of the last error that occured in this connection. + + +
+ +
Sending data + + + + int shout_send + shout_t *self + const unsigned char *data> + size_t len + + + +Sends len bytes of audio data from the buffer pointed to by +data to the server. The connection must already have been +established by a successful call to +shout_open. + + +Return Values + + SHOUTERR_SUCCESS + The audio data was sent successfully. + + + + SHOUTERR_INSANE + self is not a valid shout_t + object. + + + + SHOUTERR_UNCONNECTED + self is not currently connected. + + + + SHOUTERR_MALLOC + There wasn't enough memory to complete the operation. + + + + SHOUTERR_SOCKET + An error occured while talking to the server. + + + + + + ssize_t shout_send_raw + shout_t *self + const unsigned char *data> + size_t len + + + +Sends len bytes of audio data from the buffer pointed to by +data to the server. The data is not parsed for timing +or validity, but sent raw over the connection. The connection must already have been +established by a successful call to +shout_open. + +This function should not be used unless you know exactly what you +are doing. Its use is deprecated and it may be removed in a future version of +the library. + +Return Values + + >= 0 + The number of bytes written. + + + + SHOUTERR_INSANE + self is not a valid shout_t + object. + + + + SHOUTERR_UNCONNECTED + self is not currently connected. + + + + SHOUTERR_SOCKET + An error occured while talking to the server. + + + + + + void shout_sync + shout_t *self + + + +Causes the caller to sleep for the amount of time necessary to play back +audio sent since the last call to shout_sync. Should +be called before every call to +shout_send to +ensure that audio data is sent to the server at the correct speed. +Alternatively, the caller may use +shout_delay to +determine the number of milliseconds to wait and delay itself. + + + + + int shout_delay + shout_t *self + + + +Returns the number of milliseconds the caller should wait before calling +shout_send again. +This function is provided as an alternative to +shout_sync for +applications that may wish to do other processing in the meantime. + + + + + ssize_t shout_queuelen + shout_t *self + + + +Returns the number of bytes currently on the write queue. + +This is only useful in non-blocking mode. + +
+ +
Connection parameters + + +The following functions are used to get or set attributes of the +shout_t object before calling +shout_open. They all +work the same way: they operate on one attribute of a +shout_t*. The shout_get_* functions +return the value of their associated parameter, or 0 on error (that's +NULL for those functions that return strings). The +shout_set_* functions will return either +SHOUTERR_SUCCESS on success, or one of: + + + + SHOUTERR_INSANE - shout_t + is invalid. + SHOUTERR_MALLOC - libshout could not + allocate enough memory to assign the parameter. + SHOUTERR_CONNECTED - you are attempting + to change a connection attribute while the connection is open. Since these + parameters are only used when first opening the connection, this operation + would be useless. + + + + + int shout_set_nonblocking + shout_t *self + unsigned int nonblocking + + + +Sets non-blocking mode. The default is 0. + + + + + unsigned int shout_get_nonblocking + shout_t *self + + + +Returns non-blocking mode or 0 in case of error. + + + + + int shout_set_host + shout_t *self + const char *host + + + +Sets the server hostname or IP address. The default is localhost. + + + + + const char *shout_get_host + shout_t *self + + + +Returns the server hostname or IP address. + + + + + int shout_set_port + shout_t *self + unsigned short port + + + +Sets the server port. The default is 8000. + + + + + unsigned short shout_get_port + shout_t *self + + + +Returns the server port. + + + + + int shout_set_user + shout_t *self + const char *user + + + +Sets the user to authenticate as, for protocols that can use this parameter. +The default is source. + + + + + const char *shout_get_user + shout_t *self + + + +Returns the user name. + + + + + int shout_set_password + shout_t *self + const char *pass + + + +Sets the password to authenticate to the server with. This parameter +must be set. There is no default. + + + + + const char *shout_get_password + shout_t *self + + + +Returns the password. + + + + + int shout_set_protocol + shout_t *self + int protocol + + + +Set the protocol with which to connect to the server. Supported protocols +are listed in Protocol Constants. +The default is SHOUT_PROTOCOL_HTTP (compatible with +Icecast 2). + + + + + int shout_get_protocol + shout_t *self + + + +Returns the protocol used to connect to the server. + + + + + int shout_set_format + shout_t *self + int format + + + +Sets the audio format of this stream. The currently supported formats +are listed in Format Constants. +The default is SHOUT_FORMAT_OGG. + + + + + int shout_get_format + shout_t *self + + + +Returns the audio format used by this stream. + + + + + int shout_set_mount + shout_t *self + const char *mount + + + +Sets the mount point for this stream, for protocols that support this option +(SHOUT_PROTOCOL_ICY doesn't). + + + + + const char *shout_get_mount + shout_t *self + + + +Returns the stream mount point. + + + + + int shout_set_dumpfile + shout_t *self + const char *dumpfile + + + +If the server supports it, you can request that your stream be archived +on the server under the name dumpfile. This can quickly +eat a lot of disk space, so think twice before setting it. + + + + + const char *shout_get_dumpfile + shout_t *self + + + +Returns the dump file, if specified. + + + + + int shout_set_agent + shout_t *self + const char *agent + + + +Sets the user agent header. This is libshout/VERSION +by default. If you don't know what this function is for, don't use it. + + + + + const char *shout_get_agent + shout_t *self + + + +Returns the user agent. + + + + + int shout_set_tls + shout_t *self + int mode + + + +This function sets the TLS (Transport Layer Security) mode to use. +mode is a TLS mode. +This is SHOUT_TLS_AUTO by default. + +To force TLS on you should use SHOUT_TLS_AUTO_NO_PLAIN and +SHOUT_TLS_DISABLED to force TLS off. +While SHOUT_TLS_AUTO may connect via TLS this is not a +secure mode as everybody can do a man in the middle kind of attack and downgrade the +connection to plain. + + + + int shout_get_tls + shout_t *self + + + +Returns the currently used TLS mode. + + + + + int shout_set_ca_directory + shout_t *self + const char *directory + + + +This sets the CA directory used by libshout to verify server certificates. +Defaults to system defaults. + + + + + const char *shout_get_ca_directory + shout_t *self + + + +Returns the currently used CA directory. + + + + + int shout_set_ca_file + shout_t *self + const char *file + + + +Sets a file with CA certificates used to verify server certificates. +Defaults to system defaults. The file must be in PEM format. + +You can use this for self signed server certificates. +In this case you point this to the server certificate in PEM format. +Keep in mind that this will allow self-signed certificates but other +checks such as hostname still needs to verify correctly. + + + + const char *shout_get_ca_file + shout_t *self + + + +Returns the currently used CA file. + + + + + int shout_set_allowed_ciphers + shout_t *self + const char *ciphers + + + +This sets the list of currently allowed ciphers in OpenSSL format. +Defaults to a list of ciphers considerd secure as of day of release. + +Setting this to a insecure list may render encryption and authentication useless. +Any application using this call must expose this list to the user. +If the user can not alter this list your application will harm security badly by +preventing the user to get to a save value by setting it manually or upgrading +libshout. +Do not use this call if you don't know what you are doing. + + + + const char *shout_get_allowed_ciphers + shout_t *self + + + +Returns the currently used list of allowed ciphers. + + + + + int shout_set_client_certificate + shout_t *self + const char *certificate + + + +This sets the client certificate to be used. Defaults to none. +The file must be in PEM format and must contain both the certificate as well as the +private key for that certificate. + + + + + const char *shout_get_client_certificate + shout_t *self + + + +Returns the currently used client certificate. + + +
+ +
Directory parameters + + +The following parameters are optional. They are used to control whether +and how your stream will be listed in the server's stream directory (if available). + + + + + int shout_set_public + shout_t *self + int makepublic + + + +Setting this to 1 asks the server to list the stream in +any directories it knows about. To suppress listing, set this to +0. The default is 0. + + + + + int shout_get_public + shout_t *self + + + +Returns whether or not this stream is public. + + + + + int shout_set_meta + shout_t *self + const char *name + const char *value + + + +This function sets the meta data for the stream. + + + + + const char *shout_get_meta + shout_t *self + const char *name + + + +This function gets the meta data for the stream. + + + + + int shout_set_audio_info + shout_t *self + const char *name + const char *value + + + +Sets a stream audio parameter (eg bitrate, samplerate, channels or quality). +The currently defined parameters are listed in the +Audio Info Constants section, but +you are free to add additional fields if your directory server understands them. + + + + + const char *shout_get_audio_info + shout_t *self + const char *name + + + +Returns the value of the audio info field name, if defined. + + +
+ +
Metadata + +These functions currently only make sense for MP3 streams. Vorbis streams are expected +to embed metadata as vorbis comments in the audio stream. + + + + + shout_metadata_t *shout_metadata_new + + + + +Allocates a new metadata structure, or returns NULL if no memory is available. The +returned structure should be freed with +shout_metadata_free when you are done with +it. + + + + + void shout_metadata_free + shout_metadata_t *self + + + +Frees any resources associated with self. + + + + + int shout_metadata_add + shout_metadata_t *self + const char *name + const char *value + + + +Add metadata value value to self, under the +key name. You'll probably want to set name +to "song", though "url" may also be +useful. + + +Return Values + + SHOUTERR_SUCCESS + The metadata was copied into self. + + + + SHOUTERR_INSANE + self is not a valid shout_metadata_t object. + + + + SHOUTERR_MALLOC + Couldn't allocate enough memory to copy the metadata. + + + + + + int shout_set_metadata + shout_t *self + shout_metadata_t *metadata + + + +Sets metadata on the connection self to metadata. +Only MP3 streams support this type of metadata update. You may use this function +on defined but closed connections (this is useful if you simply want to set the +metadata for a stream provided by another process). + + +Return Values + + SHOUTERR_SUCCESS + Metadata was updated successfully. + + + + SHOUTERR_INSANE + self and/or metadata is invalid. + + + + SHOUTERR_MALLOC + Couldn't allocate enough memory to complete the operation. + + + + SHOUTERR_NOCONNECT + The server refused the connection attempt. + + + + SHOUTERR_NOLOGIN + The server did not accept your authorization credentials. + + + + SHOUTERR_SOCKET + An error occured talking to the server. + + + + SHOUTERR_METADATA + The server returned any other error (eg bad mount point). + + + +
+ +
Obsolate metadata Interface + +All those functions have been replaced by shout_set_meta and +shout_get_meta. They may be removed by newer versions of this library. + + + + + int shout_set_name + shout_t *self + const char *name + + + +Sets the name of the stream. + + + + + const char *shout_get_name + shout_t *self + + + +Returns the stream name. + + + + + int shout_set_url + shout_t *self + const char *url + + + +Sets the URL of a site about this stream. + + + + + const char *shout_get_url + shout_t *self + + + +Returns the stream URL. + + + + + int shout_set_genre + shout_t *self + const char *genre + + + +Sets the genre (or genres) of the stream. This is usually a keyword list, +eg "pop rock rap". + + + + + const char *shout_get_genre + shout_t *self + + + +Returns the stream genre. + + + + + int shout_set_description + shout_t *self + const char *description + + + +Sets the description of this stream. + + + + + const char *shout_get_description + shout_t *self + + + +Returns the stream description. + + +
+ +
+ +
Data Types + + + + shout_t + Opaque data type that refers to a single server connection. + + + + shout_metadata_t + Opaque data type that refers to a set of metadata attributes. Currently + the only defined attribute is song. + + + +
+ +
Constants + +Error Codes + + SHOUTERR_SUCCESS + Indicates success. + + + + SHOUTERR_INSANE + Indicates bad parameters, either nonsense or not applicable due to the current + state of the connection. + + + + SHOUTERR_MALLOC + Indicates the function could not allocate the memory it required. + + + + SHOUTERR_NOCONNECT + Indicates a connection with the server could not be established. + + + + SHOUTERR_NOLOGIN + Indicates the server refused to accept a login attempt. This could be caused + by a bad user name or password. + + + + SHOUTERR_SOCKET + Indicates an error sending or receiving data. + + + + SHOUTERR_METADATA + Indicates an error updating metadata on the server. + + + + SHOUTERR_CONNECTED + Indicates that, while connected, you attempted to call a function which only makes + sense before connection (eg you attempted to set the user name or stream name). + + + + SHOUTERR_UNCONNECTED + Indicates that you attempted to use a function that requires an open connection + (for example, shout_send) while you were not connected. + + + + SHOUTERR_UNSUPPORTED + Indicates that you attempted to use a function which is unsupported in the + state of your connection. For example, attempting to set metadata while using the + Ogg Vorbis format is unsupported. + + + + SHOUTERR_BUSY + Indicates that the socket is busy. The funtion returning this should be + called again later. This is likely to happen in non-blocking mode but may also happen + in blocking mode. + + + + SHOUTERR_NOTLS + TLS (Transport Layer Security) was requested via shout_set_tls + but is not supported by the server. + + + + SHOUTERR_TLSBADCERT + A TLS (Transport Layer Security) connection has been established but the server + returned a certificate which failed the check. The certificate may be invalid or + is not signed by a trusted CA. See shout_set_tls. + + + + SHOUTERR_RETRY + The caller should retry this call later. + + + +Formats + + SHOUT_FORMAT_OGG + The Ogg Format. Vorbis or any codec may be used. This is the default format. + + + + SHOUT_FORMAT_WEBM + The WebM format. + + + + SHOUT_FORMAT_WEBMAUDIO + The WebM format, audio only streams. + + + + SHOUT_FORMAT_VORBIS + This is deprecated. It is an alias to SHOUT_FORMAT_OGG. + Please migrate your code. + + + + SHOUT_FORMAT_MP3 + The MP3 format. + + + +Protocols + + SHOUT_PROTOCOL_HTTP + The HTTP protocol. This is the native protocol of the + Icecast 2 server, and is the default. + + + + SHOUT_PROTOCOL_ROARAUDIO + The RoarAudio protocol. This is the native protocol for + RoarAudio servers. + + + + SHOUT_PROTOCOL_XAUDIOCAST + The Audiocast format. This is the native protocol of + Icecast 1. + + + + SHOUT_PROTOCOL_ICY + The ShoutCast format. This is the native protocol of + ShoutCast. + + + +Audio Parameters + + SHOUT_AI_BITRATE + Used to specify the nominal bitrate of the stream. + + + + SHOUT_AI_SAMPLERATE + Used to specify the samplerate of the stream. + + + + SHOUT_AI_CHANNELS + Used to specify the number of channels (usually one or two). + + + + SHOUT_AI_QUALITY + Used to specify the Ogg Vorbis encoding quality of the stream. + + + +Stream Metadata Parameters + + SHOUT_META_NAME + Sets stream name. + + + + SHOUT_META_URL + Sets stream URL. + + + + SHOUT_META_GENRE + Sets stream genre. + + + + SHOUT_META_DESCRIPTION + Sets stream description. + + + + SHOUT_META_IRC + Sets IRC contact information for stream. + + + + SHOUT_META_AIM + Sets AIM contact information for stream. + + + + SHOUT_META_ICQ + Sets ICQ contact information for stream. + + + +TLS modes + + SHOUT_TLS_DISABLED + TLS (Transport Layer Security) is disabled. + Passwords and data will be sent unencrypted. + + + + SHOUT_TLS_AUTO + TLS (Transport Layer Security) support by the server will be autodetected. This is the default. + In this mode TLS is used if supported by the server. + Please note that this is not a secure mode as it will + not prevent any downgrade attacks. SHOUT_TLS_AUTO_NO_PLAIN is a more secure version of + this mode. + + + + + SHOUT_TLS_AUTO_NO_PLAIN + TLS (Transport Layer Security) is used. Autodetection is used to find out about which modes + are supported by the server. This mode should be used for secure connections. + + + + SHOUT_TLS_RFC2818 + TLS (Transport Layer Security) is used as defined by RFC2818. + In this mode libshout expects a TLS socket on the server side and will begin with a TLS handshake + prior to any other communication. + + + + + SHOUT_TLS_RFC2817 + TLS (Transport Layer Security) is used as defined by RFC2817. + In this mode libshout will use HTTP/1.1's Upgrade:-process to switch to TLS. + This allows to use TLS on a non-TLS socket of the server. + + + +
+ +
+ +
diff -Nru mixxx-2.2.3~dfsg/lib/libshout/doc/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/doc/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/doc/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/doc/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,3 @@ +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = spec-html.xsl libshout.xml diff -Nru mixxx-2.2.3~dfsg/lib/libshout/doc/spec-html.xsl mixxx-2.2.4~dfsg/lib/libshout/doc/spec-html.xsl --- mixxx-2.2.3~dfsg/lib/libshout/doc/spec-html.xsl 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/doc/spec-html.xsl 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,4 @@ + + + + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/examples/example.c mixxx-2.2.4~dfsg/lib/libshout/examples/example.c --- mixxx-2.2.3~dfsg/lib/libshout/examples/example.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/examples/example.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,86 @@ +/* example.c: Demonstration of the libshout API. + * $Id$ + */ + +#include +#include +#include + +#include + +int main() +{ + shout_t *shout; + unsigned char buff[4096]; + long read, ret, total; + + shout_init(); + + if (!(shout = shout_new())) { + printf("Could not allocate shout_t\n"); + return 1; + } + + if (shout_set_host(shout, "127.0.0.1") != SHOUTERR_SUCCESS) { + printf("Error setting hostname: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_protocol(shout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) { + printf("Error setting protocol: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_port(shout, 8000) != SHOUTERR_SUCCESS) { + printf("Error setting port: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_password(shout, "hackme") != SHOUTERR_SUCCESS) { + printf("Error setting password: %s\n", shout_get_error(shout)); + return 1; + } + if (shout_set_mount(shout, "/example.ogg") != SHOUTERR_SUCCESS) { + printf("Error setting mount: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_user(shout, "source") != SHOUTERR_SUCCESS) { + printf("Error setting user: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_format(shout, SHOUT_FORMAT_OGG) != SHOUTERR_SUCCESS) { + printf("Error setting user: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_open(shout) == SHOUTERR_SUCCESS) { + printf("Connected to server...\n"); + total = 0; + while (1) { + read = fread(buff, 1, sizeof(buff), stdin); + total = total + read; + + if (read > 0) { + ret = shout_send(shout, buff, read); + if (ret != SHOUTERR_SUCCESS) { + printf("DEBUG: Send error: %s\n", shout_get_error(shout)); + break; + } + } else { + break; + } + + shout_sync(shout); + } + } else { + printf("Error connecting: %s\n", shout_get_error(shout)); + } + + shout_close(shout); + + shout_shutdown(); + + return 0; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/examples/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/examples/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/examples/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/examples/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,14 @@ +## Process this file with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +noinst_PROGRAMS = example nonblocking + +example_SOURCES = example.c +example_LDADD = $(top_builddir)/src/libshout.la @SHOUT_LIBDEPS@ + +nonblocking_SOURCES = nonblocking.c +nonblocking_LDADD = $(top_builddir)/src/libshout.la @SHOUT_LIBDEPS@ + +AM_CFLAGS = @XIPH_CFLAGS@ +AM_CPPFLAGS = @XIPH_CPPFLAGS@ -I$(top_builddir)/include diff -Nru mixxx-2.2.3~dfsg/lib/libshout/examples/nonblocking.c mixxx-2.2.4~dfsg/lib/libshout/examples/nonblocking.c --- mixxx-2.2.3~dfsg/lib/libshout/examples/nonblocking.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/examples/nonblocking.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,108 @@ +/* -*- c-basic-offset: 8; -*- + * example.c: Demonstration of the libshout API. + * $Id$ + */ + +#include +#include +#include +#include + +#include + +int main() +{ + shout_t *shout; + unsigned char buff[4096]; + long read, ret, total; + + shout_init(); + + if (!(shout = shout_new())) { + printf("Could not allocate shout_t\n"); + return 1; + } + + if (shout_set_host(shout, "127.0.0.1") != SHOUTERR_SUCCESS) { + printf("Error setting hostname: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_protocol(shout, SHOUT_PROTOCOL_HTTP) != SHOUTERR_SUCCESS) { + printf("Error setting protocol: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_port(shout, 8000) != SHOUTERR_SUCCESS) { + printf("Error setting port: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_password(shout, "hackme") != SHOUTERR_SUCCESS) { + printf("Error setting password: %s\n", shout_get_error(shout)); + return 1; + } + if (shout_set_mount(shout, "/example.ogg") != SHOUTERR_SUCCESS) { + printf("Error setting mount: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_user(shout, "source") != SHOUTERR_SUCCESS) { + printf("Error setting user: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_format(shout, SHOUT_FORMAT_OGG) != SHOUTERR_SUCCESS) { + printf("Error setting user: %s\n", shout_get_error(shout)); + return 1; + } + + if (shout_set_nonblocking(shout, 1) != SHOUTERR_SUCCESS) { + printf("Error setting non-blocking mode: %s\n", shout_get_error(shout)); + return 1; + } + + ret = shout_open(shout); + if (ret == SHOUTERR_SUCCESS) + ret = SHOUTERR_CONNECTED; + + if (ret == SHOUTERR_BUSY) + printf("Connection pending...\n"); + + while (ret == SHOUTERR_BUSY) { + usleep(10000); + ret = shout_get_connected(shout); + } + + if (ret == SHOUTERR_CONNECTED) { + printf("Connected to server...\n"); + total = 0; + while (1) { + read = fread(buff, 1, sizeof(buff), stdin); + total = total + read; + + if (read > 0) { + ret = shout_send(shout, buff, read); + if (ret != SHOUTERR_SUCCESS) { + printf("DEBUG: Send error: %s\n", shout_get_error(shout)); + break; + } + } else { + break; + } + if (shout_queuelen(shout) > 0) + printf("DEBUG: queue length: %d\n", + (int)shout_queuelen(shout)); + + shout_sync(shout); + } + } else { + printf("Error connecting: %s\n", shout_get_error(shout)); + } + + shout_close(shout); + + shout_shutdown(); + + return 0; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/HACKING mixxx-2.2.4~dfsg/lib/libshout/HACKING --- mixxx-2.2.3~dfsg/lib/libshout/HACKING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/HACKING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,48 @@ +Note that these instructions are *not* necessary for distribution +tarballs; they have separate configure/build instructions. + +Building this package from subversion is mainly intended for developers. +General users should obtain official distribution packages; both +source and binary distributions are available at +http://www.icecast.org/ + +----- + +These are *brief* instructions on how to build this package from subversion. +Yes, there are details left out. + +There are generally four steps necessary when building from subversion (i.e., +a developer's copy): + +1. svn checkout of the sources, or svn update. RTFM from your + favorite flavor of svn documentation; information on the xiph.org + svn repository can be found at http://www.xiph.org/svn/. + +2. [re-]generate files such as "configure" and "Makefile.in" with the + GNU autoconf/automake tools. Run the "autogen.sh" script to + perform this step. + + *** IF YOU ARE NOT BUILDING WITH GNU MAKE *AND* GCC: you must set + the AUTOMAKE_FLAGS environment variable to "--include-deps" + before running autogen.sh. For example: + + csh% setenv AUTOMAKE_FLAGS --include-deps + csh% ./autogen.sh + or + sh% AUTOMAKE_FLAGS=--include-deps ./autogen.sh + +3. Run configure. There are several options available; see + "./configure --help" for more information. + +4. Run "make" to build the source. + +In general, steps 2 and 3 need to be re-run every time any of the +following files are modified (either manually or by a svn update): + + configure.in + m4/* + +Running "make clean" after running steps 2 and 3 is generally also +advisable before running step 4. It isn't *always* necessary, but +unless you understand the workings of autoconf/automake, it's safest +to just do it. diff -Nru mixxx-2.2.3~dfsg/lib/libshout/include/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/include/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/include/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/include/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign + +SUBDIRS = shout + +EXTRA_DIST = os.h diff -Nru mixxx-2.2.3~dfsg/lib/libshout/include/os.h mixxx-2.2.4~dfsg/lib/libshout/include/os.h --- mixxx-2.2.3~dfsg/lib/libshout/include/os.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/include/os.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7 @@ +#ifdef _MSC_VER +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef unsigned __int32 uint32_t; +typedef __int32 int32_t; +typedef int ssize_t; +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/include/shout/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/include/shout/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/include/shout/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/include/shout/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,6 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign + +pkgincludedir = $(includedir)/shout +nodist_pkginclude_HEADERS = shout.h diff -Nru mixxx-2.2.3~dfsg/lib/libshout/include/shout/shout.h mixxx-2.2.4~dfsg/lib/libshout/include/shout/shout.h --- mixxx-2.2.3~dfsg/lib/libshout/include/shout/shout.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/include/shout/shout.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,265 @@ +/* shout.h + * + * API for libshout, the streaming library for icecast + * + * Copyright (C) 2002-2003 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __LIBSHOUT_SHOUT_H__ +#define __LIBSHOUT_SHOUT_H__ + +#include +#if defined(WIN32) && !defined(__MINGW64__) && !defined(__MINGW32__) +#include +#endif + +#define SHOUTERR_SUCCESS (0) /* No error */ +#define SHOUTERR_INSANE (-1) /* Nonsensical arguments e.g. self being NULL */ +#define SHOUTERR_NOCONNECT (-2) /* Couldn't connect */ +#define SHOUTERR_NOLOGIN (-3) /* Login failed */ +#define SHOUTERR_SOCKET (-4) /* Socket error */ +#define SHOUTERR_MALLOC (-5) /* Out of memory */ +#define SHOUTERR_METADATA (-6) +#define SHOUTERR_CONNECTED (-7) /* Cannot set parameter while connected */ +#define SHOUTERR_UNCONNECTED (-8) /* Not connected */ +#define SHOUTERR_UNSUPPORTED (-9) /* This libshout doesn't support the requested option */ +#define SHOUTERR_BUSY (-10) /* Socket is busy */ +#define SHOUTERR_NOTLS (-11) /* TLS requested but not supported by peer */ +#define SHOUTERR_TLSBADCERT (-12) /* TLS connection can not be established because of bad certificate */ +#define SHOUTERR_RETRY (-13) /* Retry last operation. */ + +#define SHOUT_FORMAT_OGG (0) /* application/ogg */ +#define SHOUT_FORMAT_MP3 (1) /* audio/mpeg */ +#define SHOUT_FORMAT_WEBM (2) /* video/webm */ +#define SHOUT_FORMAT_WEBMAUDIO (3) /* audio/webm audio only */ + +/* backward-compatibility alias */ +#define SHOUT_FORMAT_VORBIS SHOUT_FORMAT_OGG + +#define SHOUT_PROTOCOL_HTTP (0) +#define SHOUT_PROTOCOL_XAUDIOCAST (1) +#define SHOUT_PROTOCOL_ICY (2) +#define SHOUT_PROTOCOL_ROARAUDIO (3) + +/* Possible TLS modes */ +#define SHOUT_TLS_DISABLED (0) /* Do not use TLS at all */ +#define SHOUT_TLS_AUTO (1) /* Autodetect which TLS mode to use if any */ +#define SHOUT_TLS_AUTO_NO_PLAIN (2) /* Like SHOUT_TLS_AUTO_NO_PLAIN but does not allow plain connections */ +#define SHOUT_TLS_RFC2818 (11) /* Use TLS for transport layer like HTTPS [RFC2818] does. */ +#define SHOUT_TLS_RFC2817 (12) /* Use TLS via HTTP Upgrade:-header [RFC2817]. */ + +#define SHOUT_AI_BITRATE "bitrate" +#define SHOUT_AI_SAMPLERATE "samplerate" +#define SHOUT_AI_CHANNELS "channels" +#define SHOUT_AI_QUALITY "quality" + +#define SHOUT_META_NAME "name" +#define SHOUT_META_URL "url" +#define SHOUT_META_GENRE "genre" +#define SHOUT_META_DESCRIPTION "description" +#define SHOUT_META_IRC "irc" +#define SHOUT_META_AIM "aim" +#define SHOUT_META_ICQ "icq" + +typedef struct shout shout_t; +typedef struct _util_dict shout_metadata_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/* initializes the shout library. Must be called before anything else */ +void shout_init(void); + +/* shuts down the shout library, deallocating any global storage. Don't call + * anything afterwards */ +void shout_shutdown(void); + +/* returns a static version string. Non-null parameters will be set to the + * value of the library major, minor, and patch levels, respectively */ +const char *shout_version(int *major, int *minor, int *patch); + +/* Allocates and sets up a new shout_t. Returns NULL if it can't get enough + * memory. The returns shout_t must be disposed of with shout_free. */ +shout_t *shout_new(void); + +/* Free all memory allocated by a shout_t */ +void shout_free(shout_t *self); + +/* Returns a statically allocated string describing the last shout error + * to occur. Only valid until the next libshout call on this shout_t */ +const char *shout_get_error(shout_t *self); + +/* Return the error code (e.g. SHOUTERR_SOCKET) for this shout instance */ +int shout_get_errno(shout_t *self); + +/* returns SHOUTERR_CONNECTED or SHOUTERR_UNCONNECTED */ +int shout_get_connected(shout_t *self); + +/* Parameter manipulation functions. libshout makes copies of all parameters, + * the caller may free its copies after giving them to libshout. May return + * SHOUTERR_MALLOC */ + +/* Connection parameters */ +int shout_set_host(shout_t *self, const char *host); +const char *shout_get_host(shout_t *self); + +int shout_set_port(shout_t *self, unsigned short port); +unsigned short shout_get_port(shout_t *self); + +int shout_set_agent(shout_t *self, const char *agent); +const char *shout_get_agent(shout_t *self); + +/* See SHOUT_TLS_* above */ +int shout_set_tls(shout_t *self, int mode); +int shout_get_tls(shout_t *self); + +/* Set the directory for CA certs. Default: operating system's default */ +int shout_set_ca_directory(shout_t *self, const char *directory); +const char *shout_get_ca_directory(shout_t *self); + +/* Set a CA cert file for checking. If you use a self signed server cert + * you can pass this cert using this function for verification. + * Default: operating system's default */ +int shout_set_ca_file(shout_t *self, const char *file); +const char *shout_get_ca_file(shout_t *self); + +/* Set list of allowed ciphers. + * This function should only be used in case of using an old libshout + * after some attacks got known. Watch the icecast mailinglist for + * known problems. + * DO NOT SET THIS TO ANY FIXED VALUE. IF YOU USE THIS FUNCTION + * EXPOSE IT TO THE USER. OTHERWISE YOU WILL HARM SECURITY. + * Default: internal list of secure ciphers. */ +int shout_set_allowed_ciphers(shout_t *self, const char *ciphers); +const char *shout_get_allowed_ciphers(shout_t *self); + +/* Authentication parameters */ +int shout_set_user(shout_t *self, const char *username); +const char *shout_get_user(shout_t *self); + +int shout_set_password(shout_t *, const char *password); +const char *shout_get_password(shout_t *self); + +/* Set a client certificate for TLS connections. + * This must be in PEM format with both cert and private key in the same file. + * Default: none. */ +int shout_set_client_certificate(shout_t *self, const char *certificate); +const char *shout_get_client_certificate(shout_t *self); + +/* Mount parameters */ +int shout_set_mount(shout_t *self, const char *mount); +const char *shout_get_mount(shout_t *self); + +/* Other parameters */ +int shout_set_name(shout_t *self, const char *name); // obsolete +const char *shout_get_name(shout_t *self); // obsolete + +int shout_set_url(shout_t *self, const char *url); // obsolete +const char *shout_get_url(shout_t *self); // obsolete + +int shout_set_genre(shout_t *self, const char *genre); // obsolete +const char *shout_get_genre(shout_t *self); // obsolete + +int shout_set_description(shout_t *self, const char *description); // obsolete +const char *shout_get_description(shout_t *self); // obsolete + +int shout_set_dumpfile(shout_t *self, const char *dumpfile); +const char *shout_get_dumpfile(shout_t *self); + +int shout_set_audio_info(shout_t *self, const char *name, const char *value); +const char *shout_get_audio_info(shout_t *self, const char *name); + +/* takes a SHOUT_META_xxxx argument */ +int shout_set_meta(shout_t *self, const char *name, const char *value); +const char *shout_get_meta(shout_t *self, const char *name); + +int shout_set_public(shout_t *self, unsigned int make_public); +unsigned int shout_get_public(shout_t *self); + +/* takes a SHOUT_FORMAT_xxxx argument */ +int shout_set_format(shout_t *self, unsigned int format); +unsigned int shout_get_format(shout_t *self); + +/* takes a SHOUT_PROTOCOL_xxxxx argument */ +int shout_set_protocol(shout_t *self, unsigned int protocol); +unsigned int shout_get_protocol(shout_t *self); + +/* Instructs libshout to use nonblocking I/O. Must be called before + * shout_open (no switching back and forth midstream at the moment). */ +int shout_set_nonblocking(shout_t* self, unsigned int nonblocking); +unsigned int shout_get_nonblocking(shout_t *self); + +/* Opens a connection to the server. All parameters must already be set */ +int shout_open(shout_t *self); + +/* Closes a connection to the server */ +int shout_close(shout_t *self); + +/* Send data to the server, parsing it for format specific timing info */ +int shout_send(shout_t *self, const unsigned char *data, size_t len); + +/* Send unparsed data to the server. Do not use this unless you know + * what you are doing. + * Returns the number of bytes written, or < 0 on error. + */ +ssize_t shout_send_raw(shout_t *self, const unsigned char *data, size_t len); + +/* return the number of bytes currently on the write queue (only makes sense in + * nonblocking mode). */ +ssize_t shout_queuelen(shout_t *self); + +/* Puts caller to sleep until it is time to send more data to the server */ +void shout_sync(shout_t *self); + +/* Amount of time in ms caller should wait before sending again */ +int shout_delay(shout_t *self); + +/* Sets MP3 metadata. + * Returns: + * SHOUTERR_SUCCESS + * SHOUTERR_UNSUPPORTED if format isn't MP3 + * SHOUTERR_MALLOC + * SHOUTERR_INSANE + * SHOUTERR_NOCONNECT + * SHOUTERR_SOCKET + */ +int shout_set_metadata(shout_t *self, shout_metadata_t *metadata); + +/* Allocates a new metadata structure. Must be freed by shout_metadata_free. */ +shout_metadata_t *shout_metadata_new(void); + +/* Free resources allocated by shout_metadata_t */ +void shout_metadata_free(shout_metadata_t *self); + +/* Add a parameter to the metadata structure. + * Returns: + * SHOUTERR_SUCCESS on success + * SHOUTERR_INSANE if self isn't a valid shout_metadata_t* or name is null + * SHOUTERR_MALLOC if memory can't be allocated */ +int shout_metadata_add(shout_metadata_t *self, const char *name, const char *value); + +#ifdef __cplusplus +} +#endif + +/* --- Compiled features --- */ + +#define SHOUT_THREADSAFE 1 +#define SHOUT_TLS 1 + +#endif /* __LIBSHOUT_SHOUT_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/include/shout/shout.h.in mixxx-2.2.4~dfsg/lib/libshout/include/shout/shout.h.in --- mixxx-2.2.3~dfsg/lib/libshout/include/shout/shout.h.in 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/include/shout/shout.h.in 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,265 @@ +/* shout.h + * + * API for libshout, the streaming library for icecast + * + * Copyright (C) 2002-2003 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __LIBSHOUT_SHOUT_H__ +#define __LIBSHOUT_SHOUT_H__ + +#include +#if defined(WIN32) && !defined(__MINGW64__) && !defined(__MINGW32__) +#include +#endif + +#define SHOUTERR_SUCCESS (0) /* No error */ +#define SHOUTERR_INSANE (-1) /* Nonsensical arguments e.g. self being NULL */ +#define SHOUTERR_NOCONNECT (-2) /* Couldn't connect */ +#define SHOUTERR_NOLOGIN (-3) /* Login failed */ +#define SHOUTERR_SOCKET (-4) /* Socket error */ +#define SHOUTERR_MALLOC (-5) /* Out of memory */ +#define SHOUTERR_METADATA (-6) +#define SHOUTERR_CONNECTED (-7) /* Cannot set parameter while connected */ +#define SHOUTERR_UNCONNECTED (-8) /* Not connected */ +#define SHOUTERR_UNSUPPORTED (-9) /* This libshout doesn't support the requested option */ +#define SHOUTERR_BUSY (-10) /* Socket is busy */ +#define SHOUTERR_NOTLS (-11) /* TLS requested but not supported by peer */ +#define SHOUTERR_TLSBADCERT (-12) /* TLS connection can not be established because of bad certificate */ +#define SHOUTERR_RETRY (-13) /* Retry last operation. */ + +#define SHOUT_FORMAT_OGG (0) /* application/ogg */ +#define SHOUT_FORMAT_MP3 (1) /* audio/mpeg */ +#define SHOUT_FORMAT_WEBM (2) /* video/webm */ +#define SHOUT_FORMAT_WEBMAUDIO (3) /* audio/webm audio only */ + +/* backward-compatibility alias */ +#define SHOUT_FORMAT_VORBIS SHOUT_FORMAT_OGG + +#define SHOUT_PROTOCOL_HTTP (0) +#define SHOUT_PROTOCOL_XAUDIOCAST (1) +#define SHOUT_PROTOCOL_ICY (2) +#define SHOUT_PROTOCOL_ROARAUDIO (3) + +/* Possible TLS modes */ +#define SHOUT_TLS_DISABLED (0) /* Do not use TLS at all */ +#define SHOUT_TLS_AUTO (1) /* Autodetect which TLS mode to use if any */ +#define SHOUT_TLS_AUTO_NO_PLAIN (2) /* Like SHOUT_TLS_AUTO_NO_PLAIN but does not allow plain connections */ +#define SHOUT_TLS_RFC2818 (11) /* Use TLS for transport layer like HTTPS [RFC2818] does. */ +#define SHOUT_TLS_RFC2817 (12) /* Use TLS via HTTP Upgrade:-header [RFC2817]. */ + +#define SHOUT_AI_BITRATE "bitrate" +#define SHOUT_AI_SAMPLERATE "samplerate" +#define SHOUT_AI_CHANNELS "channels" +#define SHOUT_AI_QUALITY "quality" + +#define SHOUT_META_NAME "name" +#define SHOUT_META_URL "url" +#define SHOUT_META_GENRE "genre" +#define SHOUT_META_DESCRIPTION "description" +#define SHOUT_META_IRC "irc" +#define SHOUT_META_AIM "aim" +#define SHOUT_META_ICQ "icq" + +typedef struct shout shout_t; +typedef struct _util_dict shout_metadata_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/* initializes the shout library. Must be called before anything else */ +void shout_init(void); + +/* shuts down the shout library, deallocating any global storage. Don't call + * anything afterwards */ +void shout_shutdown(void); + +/* returns a static version string. Non-null parameters will be set to the + * value of the library major, minor, and patch levels, respectively */ +const char *shout_version(int *major, int *minor, int *patch); + +/* Allocates and sets up a new shout_t. Returns NULL if it can't get enough + * memory. The returns shout_t must be disposed of with shout_free. */ +shout_t *shout_new(void); + +/* Free all memory allocated by a shout_t */ +void shout_free(shout_t *self); + +/* Returns a statically allocated string describing the last shout error + * to occur. Only valid until the next libshout call on this shout_t */ +const char *shout_get_error(shout_t *self); + +/* Return the error code (e.g. SHOUTERR_SOCKET) for this shout instance */ +int shout_get_errno(shout_t *self); + +/* returns SHOUTERR_CONNECTED or SHOUTERR_UNCONNECTED */ +int shout_get_connected(shout_t *self); + +/* Parameter manipulation functions. libshout makes copies of all parameters, + * the caller may free its copies after giving them to libshout. May return + * SHOUTERR_MALLOC */ + +/* Connection parameters */ +int shout_set_host(shout_t *self, const char *host); +const char *shout_get_host(shout_t *self); + +int shout_set_port(shout_t *self, unsigned short port); +unsigned short shout_get_port(shout_t *self); + +int shout_set_agent(shout_t *self, const char *agent); +const char *shout_get_agent(shout_t *self); + +/* See SHOUT_TLS_* above */ +int shout_set_tls(shout_t *self, int mode); +int shout_get_tls(shout_t *self); + +/* Set the directory for CA certs. Default: operating system's default */ +int shout_set_ca_directory(shout_t *self, const char *directory); +const char *shout_get_ca_directory(shout_t *self); + +/* Set a CA cert file for checking. If you use a self signed server cert + * you can pass this cert using this function for verification. + * Default: operating system's default */ +int shout_set_ca_file(shout_t *self, const char *file); +const char *shout_get_ca_file(shout_t *self); + +/* Set list of allowed ciphers. + * This function should only be used in case of using an old libshout + * after some attacks got known. Watch the icecast mailinglist for + * known problems. + * DO NOT SET THIS TO ANY FIXED VALUE. IF YOU USE THIS FUNCTION + * EXPOSE IT TO THE USER. OTHERWISE YOU WILL HARM SECURITY. + * Default: internal list of secure ciphers. */ +int shout_set_allowed_ciphers(shout_t *self, const char *ciphers); +const char *shout_get_allowed_ciphers(shout_t *self); + +/* Authentication parameters */ +int shout_set_user(shout_t *self, const char *username); +const char *shout_get_user(shout_t *self); + +int shout_set_password(shout_t *, const char *password); +const char *shout_get_password(shout_t *self); + +/* Set a client certificate for TLS connections. + * This must be in PEM format with both cert and private key in the same file. + * Default: none. */ +int shout_set_client_certificate(shout_t *self, const char *certificate); +const char *shout_get_client_certificate(shout_t *self); + +/* Mount parameters */ +int shout_set_mount(shout_t *self, const char *mount); +const char *shout_get_mount(shout_t *self); + +/* Other parameters */ +int shout_set_name(shout_t *self, const char *name); // obsolete +const char *shout_get_name(shout_t *self); // obsolete + +int shout_set_url(shout_t *self, const char *url); // obsolete +const char *shout_get_url(shout_t *self); // obsolete + +int shout_set_genre(shout_t *self, const char *genre); // obsolete +const char *shout_get_genre(shout_t *self); // obsolete + +int shout_set_description(shout_t *self, const char *description); // obsolete +const char *shout_get_description(shout_t *self); // obsolete + +int shout_set_dumpfile(shout_t *self, const char *dumpfile); +const char *shout_get_dumpfile(shout_t *self); + +int shout_set_audio_info(shout_t *self, const char *name, const char *value); +const char *shout_get_audio_info(shout_t *self, const char *name); + +/* takes a SHOUT_META_xxxx argument */ +int shout_set_meta(shout_t *self, const char *name, const char *value); +const char *shout_get_meta(shout_t *self, const char *name); + +int shout_set_public(shout_t *self, unsigned int make_public); +unsigned int shout_get_public(shout_t *self); + +/* takes a SHOUT_FORMAT_xxxx argument */ +int shout_set_format(shout_t *self, unsigned int format); +unsigned int shout_get_format(shout_t *self); + +/* takes a SHOUT_PROTOCOL_xxxxx argument */ +int shout_set_protocol(shout_t *self, unsigned int protocol); +unsigned int shout_get_protocol(shout_t *self); + +/* Instructs libshout to use nonblocking I/O. Must be called before + * shout_open (no switching back and forth midstream at the moment). */ +int shout_set_nonblocking(shout_t* self, unsigned int nonblocking); +unsigned int shout_get_nonblocking(shout_t *self); + +/* Opens a connection to the server. All parameters must already be set */ +int shout_open(shout_t *self); + +/* Closes a connection to the server */ +int shout_close(shout_t *self); + +/* Send data to the server, parsing it for format specific timing info */ +int shout_send(shout_t *self, const unsigned char *data, size_t len); + +/* Send unparsed data to the server. Do not use this unless you know + * what you are doing. + * Returns the number of bytes written, or < 0 on error. + */ +ssize_t shout_send_raw(shout_t *self, const unsigned char *data, size_t len); + +/* return the number of bytes currently on the write queue (only makes sense in + * nonblocking mode). */ +ssize_t shout_queuelen(shout_t *self); + +/* Puts caller to sleep until it is time to send more data to the server */ +void shout_sync(shout_t *self); + +/* Amount of time in ms caller should wait before sending again */ +int shout_delay(shout_t *self); + +/* Sets MP3 metadata. + * Returns: + * SHOUTERR_SUCCESS + * SHOUTERR_UNSUPPORTED if format isn't MP3 + * SHOUTERR_MALLOC + * SHOUTERR_INSANE + * SHOUTERR_NOCONNECT + * SHOUTERR_SOCKET + */ +int shout_set_metadata(shout_t *self, shout_metadata_t *metadata); + +/* Allocates a new metadata structure. Must be freed by shout_metadata_free. */ +shout_metadata_t *shout_metadata_new(void); + +/* Free resources allocated by shout_metadata_t */ +void shout_metadata_free(shout_metadata_t *self); + +/* Add a parameter to the metadata structure. + * Returns: + * SHOUTERR_SUCCESS on success + * SHOUTERR_INSANE if self isn't a valid shout_metadata_t* or name is null + * SHOUTERR_MALLOC if memory can't be allocated */ +int shout_metadata_add(shout_metadata_t *self, const char *name, const char *value); + +#ifdef __cplusplus +} +#endif + +/* --- Compiled features --- */ + +#define SHOUT_THREADSAFE @SHOUT_THREADSAFE@ +#define SHOUT_TLS @SHOUT_TLS@ + +#endif /* __LIBSHOUT_SHOUT_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/INSTALL mixxx-2.2.4~dfsg/lib/libshout/INSTALL --- mixxx-2.2.3~dfsg/lib/libshout/INSTALL 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/INSTALL 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,41 @@ +Prerequisites +------------- + +libvorbis +libogg + +Both of these libraries must be installed before you can build +libshout. If they aren't available in your OS's package system, you +can find them at vorbis.com. You may also want libtheora if you're +interested in doing video streaming. + +Building +-------- + +Normally, just ./configure; make + +You may need to specify --with-ogg-prefix and/or --with-vorbis-prefix +if you have installed those libraries in a non-standard +location. The arguments to these will match the --prefix you used when +configuring ogg and vorbis, respectively. + +You may also choose to build libshout without thread safety, with the +--disable-pthread argument to configure. Only do this if you know you +will never be using the library in a threaded application, or if you +intend to make all calls to libshout threadsafe by hand in your +calling application. + +Installation +------------ +(as root) make install + +This will install header files in $(prefix)/shout and library files in +$(prefix)/lib. + +configure will have detected whether or not you have pkg-config +automatically. If you have, it will place a pkg-config data file in +$(prefix)/lib/pkgconfig, otherwise it will place a shout-config script +in $(prefix)/bin. You can force libshout to use shout-config instead +of pkgconfig with the configure option --disable-pkgconfig. + +$Id$ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/libshout.ckport mixxx-2.2.4~dfsg/lib/libshout/libshout.ckport --- mixxx-2.2.3~dfsg/lib/libshout/libshout.ckport 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/libshout.ckport 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,90 @@ +#ckport(1) database for libshout -- A Cross-platform library for media streaming: +!NAME: libshout +!TYPE: func +!TARGET: libshout3 + +# Global libshout management: +shout_init ok +shout_shutdown ok +shout_version ok + +# shout_t* object management: +shout_free ok +shout_new ok +shout_get_error ok +shout_get_errno ok +shout_get_connected ok + +# Connection parameters: +shout_set_host ok +shout_get_host ok +shout_set_port ok +shout_get_port ok +shout_set_agent ok +shout_get_agent ok +shout_set_protocol ok +shout_get_protocol ok +shout_set_nonblocking ok +shout_get_nonblocking ok + +# TLS (Transport Layer Security): +# See also 'Authentication parameters'. +shout_set_tls ok +shout_get_tls ok +shout_set_ca_directory ok +shout_get_ca_directory ok +shout_set_ca_file ok +shout_get_ca_file ok +shout_set_allowed_ciphers maybe This is for advanced applications only. If used this setting MUST be exposed to the user. Otherwise you will harm security. +shout_get_allowed_ciphers ok + +# Authentication parameters: +shout_set_user ok +shout_get_user ok +shout_set_password ok +shout_get_password ok +shout_set_client_certificate ok +shout_get_client_certificate ok + +# Source parameters: +shout_set_format ok +shout_get_format ok +shout_set_mount ok +shout_get_mount ok + +# Other parameters: +shout_set_dumpfile ok +shout_get_dumpfile ok +shout_set_audio_info ok +shout_get_audio_info ok +shout_set_meta ok +shout_get_meta ok +shout_set_public ok +shout_get_public ok + +# Sending data: +shout_open ok +shout_close ok +shout_send ok +shout_send_raw maybe Do not use this unless you know what you are doing. +shout_queuelen likely Only useful in non-blocking mode. +shout_sync ok +shout_delay ok + +# MP3 Metadata: +shout_set_metadata maybe Only useful for MP3 streams. +shout_metadata_new maybe Only useful for MP3 streams. +shout_metadata_free maybe Only useful for MP3 streams. +shout_metadata_add maybe Only useful for MP3 streams. + +# Obsolete functions: +shout_set_name legacy Replaced by shout_set_meta(). +shout_get_name legacy Replaced by shout_get_meta(). +shout_set_url legacy Replaced by shout_set_meta(). +shout_get_url legacy Replaced by shout_get_meta(). +shout_set_genre legacy Replaced by shout_set_meta(). +shout_get_genre legacy Replaced by shout_get_meta(). +shout_set_description legacy Replaced by shout_set_meta(). +shout_get_description legacy Replaced by shout_get_meta(). + +#ll diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/acx_pthread.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/acx_pthread.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/acx_pthread.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/acx_pthread.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,199 @@ +dnl Available from the GNU Autoconf Macro Archive at: +dnl http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html +dnl +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CPPFLAGS="$flag $PTHREAD_CPPFLAGS" + fi + + AC_CHECK_FUNCS([pthread_spin_lock]) + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CPPFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/libtool.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/libtool.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/libtool.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/libtool.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7997 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/lt~obsolete.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/lt~obsolete.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/lt~obsolete.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/lt~obsolete.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/ltoptions.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/ltoptions.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/ltoptions.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/ltoptions.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/ltsugar.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/ltsugar.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/ltsugar.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/ltsugar.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/ltversion.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/ltversion.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/ltversion.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/ltversion.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/ogg.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/ogg.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/ogg.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/ogg.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,65 @@ +# Configure paths for libogg +# updated by Karl Heyes 10-Jun-2003 +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libogg, and define OGG_CFLAGS OGG_LDFLAGS and OGG_LIBS +dnl +AC_DEFUN([XIPH_PATH_OGG], +[dnl +AC_ARG_VAR([OGG_PREFIX],[path to ogg installation]) +AC_ARG_WITH(ogg, + [AC_HELP_STRING([--with-ogg=PREFIX], + [Prefix where libogg is installed (optional)])], + ogg_prefix="$withval", + ogg_prefix="$OGG_PREFIX" + ) +if test "x$ogg_prefix" = "x" -o "x$ogg_prefix" = "xyes"; then + if test "x$prefix" = "xNONE"; then + ogg_prefix=/usr/local + else + ogg_prefix="$prefix" + fi +fi + +XIPH_GCC_WARNING([-I$ogg_prefix/include],, + [ OGG_CFLAGS="-I$ogg_prefix/include" + OGG_LDFLAGS="-L$ogg_prefix/lib" + ]) +AC_CACHE_CHECK([for libogg], xt_cv_lib_ogg, +[dnl +OGG_LIBS="-logg" + +# +# check if the installed Ogg is sufficiently new. +# +ac_save_CFLAGS="$CFLAGS" +ac_save_LIBS="$LIBS" +ac_save_LDFLAGS="$LDFLAGS" +CFLAGS="$CFLAGS $OGG_CFLAGS" +LIBS="$LIBS $OGG_LIBS" +LDFLAGS="$LDFLAGS $OGG_LDFLAGS" +AC_TRY_LINK_FUNC(ogg_sync_init, + [ xt_cv_lib_ogg=ok ], + [ AC_TRY_LINK([#include ],, + [ xt_cv_lib_ogg="pre v1.0, needs updating" ], + [ xt_cv_lib_ogg="not found" ]) + ]) +CFLAGS="$ac_save_CFLAGS" +LDFLAGS="$ac_save_LDFLAGS" +LIBS="$ac_save_LIBS" +]) +if test "x$xt_cv_lib_ogg" = "xok"; then + ifelse([$1],,,[$1]) + AC_DEFINE([HAVE_OGG], [1], [Define if you have libogg installed]) +else + OGG_LIBS="" + OGG_CFLAGS="" + OGG_LDFLAGS="" + ifelse([$2],,,[$2]) +fi +AC_SUBST(OGG_LIBS) +AC_SUBST(OGG_CFLAGS) +AC_SUBST(OGG_LDFLAGS) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/shout.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/shout.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/shout.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/shout.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,79 @@ +dnl XIPH_PATH_SHOUT +dnl Jack Moffitt 08-06-2001 +dnl Rewritten for libshout 2 +dnl Brendan Cully 20030612 +dnl +dnl $Id$ + +# XIPH_PATH_SHOUT([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +# Test for libshout, and define SHOUT_CPPFLAGS SHOUT_CFLAGS SHOUT_LIBS, and +# SHOUT_THREADSAFE +AC_DEFUN([XIPH_PATH_SHOUT], +[dnl +xt_have_shout="no" +SHOUT_THREADSAFE="no" +SHOUT_CPPFLAGS="" +SHOUT_CFLAGS="" +SHOUT_LIBS="" + +# NB: PKG_CHECK_MODULES exits if pkg-config is unavailable on the target +# system, so we can't use it. + +# seed pkg-config with the default libshout location +PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-/usr/local/lib/pkgconfig} +export PKG_CONFIG_PATH + +# Step 1: Use pkg-config if available +AC_PATH_PROG([PKGCONFIG], [pkg-config], [no]) +if test "$PKGCONFIG" != "no" && `$PKGCONFIG --exists shout` +then + SHOUT_CFLAGS=`$PKGCONFIG --variable=cflags_only shout` + SHOUT_CPPFLAGS=`$PKGCONFIG --variable=cppflags shout` + SHOUT_LIBS=`$PKGCONFIG --libs shout` + xt_have_shout="maybe" +else + if test "$PKGCONFIG" != "no" + then + AC_MSG_NOTICE([$PKGCONFIG couldn't find libshout. Try adjusting PKG_CONFIG_PATH.]) + fi + # pkg-config unavailable, try shout-config + AC_PATH_PROG([SHOUTCONFIG], [shout-config], [no]) + if test "$SHOUTCONFIG" != "no" && test `$SHOUTCONFIG --package` = "libshout" + then + SHOUT_CPPFLAGS=`$SHOUTCONFIG --cppflags` + SHOUT_CFLAGS=`$SHOUTCONFIG --cflags-only` + SHOUT_LIBS=`$SHOUTCONFIG --libs` + xt_have_shout="maybe" + fi +fi + +# Now try actually using libshout +if test "$xt_have_shout" != "no" +then + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CPPFLAGS="$CPPFLAGS $SHOUT_CPPFLAGS" + CFLAGS="$CFLAGS $SHOUT_CFLAGS" + LIBS="$SHOUT_LIBS $LIBS" + AC_CHECK_HEADERS([shout/shout.h], [ + AC_CHECK_FUNC([shout_new], [ + ifelse([$1], , :, [$1]) + xt_have_shout="yes" + ]) + AC_EGREP_CPP([yes], [#include +#if SHOUT_THREADSAFE +yes +#endif +], [SHOUT_THREADSAFE="yes"]) + ]) + CPPFLAGS="$ac_save_CPPFLAGS" + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" +fi + +if test "$xt_have_shout" != "yes" +then + ifelse([$2], , :, [$2]) +fi +])dnl XIPH_PATH_SHOUT diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/speex.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/speex.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/speex.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/speex.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,84 @@ +# Configure paths for libspeex +# updated by Karl Heyes 02-Feb-2004 + +dnl XIPH_PATH_SPEEX([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libspeex, and define SPEEX_CFLAGS SPEEX_LIBS +dnl SPEEX_SPEEXENC_LIBS SPEEX_SPEEXFILE_LIBS SPEEX_LDFLAGS +dnl + +AC_DEFUN([XIPH_PATH_SPEEX], +[ +AC_REQUIRE([XIPH_PATH_OGG]) + +dnl Get the cflags and libraries for speex +dnl +AC_ARG_VAR([SPEEX],[path to speex installation]) +AC_ARG_WITH(speex, + AC_HELP_STRING([--with-speex=PREFIX], + [Prefix where libspeex is installed (optional)]), + speex_prefix="$withval", + speex_prefix="$SPEEX_PREFIX" + ) +if test "x$with_speex" = "xno" +then + AC_MSG_RESULT([Speex support disabled by request]) +else + if test "x$speex_prefix" = "x" -o "x$speex_prefix" = "xyes"; then + if test "x$prefix" = "xNONE"; then + speex_prefix="/usr/local" + else + speex_prefix="$prefix" + fi + fi + + SPEEX_CFLAGS="$OGG_CFLAGS" + SPEEX_LDFLAGS="$OGG_LDFLAGS" + if test "x$speex_prefix" != "x$ogg_prefix"; then + XIPH_GCC_WARNING(-I"$speex_prefix/include",, + [SPEEX_CFLAGS="$SPEEX_CFLAGS -I$speex_prefix/include" + SPEEX_LDFLAGS="-L$speex_prefix/lib $SPEEX_LDFLAGS" + ]) + fi + + SPEEX_LIBS="-lspeex" + + xt_save_LIBS="$LIBS" + xt_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $SPEEX_LDFLAGS" + LIBS="$LIBS $SPEEX_LIBS" + xt_have_speex="yes" + AC_MSG_CHECKING([for libspeex]) + AC_TRY_LINK_FUNC(ogg_stream_init, [AC_MSG_RESULT([ok])], + [LIBS="$LIBS $OGG_LIBS" + AC_TRY_LINK_FUNC(ogg_stream_init, + [SPEEX_LIBS="$SPEEX_LIBS $OGG_LIBS"], + [xt_have_speex="no"]) + ]) + if test "x$xt_have_speex" = "xyes" + then + AC_LINK_IFELSE([AC_LANG_PROGRAM( + [#include ], + [void *p = speex_packet_to_header;])], + [], + [xt_have_speex="no"]) + fi + + LIBS="$xt_save_LIBS" + LDFLAGS="$xt_save_LDFLAGS" + + if test "x$xt_have_speex" = "xyes" + then + AC_MSG_RESULT([ok]) + AC_DEFINE([HAVE_SPEEX],[1],[Define if Speex support is available]) + $1 + else + ifelse([$2], , AC_MSG_ERROR([Unable to link to libspeex]), [$2]) + SPEEX_CFLAGS="" + SPEEX_LDFLAGS="" + SPEEX_LIBS="" + fi + AC_SUBST(SPEEX_CFLAGS) + AC_SUBST(SPEEX_LDFLAGS) + AC_SUBST(SPEEX_LIBS) +fi +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/theora.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/theora.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/theora.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/theora.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,77 @@ +# Configure paths for libtheora +# Karl Heyes 02-Feb-2004 + +dnl XIPH_PATH_THEORA([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libtheora, and define THEORA_CFLAGS THEORA_LIBS +dnl + +AC_DEFUN([XIPH_PATH_THEORA], +[ +AC_REQUIRE([XIPH_PATH_OGG]) + +dnl Get the cflags and libraries for theora +dnl +AC_ARG_VAR([THEORA],[path to theora installation]) +AC_ARG_WITH(theora, + AC_HELP_STRING([--with-theora=PREFIX], + [Prefix where libtheora is installed (optional)]), + theora_prefix="$withval", + theora_prefix="$THEORA_PREFIX" + ) + +if test "x$with_theora" = "xno" +then + AC_MSG_RESULT([Theora support disabled by request]) +else + if test "x$theora_prefix" = "x" -o "x$theora_prefix" = "xyes"; then + if test "x$prefix" = "xNONE"; then + theora_prefix="/usr/local" + else + theora_prefix="$prefix" + fi + fi + + THEORA_CFLAGS="$OGG_CFLAGS" + THEORA_LDFLAGS="$OGG_LDFLAGS" + if test "x$theora_prefix" != "x$ogg_prefix"; then + XIPH_GCC_WARNING(-I"$theora_prefix/include",, + [THEORA_CFLAGS="$THEORA_CFLAGS -I$theora_prefix/include" + THEORA_LDFLAGS="-L$theora_prefix/lib $THEORA_LDFLAGS" + ]) + fi + + THEORA_LIBS="-ltheora -logg" + + ac_save_LIBS="$LIBS" + ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $THEORA_LDFLAGS" + LIBS="$LIBS $THEORA_LIBS" + AC_MSG_CHECKING([for libtheora]) + AC_TRY_LINK_FUNC(theora_decode_header, [xt_have_theora="yes"], + [xt_have_theora="Not found"]) + if test "x$xt_have_theora" = "xyes" + then + AC_TRY_LINK_FUNC(theora_packet_isheader, [xt_have_theora="yes"], + [xt_have_theora="newer version required"]) + fi + + LIBS="$ac_save_LIBS" + LDFLAGS="$ac_save_LDFLAGS" + + if test "x$xt_have_theora" = "xyes" + then + AC_MSG_RESULT([ok]) + AC_DEFINE([HAVE_THEORA],[1],[Define if Theora support is available]) + $1 + else + THEORA_CFLAGS="" + THEORA_LDFLAGS="" + THEORA_LIBS="" + AC_MSG_RESULT([$xt_have_theora]) + $2 + fi +fi +AC_SUBST(THEORA_CFLAGS) +AC_SUBST(THEORA_LDFLAGS) +AC_SUBST(THEORA_LIBS) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/vorbis.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/vorbis.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/vorbis.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/vorbis.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,92 @@ +# Configure paths for libvorbis +# Jack Moffitt 10-21-2000 +# updated by Karl Heyes 31-Mar-2003 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libvorbis, and define VORBIS_CFLAGS VORBIS_LIBS +dnl VORBIS_VORBISENC_LIBS VORBIS_VORBISFILE_LIBS VORBIS_LDFLAGS +dnl + +AC_DEFUN([XIPH_PATH_VORBIS], +[dnl +AC_REQUIRE([XIPH_PATH_OGG]) + +dnl Get the cflags and libraries for vorbis +dnl +AC_ARG_VAR([VORBIS_PREFIX],[path to vorbis installation]) +AC_ARG_WITH(vorbis, + AC_HELP_STRING([--with-vorbis=PREFIX], + [Prefix where libvorbis is installed (optional)]), + vorbis_prefix="$withval", + vorbis_prefix="$VORBIS_PREFIX" + ) +if test "x$vorbis_prefix" = "x" -o "x$vorbis_prefix" = "xyes"; then + if test "x$prefix" = "xNONE"; then + vorbis_prefix="/usr/local" + else + vorbis_prefix="$prefix" + fi +fi + +VORBIS_CFLAGS="$OGG_CFLAGS" +VORBIS_LDFLAGS="$OGG_LDFLAGS" +if test "x$vorbis_prefix" != "x$ogg_prefix"; then + XIPH_GCC_WARNING(-I"$vorbis_prefix/include",, + [VORBIS_CFLAGS="$VORBIS_CFLAGS -I$vorbis_prefix/include" + VORBIS_LDFLAGS="-L$vorbis_prefix/lib $VORBIS_LDFLAGS" + ]) +fi + +VORBIS_LIBS="-lvorbis" +VORBISFILE_LIBS="-lvorbisfile" +VORBISENC_LIBS="-lvorbisenc" + +xt_save_LIBS="$LIBS" +xt_save_LDFLAGS="$LDFLAGS" +xt_save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $VORBIS_CFLAGS" +LDFLAGS="$LDFLAGS $VORBIS_LDFLAGS" +LIBS="$LIBS $VORBIS_LIBS" +xt_lib_vorbis="not found" +AC_MSG_CHECKING([for libvorbis]) +AC_TRY_LINK_FUNC(ogg_stream_init, [xt_lib_vorbis=ok], + [LIBS="$LIBS $OGG_LIBS -lm" + AC_TRY_LINK_FUNC(vorbis_info_init, + [xt_lib_vorbis=ok + VORBIS_LIBS="$VORBIS_LIBS $OGG_LIBS -lm"], + ) + ]) + +if test "x$xt_lib_vorbis" = "xok"; then +# +# Now check if the installed Vorbis is sufficiently new. +# +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +#include +#include + ], [ +struct ovectl_ratemanage_arg a; +])],,[xt_lib_vorbis="old version found"]) +AC_MSG_RESULT([$xt_lib_vorbis]) +fi +CPPFLAGS="$xt_save_CPPFLAGS" +LIBS="$xt_save_LIBS" +LDFLAGS="$xt_save_LDFLAGS" + +if test "x$xt_lib_vorbis" = "xok"; then + ifelse([$1], ,[:], [$1]) +else + VORBIS_CFLAGS="" + VORBIS_LDFLAGS="" + VORBIS_LIBS="" + VORBISFILE_LIBS="" + VORBISENC_LIBS="" + ifelse([$2], ,, [$2]) +fi +AC_SUBST(VORBIS_CFLAGS) +AC_SUBST(VORBIS_LDFLAGS) +AC_SUBST(VORBIS_LIBS) +AC_SUBST(VORBISFILE_LIBS) +AC_SUBST(VORBISENC_LIBS) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_compiler.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_compiler.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_compiler.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_compiler.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,187 @@ +dnl xiph_compiler.m4 +dnl $Id$ + +dnl XIPH_FUNC_VA_COPY +dnl Karl Heyes +dnl +# XIPH_FUNC_VA_COPY +# Test for implementation of va_copy, or define appropriately if missing +AC_DEFUN([XIPH_FUNC_VA_COPY], +[dnl +AC_MSG_CHECKING([for va_copy]) +AC_TRY_LINK([#include ], [va_list ap1, ap2; va_copy(ap1, ap2);], + AC_MSG_RESULT([va_copy]), + [dnl + AH_TEMPLATE([va_copy], [define if va_copy is not available]) + AC_TRY_LINK([#include ], [va_list ap1, ap2; __va_copy(ap1, ap2);], + [dnl + AC_DEFINE([va_copy], [__va_copy]) + AC_MSG_RESULT([__va_copy])], + [dnl + AC_DEFINE([va_copy(dest,src)], [memcpy(&dest,&src,sizeof(va_list))]) + AC_MSG_RESULT([memcpy]) + ]) + ]) +]) +])dnl XIPH_FUNC_VA_COPY + +dnl XIPH_C_ATTRIBUTE +dnl Karl Heyes +dnl +# XIPH_C_ATTRIBUTE +# Define __attribute__ to be empty if the compiler does not support it +AC_DEFUN([XIPH_C_ATTRIBUTE], +[dnl +AC_TRY_COMPILE([int func(void) __attribute__((unused));], + [int x __attribute__ ((unused));],,[dnl + AH_TEMPLATE([__attribute__],[Define to empty if __attribute__ is not supported]) + AC_DEFINE([__attribute__(x)],[]) +]) +])dnl XIPH_C_ATTRIBUTE + +dnl XIPH_GCC_WARNING +dnl Karl Heyes +dnl +# XIPH_GCC_WARNING(flag, action-if-warning, action-if-not) +# Tests whether GCC emits a warning if explicitly asked to use flag. +# Useful for eg system default include paths +AC_DEFUN([XIPH_GCC_WARNING], +[AC_REQUIRE([AC_PROG_CC]) +xt_warning=no +if test x"$GCC" = "xyes" +then + save_cflags="$CFLAGS" + CFLAGS="-Werror $1" + AC_TRY_COMPILE(,,,xt_warning=yes) + CFLAGS="$save_cflags" +fi +if test "$xt_warning" = "yes" +then + ifelse([$2],,:,[$2]) +else + ifelse([$3],,:,[$3]) +fi +])dnl XIPH_GCC_WARNING + +dnl XIPH_CLEAN_CCFLAGS +dnl Brendan Cully 20030612 +dnl +# XIPH_CLEAN_CCFLAGS(flag-list, dest-shell-var-name) +# Filters out duplicate compiler flags, and -I flags if XIPH_GCC_WARNING +# complains about them +# Operates right-to-left on -l flags, left-to-right on everything else +# eg XIPH_CLEAN_CCFLAGS([-L/opt/lib -lfoo -lm -L/opt/lib -lbar -lm], [MY_LDFLAGS]) +# => MY_LDFLAGS="-L/opt/lib -lfoo -lbar -lm" +# the cat< /dev/null + then + xt_FLAGS="$flag $xt_FLAGS" + fi + ;; + esac +done + +$2='' +for flag in $xt_FLAGS +do + if { cat < /dev/null + then + $2="$flag $$2" + fi +done + +# Prune -I flags if $CC warns about them +xt_FLAGS='' +for flag in $$2 +do + case "$flag" in + -I*) + XIPH_GCC_WARNING([$flag], [], [xt_FLAGS="$xt_FLAGS $flag"]) + ;; + *) + xt_FLAGS="$xt_FLAGS $flag" + ;; + esac +done +$2="$xt_FLAGS" +])dnl XIPH_CLEAN_CCFLAGS + +dnl XIPH_VAR_APPEND +dnl Karl Heyes +dnl +# XIPH_VAR_APPEND(shell-var, list) +# Append each item in list to shell-var iff shell-var doesn't already have it +# eg XIPH_VAR_APPEND([CFLAGS], [-O2 -I/opt/packages/include]) +AC_DEFUN([XIPH_VAR_APPEND], +[dnl +AC_REQUIRE([AC_PROG_FGREP]) +for arg in $2 +do + if { cat < /dev/null + then + $1="$$1 $arg" + fi +done +])dnl XIPH_VAR_APPEND + +dnl XIPH_VAR_PREPEND +dnl Karl Heyes +dnl +# XIPH_VAR_PREPEND(shell-var, list) +# see XIPH_VAR_APPEND +AC_DEFUN([XIPH_VAR_PREPEND], +[dnl +AC_REQUIRE([AC_PROG_FGREP]) +xt_compare="$$1" +xt_filtered="" +for arg in $2 +do + if { cat < /dev/null + then + xt_compare="$arg $xt_compare" + xt_filtered="$xt_filtered $arg" + fi +done +$1="$xt_filtered $$1" +])dnl XIPH_VAR_PREPEND + +dnl XIPH_C__FUNC__ +dnl Karl Heyes 07/2004 +AC_DEFUN([XIPH_C__FUNC__], +[dnl +AC_MSG_CHECKING([for __func__]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[const char *x = __func__;])], + [ AC_MSG_RESULT([yes])], + [ AH_TEMPLATE([__func__], [Replace __func__ if not supported]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[const char *x = __FUNCTION__;])], + [ AC_DEFINE([__func__],[__FUNCTION__]) + AC_MSG_RESULT([Using __FUNCTION__])], + [ AC_DEFINE([__func__],["__FILE__"]) + AC_MSG_RESULT([using __FILE__]) + ]) + ]) +])dnl XIPH_C__FUNC__ + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_net.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_net.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_net.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_net.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,26 @@ +# XIPH_NET +# Perform tests required by the net module +AC_DEFUN([XIPH_NET], +[dnl +AC_REQUIRE([XIPH_TYPE_SOCKLEN_T]) +AC_REQUIRE([XIPH_FUNC_VA_COPY]) +AC_CHECK_HEADERS([sys/select.h sys/uio.h]) +AC_CHECK_HEADER([winsock2.h], + [AC_DEFINE([HAVE_WINSOCK2_H], [1], [Define if you have winsock2.h on MINGW]) + LIBS="$LIBS -lwsock32"]) + +# These tests are ordered based on solaris 8 tests +AC_SEARCH_LIBS([sethostent], [nsl], + [AC_DEFINE([HAVE_SETHOSTENT], [1], + [Define if you have the sethostent function])]) +AC_SEARCH_LIBS([getnameinfo], [socket], + [AC_DEFINE([HAVE_GETNAMEINFO], [1], + [Define if you have the getnameinfo function])]) +AC_CHECK_FUNCS([endhostent getaddrinfo inet_aton writev]) + +# Irix defines INET_PTON but not sockaddr_storage! +AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family], + [AC_CHECK_FUNCS([inet_pton])],, + [#include +#include ]) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_openssl.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_openssl.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_openssl.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_openssl.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,49 @@ +dnl XIPH_PATH_OPENSSL([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Karl Heyes +dnl Test for openssl, and define OPENSSL_CFLAGS and OPENSSL_LIBS +dnl +AC_DEFUN([XIPH_PATH_OPENSSL], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(openssl, + AC_HELP_STRING([--with-openssl=PFX],[Prefix where openssl is installed (optional)]), + openssl_prefix="$withval", openssl_prefix="") + +if test "x$openssl_prefix" != "x" -a "x$openssl_prefix" != "xyes"; then + OPENSSL_LIBS="-L$openssl_prefix/lib -lssl" + OPENSSL_CFLAGS="-I$openssl_prefix/include" +else + AC_PATH_PROG([PKGCONFIG], [pkg-config], [no]) + if test "$PKGCONFIG" != "no" && `$PKGCONFIG --exists openssl`; then + OPENSSL_CFLAGS=`$PKGCONFIG --cflags openssl` + OPENSSL_LIBS=`$PKGCONFIG --libs openssl` + else + if test "x$prefix" = "xNONE"; then + openssl_prefix="/usr/local" + else + openssl_prefix="$prefix" + fi + OPENSSL_LIBS="-L$openssl_prefix/lib -lssl" + OPENSSL_CFLAGS="-I$openssl_prefix/include" + fi +fi + +# Now try linking to openssl +xt_save_CFLAGS="$CFLAGS" +xt_save_LIBS="$LIBS" +CFLAGS="$CFLAGS $OPENSSL_CFLAGS" +LIBS="$OPENSSL_LIBS $LIBS" +AC_TRY_LINK([#include ], [void *a = SSL_new], [openssl_ok='yes']) +CFLAGS="$xt_save_CFLAGS" +LIBS="$xt_save_LIBS" + +if test "$openssl_ok" = "yes"; then + AC_DEFINE(HAVE_OPENSSL, 1, [Define if you have libopenssl.]) + ifelse([$1], , :, [$1]) +else + OPENSSL_LIBS="" + OPENSSL_CFLAGS="" + ifelse([$2], , :, [$2]) +fi +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_types.m4 mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_types.m4 --- mixxx-2.2.3~dfsg/lib/libshout/m4/xiph_types.m4 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/m4/xiph_types.m4 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,59 @@ +dnl xiph_types.m4 +dnl macros for type checks not covered by autoconf + +dnl XIPH_C99_INTTYPES +dnl Brendan Cully +dnl +# XIPH_C99_INTTYPES +# Check for C99 integer type definitions, or define if missing +AC_DEFUN([XIPH_C99_INTTYPES], +[dnl +AC_CHECK_HEADERS([inttypes.h]) +AC_CHECK_TYPE([uint32_t], + [AC_DEFINE(HAVE_C99_INTTYPES, 1, [Define if you have the C99 integer types])], + [AC_CHECK_SIZEOF(short) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(long long)]) +AH_VERBATIM([X_HAVE_C99_INTTYPES], + [#ifndef HAVE_C99_INTTYPES +# if SIZEOF_SHORT == 4 +typedef unsigned short uint32_t; +# elif SIZEOF_INT == 4 +typedef unsigned int uint32_t; +# elif SIZEOF_LONG == 4 +typedef unsigned long uint32_t; +# endif +# if SIZEOF_INT == 8 +typedef unsigned int uint64_t; +# elif SIZEOF_LONG == 8 +typedef unsigned long uint64_t; +# elif SIZEOF_LONG_LONG == 8 +typedef unsigned long long uint64_t; +# endif +#endif + ]) +]) + +dnl XIPH_TYPE_SOCKLEN_T +dnl Brendan Cully +dnl +# XIPH_TYPE_SOCKLEN_T +# Check for socklen_t, or define as int if missing +AC_DEFUN([XIPH_TYPE_SOCKLEN_T], +[dnl +AC_CHECK_HEADERS([sys/socket.h]) +AC_CHECK_TYPES([socklen_t],,, + [#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_SOCKET_H +# include +#endif + ]) +AH_VERBATIM([X_HAVE_SOCKLEN_T], + [#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif + ]) +]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,30 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = 1.6 foreign +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = include src examples doc win32 + +EXTRA_DIST = INSTALL m4/shout.m4 m4/acx_pthread.m4 \ + m4/ogg.m4 m4/vorbis.m4 m4/xiph_compiler.m4 m4/xiph_net.m4 \ + m4/xiph_types.m4 libshout.ckport + +docdir = $(datadir)/doc/$(PACKAGE) +doc_DATA = COPYING NEWS README examples/example.c examples/nonblocking.c + +m4datadir = $(datadir)/aclocal +m4data_DATA = m4/shout.m4 + +ckportdir = $(libdir)/ckport/db +ckport_DATA = libshout.ckport + +if HAVE_PKGCONFIG + pkgconfigdir = $(libdir)/pkgconfig + pkgconfig_DATA = shout.pc +endif + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff -Nru mixxx-2.2.3~dfsg/lib/libshout/NEWS mixxx-2.2.4~dfsg/lib/libshout/NEWS --- mixxx-2.2.3~dfsg/lib/libshout/NEWS 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/NEWS 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,49 @@ +libshout 2.4.1 (20151120) + +* Fixed issue with missing file in distribution + +libshout 2.4.0 (20151111) + +* Audio only WebM support. +* Protocol level meta data support improved. + Some API calls got replaced and marked as obsolete. +* Code hardened. +* Fixed overlinking. +* Removed Debian packaging. +* TLS support (RFC2818 and RFC2817, mode can be autodetected). +* Improved HTTP protocol: + * Set Host:-header (vhosting), + * Check for server capabilities. +* Basic support for RoarAudio protocol. + +libshout 2.3.1 (20120525) + +* Opus support + +libshout 2.3.0 (20120201) + +* Rough WebM support +* removed the shout-config script + +libshout 2.2.2 (20060619) + +* Handle Oggs that don't begin with zero granulepos. +* Install header in correct location (broken in 2.2.1). +* Theora memory leak fix. +* Non-blocking shout_open was failing unnecessarily in the + connect_pending state. +* Cast some size_ts to ints for display purposes. + +libshout 2.2.1 (20060417) + +* Fix error handling while opening a connection, so that shout_open + can be retried. +* pkgconfig fix for header installation +* Fix a memory leak in HTTP authentication + +libshout 2.2 (20060103) + +* Speex support +* Fix a double-free bug when login fails +* More robust server response parser +* Theora timing fix diff -Nru mixxx-2.2.3~dfsg/lib/libshout/patches/01-libshout-tls-compile-with-OpenSSL-1.1.0.patch mixxx-2.2.4~dfsg/lib/libshout/patches/01-libshout-tls-compile-with-OpenSSL-1.1.0.patch --- mixxx-2.2.3~dfsg/lib/libshout/patches/01-libshout-tls-compile-with-OpenSSL-1.1.0.patch 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/patches/01-libshout-tls-compile-with-OpenSSL-1.1.0.patch 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,58 @@ +From 01fafc449f0de56743d08e7976933c49e2915bfa Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 15 Nov 2017 12:46:25 +0000 +Subject: [PATCH] tls: compile with OpenSSL 1.1.0 + +The init functions are not longer required in OpenSSL 1.1 so I dropped +them. + +TLSv1_client_method() should not be used because it enables only the +TLSv1.0 protocol. Better is to use SSLv23_client_method() which enable +all the protocols including TLSv1.2. With this functions SSLv2 and SSLv3 +is theoretically possible but as of today those protocols are usually +build-time disabled. +To avoid all this OpenSSL 1.1 provides TLS_client_method() which is aim +to provide to highest TLS protocol version (same as +SSLv23_client_method() but it is deprecated in 1.1). + +Signed-off-by: Sebastian Andrzej Siewior +--- + src/tls.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/src/tls.c b/src/tls.c +index 4562c7327077..e0e5c1a5f079 100644 +--- a/src/tls.c ++++ b/src/tls.c +@@ -24,6 +24,7 @@ + #endif + + #include ++#include + #include "shout_private.h" + + #ifndef XXX_HAVE_X509_check_host +@@ -61,14 +62,17 @@ shout_tls_t *shout_tls_new(shout_t *self, sock_t socket) + + static inline int tls_setup(shout_tls_t *tls) + { +- SSL_METHOD *meth; +- ++ const SSL_METHOD *meth; ++#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) + SSL_library_init(); + SSL_load_error_strings(); + SSLeay_add_all_algorithms(); +- SSLeay_add_ssl_algorithms(); ++ SSLeay_add_ssl_algorithms(); + +- meth = TLSv1_client_method(); ++ meth = SSLv23_client_method(); ++#else ++ meth = TLS_client_method(); ++#endif + if (!meth) + goto error; + +-- +2.15.0 diff -Nru mixxx-2.2.3~dfsg/lib/libshout/README mixxx-2.2.4~dfsg/lib/libshout/README --- mixxx-2.2.3~dfsg/lib/libshout/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ +libshout +-------- + +Libshout is a library for communicating with and sending data to an +icecast server. It handles the socket connection, the timing of the +data, and prevents bad data from getting to the icecast server. + +With just a few lines of code, a programmer can easily turn any application +into a streaming source for an icecast server. Libshout also allows +developers who want a specific feature set (database access, request taking) +to concentrate on that feature set, instead of worrying about how server +communication works. + +Please refer to the api reference and example code to start learning how to +use libshout in your own code. + +Libshout is licensed under the LGPL. Please see the COPYING file for details. + +If you have any questions or comments, please visit us at +http://www.icecast.org or email us at team@icecast.org. diff -Nru mixxx-2.2.3~dfsg/lib/libshout/SConscript mixxx-2.2.4~dfsg/lib/libshout/SConscript --- mixxx-2.2.3~dfsg/lib/libshout/SConscript 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/SConscript 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +Import('env') +env = env.Clone() + +libshout_sources = [ + 'src/common/avl/avl.c', + 'src/common/net/sock.c', + 'src/common/net/resolver.c', + 'src/common/timing/timing.c', + 'src/common/httpp/httpp.c', + 'src/common/httpp/encoding.c', + 'src/common/thread/thread.c', + 'src/shout.c', + 'src/util.c', + 'src/queue.c', + 'src/proto_http.c', + 'src/proto_xaudiocast.c', + 'src/proto_icy.c', + 'src/proto_roaraudio.c', + 'src/format_ogg.c', + 'src/format_webm.c', + 'src/format_mp3.c', + 'src/codec_vorbis.c', + 'src/codec_opus.c', + 'src/codec_theora.c', + 'src/codec_speex.c', + 'src/tls.c' +] + +env.Append(CPPDEFINES='HAVE_CONFIG_H') +env.Append(CPPPATH='src/common') +env.Append(CPPPATH='include') + +libshout_mixxx = env.StaticLibrary(target='libshout_mixxx', source=libshout_sources) + +# Install the libraries if needed. +if 'LIB_OUTPUT' in env.Dictionary(): + env.Install('$LIB_OUTPUT', source=[libshout_mixxx]) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/shout.pc.in mixxx-2.2.4~dfsg/lib/libshout/shout.pc.in --- mixxx-2.2.3~dfsg/lib/libshout/shout.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/shout.pc.in 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,15 @@ +# libshout pkg-config source file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +cppflags=@SHOUT_CPPFLAGS@ +cflags_only=@SHOUT_CFLAGS@ + +Name: Shout +Description: Audio streaming library for icecast encoders +Version: @VERSION@ +Requires.private: @SHOUT_REQUIRES@ +Libs: -L${libdir} -lshout +Cflags: -I${includedir} @PTHREAD_CPPFLAGS@ @SHOUT_CFLAGS@ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/codec_opus.c mixxx-2.2.4~dfsg/lib/libshout/src/codec_opus.c --- mixxx-2.2.3~dfsg/lib/libshout/src/codec_opus.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/codec_opus.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,284 @@ +/* -*- c-basic-offset: 8; -*- */ +/* opus.c: Ogg Opus data handlers for libshout + * + * Copyright (C) 2005 the Icecast team + * Copyright (C) 2011,2012 Xiph.Org Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +#include + +#include "shout_private.h" +#include "format_ogg.h" + +/* -- local data structures -- */ +typedef struct { + int version; + int channels; /* Number of channels: 1..255 */ + int preskip; + uint32_t input_sample_rate; + int gain; /* in dB S7.8 should be zero whenever possible */ + int channel_mapping; + /* The rest is only used if channel_mapping != 0 */ + int nb_streams; + int nb_coupled; + unsigned char stream_map[255]; +} OpusHeader; + +typedef struct { + OpusHeader oh; + int skipped; +} opus_data_t; + +typedef struct { + const unsigned char *data; + int maxlen; + int pos; +} ROPacket; + +/* -- local prototypes -- */ +static int read_opus_page(ogg_codec_t *codec, ogg_page *page); +static void free_opus_data(void *codec_data); +static int opus_header_parse(const unsigned char *header, int len, OpusHeader *h); + +/* -- header functions -- */ + +static int read_uint32(ROPacket *p, uint32_t *val) +{ + if (p->pos>p->maxlen-4) + return 0; + *val = (uint32_t)p->data[p->pos ]; + *val |= (uint32_t)p->data[p->pos+1]<< 8; + *val |= (uint32_t)p->data[p->pos+2]<<16; + *val |= (uint32_t)p->data[p->pos+3]<<24; + p->pos += 4; + return 1; +} + +static int read_uint16(ROPacket *p, uint16_t *val) +{ + if (p->pos>p->maxlen-2) + return 0; + *val = (uint16_t)p->data[p->pos ]; + *val |= (uint16_t)p->data[p->pos+1]<<8; + p->pos += 2; + return 1; +} + +static int read_chars(ROPacket *p, unsigned char *str, int nb_chars) +{ + int i; + if (p->pos>p->maxlen-nb_chars) + return 0; + for (i=0;idata[p->pos++]; + return 1; +} + +static int opus_header_parse(const unsigned char *packet, int len, OpusHeader *h) +{ + int i; + char str[9]; + ROPacket p; + unsigned char ch; + uint16_t shortval; + + p.data = packet; + p.maxlen = len; + p.pos = 0; + str[8] = 0; + if(len<19)return 0; + read_chars(&p, (unsigned char*)str, 8); + if (strcmp(str, "OpusHead")!=0) + return 0; + + if (!read_chars(&p, &ch, 1)) + return 0; + h->version = ch; + if((h->version&240) != 0) /* Only major version 0 supported. */ + return 0; + + if (!read_chars(&p, &ch, 1)) + return 0; + h->channels = ch; + if (h->channels == 0) + return 0; + + if (!read_uint16(&p, &shortval)) + return 0; + h->preskip = shortval; + + if (!read_uint32(&p, &h->input_sample_rate)) + return 0; + + if (!read_uint16(&p, &shortval)) + return 0; + h->gain = (short)shortval; + + if (!read_chars(&p, &ch, 1)) + return 0; + h->channel_mapping = ch; + + if (h->channel_mapping != 0) + { + if (!read_chars(&p, &ch, 1)) + return 0; + h->nb_streams = ch; + + if (!read_chars(&p, &ch, 1)) + return 0; + h->nb_coupled = ch; + + /* Multi-stream support */ + for (i=0;ichannels;i++) + { + if (!read_chars(&p, &h->stream_map[i], 1)) + return 0; + } + } else { + h->nb_streams = 1; + h->nb_coupled = h->channels>1; + h->stream_map[0]=0; + h->stream_map[1]=1; + } + /*For version 0/1 we know there won't be any more data + so reject any that have data past the end.*/ + if ((h->version==0 || h->version==1) && p.pos != len) + return 0; + return 1; +} + +/* From libopus, src/opus_decode.c */ +static int packet_get_samples_per_frame(const unsigned char *data, int32_t Fs) +{ + int audiosize; + if (data[0]&0x80) + { + audiosize = ((data[0]>>3)&0x3); + audiosize = (Fs<>3)&0x3); + if (audiosize == 3) + audiosize = Fs*60/1000; + else + audiosize = (Fs<os, &packet); + + if (!opus_header_parse(packet.packet,packet.bytes,&opus_data->oh)) { + free_opus_data(opus_data); + return SHOUTERR_UNSUPPORTED; + } + opus_data->skipped = 0; + + codec->codec_data = opus_data; + codec->read_page = read_opus_page; + codec->free_data = free_opus_data; + + return SHOUTERR_SUCCESS; +} + +static int read_opus_page(ogg_codec_t *codec, ogg_page *page) +{ + ogg_packet packet; + opus_data_t *opus_data = codec->codec_data; + + (void)page; + + /* We use the strategy of counting the packet times and ignoring + the granpos. This has the advantage of needing less code to + sanely handle non-zero starttimes and slightly saner behavior + on files with holes. */ + while (ogg_stream_packetout (&codec->os, &packet) > 0){ + if(packet.bytes>0 && (packet.bytes<2 || memcmp(packet.packet, "Op",2)!=0)){ + int32_t spf; + spf = packet_get_samples_per_frame(packet.packet,48000); + if(spf>0){ + int32_t spp; + spp=packet_get_nb_frames(packet.packet,packet.bytes); + if(spp>0){ + int needskip; + needskip=opus_data->oh.preskip-opus_data->skipped; + spp*=spf; + /*Opus files can begin with some frames which are + just there to prime the decoder and are not played + these should just be sent as fast as we get them.*/ + if(needskip>0){ + int skip; + skip = sppskipped+=skip; + } + codec->senttime += ((spp * 1000000ULL) / 48000ULL); + } + }else if (packet.bytes>=19 && memcmp(packet.packet, "OpusHead",8)==0){ + /* We appear to be chaining, reset skip to burst the pregap. */ + if(opus_header_parse(packet.packet,packet.bytes,&opus_data->oh)) + opus_data->skipped=0; + } + } + } + + return SHOUTERR_SUCCESS; +} + +static void free_opus_data(void *codec_data) +{ + free(codec_data); +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/codec_speex.c mixxx-2.2.4~dfsg/lib/libshout/src/codec_speex.c --- mixxx-2.2.3~dfsg/lib/libshout/src/codec_speex.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/codec_speex.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,90 @@ +/* -*- c-basic-offset: 8; -*- */ +/* speex.c: Ogg Speex data handlers for libshout + * + * Copyright (C) 2005 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "shout_private.h" +#include "format_ogg.h" + +/* -- local data structures -- */ +typedef struct { + SpeexHeader *sh; +} speex_data_t; + +/* -- local prototypes -- */ +static int read_speex_page(ogg_codec_t *codec, ogg_page *page); +static void free_speex_data(void *codec_data); + +/* -- speex functions -- */ +int _shout_open_speex(ogg_codec_t *codec, ogg_page *page) +{ + speex_data_t *speex_data = calloc(1, sizeof(speex_data_t)); + ogg_packet packet; + + (void)page; + + if (!speex_data) + return SHOUTERR_MALLOC; + + ogg_stream_packetout(&codec->os, &packet); + + if (!(speex_data->sh = speex_packet_to_header((char*)packet.packet,packet.bytes))) { + free_speex_data(speex_data); + + return SHOUTERR_UNSUPPORTED; + } + + codec->codec_data = speex_data; + codec->read_page = read_speex_page; + codec->free_data = free_speex_data; + + return SHOUTERR_SUCCESS; +} + +static int read_speex_page(ogg_codec_t *codec, ogg_page *page) +{ + ogg_packet packet; + speex_data_t *speex_data = codec->codec_data; + uint64_t samples = 0; + + (void)page; + + while (ogg_stream_packetout (&codec->os, &packet) > 0) + samples += speex_data->sh->frames_per_packet * speex_data->sh->frame_size; + + codec->senttime += ((samples * 1000000) / speex_data->sh->rate); + + return SHOUTERR_SUCCESS; +} + +static void free_speex_data(void *codec_data) +{ + speex_data_t *speex_data = (speex_data_t *)codec_data; + + if (speex_data->sh) + free(speex_data->sh); + + free(speex_data); +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/codec_theora.c mixxx-2.2.4~dfsg/lib/libshout/src/codec_theora.c --- mixxx-2.2.3~dfsg/lib/libshout/src/codec_theora.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/codec_theora.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,154 @@ +/* -*- c-basic-offset: 8; -*- */ +/* theora.c: Ogg Theora data handlers for libshout + * $Id$ + * + * Copyright (C) 2004 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef HAVE_INTTYPES_H +# include +#endif +#include + +#include + +#include "shout_private.h" +#include "format_ogg.h" + +/* -- local data structures -- */ +typedef struct { + theora_info ti; + theora_comment tc; + uint32_t granule_shift; + double per_frame; + uint64_t start_frame; + int initial_frames; + int get_start_frame; +} theora_data_t; + +/* -- local prototypes -- */ +static int read_theora_page(ogg_codec_t *codec, ogg_page *page); +static void free_theora_data(void *codec_data); +static int theora_ilog(unsigned int v); + +/* -- theora functions -- */ +int _shout_open_theora(ogg_codec_t *codec, ogg_page *page) +{ + ogg_packet packet; + + (void)page; + + theora_data_t *theora_data = calloc(1, sizeof(theora_data_t)); + if (! theora_data) + return SHOUTERR_MALLOC; + + theora_info_init(&theora_data->ti); + theora_comment_init(&theora_data->tc); + + ogg_stream_packetout(&codec->os, &packet); + + if (theora_decode_header(&theora_data->ti, &theora_data->tc, &packet) < 0) { + free_theora_data(theora_data); + + return SHOUTERR_UNSUPPORTED; + } + + codec->codec_data = theora_data; + codec->read_page = read_theora_page; + codec->free_data = free_theora_data; + codec->headers = 1; + theora_data->initial_frames = 0; + + return SHOUTERR_SUCCESS; +} + +static int read_theora_page(ogg_codec_t *codec, ogg_page *page) +{ + theora_data_t *theora_data = codec->codec_data; + ogg_packet packet; + ogg_int64_t granulepos, iframe, pframe; + + granulepos = ogg_page_granulepos(page); + + if (granulepos == 0) + { + while (ogg_stream_packetout(&codec->os, &packet) > 0) { + if (theora_decode_header(&theora_data->ti, &theora_data->tc, &packet) < 0) + return SHOUTERR_INSANE; + codec->headers++; + } + if (codec->headers == 3) + { + theora_data->granule_shift = theora_ilog(theora_data->ti.keyframe_frequency_force - 1); + theora_data->per_frame = (double)theora_data->ti.fps_denominator / theora_data->ti.fps_numerator * 1000000; + theora_data->get_start_frame = 1; + } + + return SHOUTERR_SUCCESS; + } + + while (ogg_stream_packetout(&codec->os, &packet) > 0) + { + if (theora_data->get_start_frame) + theora_data->initial_frames++; + } + if (granulepos > 0 && codec->headers >= 3) + { + iframe = granulepos >> theora_data->granule_shift; + pframe = granulepos - (iframe << theora_data->granule_shift); + + if (theora_data->get_start_frame) + { + /* work out the real start frame, which may not be 0 */ + theora_data->start_frame = iframe + pframe - theora_data->initial_frames; + codec->senttime = 0; + theora_data->get_start_frame = 0; + } + else + { + uint64_t frames = ((iframe + pframe) - theora_data->start_frame); + codec->senttime = (uint64_t)(frames * theora_data->per_frame); + } + } + + return SHOUTERR_SUCCESS; +} + +static void free_theora_data(void *codec_data) +{ + theora_data_t *theora_data = (theora_data_t *)codec_data; + + theora_info_clear(&theora_data->ti); + theora_comment_clear(&theora_data->tc); + free(theora_data); +} + +static int theora_ilog(unsigned int v) +{ + int ret = 0; + + while (v) { + ret++; + v >>= 1; + } + + return ret; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/codec_vorbis.c mixxx-2.2.4~dfsg/lib/libshout/src/codec_vorbis.c --- mixxx-2.2.3~dfsg/lib/libshout/src/codec_vorbis.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/codec_vorbis.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,124 @@ +/* -*- c-basic-offset: 8; -*- */ +/* vorbis.c: Ogg Vorbis data handlers for libshout + * $Id$ + * + * Copyright (C) 2002-2004 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef HAVE_INTTYPES_H +#include +#endif +#include + +#include + +#include "shout_private.h" +#include "format_ogg.h" + +/* -- local data structures -- */ +typedef struct { + vorbis_info vi; + vorbis_comment vc; + int prevW; +} vorbis_data_t; + +/* -- local prototypes -- */ +static int read_vorbis_page(ogg_codec_t *codec, ogg_page *page); +static void free_vorbis_data(void *codec_data); +static int vorbis_blocksize(vorbis_data_t *vd, ogg_packet *p); + +/* -- vorbis functions -- */ +int _shout_open_vorbis(ogg_codec_t *codec, ogg_page *page) +{ + vorbis_data_t *vorbis_data = calloc(1, sizeof(vorbis_data_t)); + ogg_packet packet; + + (void)page; + + if (!vorbis_data) + return SHOUTERR_MALLOC; + + vorbis_info_init(&vorbis_data->vi); + vorbis_comment_init(&vorbis_data->vc); + + ogg_stream_packetout(&codec->os, &packet); + + if (vorbis_synthesis_headerin(&vorbis_data->vi, &vorbis_data->vc, &packet) < 0) { + free_vorbis_data(vorbis_data); + + return SHOUTERR_UNSUPPORTED; + } + + codec->codec_data = vorbis_data; + codec->read_page = read_vorbis_page; + codec->free_data = free_vorbis_data; + + return SHOUTERR_SUCCESS; +} + +static int read_vorbis_page(ogg_codec_t *codec, ogg_page *page) +{ + ogg_packet packet; + vorbis_data_t *vorbis_data = codec->codec_data; + uint64_t samples = 0; + + (void)page; + + if (codec->headers < 3) { + while (ogg_stream_packetout (&codec->os, &packet) > 0) { + if (vorbis_synthesis_headerin(&vorbis_data->vi, &vorbis_data->vc, &packet) < 0) + return SHOUTERR_INSANE; + codec->headers++; + } + + return SHOUTERR_SUCCESS; + } + + while (ogg_stream_packetout (&codec->os, &packet) > 0) + samples += vorbis_blocksize(vorbis_data, &packet); + + codec->senttime += ((samples * 1000000) / vorbis_data->vi.rate); + + return SHOUTERR_SUCCESS; +} + +static void free_vorbis_data(void *codec_data) +{ + vorbis_data_t *vorbis_data = (vorbis_data_t *)codec_data; + + vorbis_info_clear(&vorbis_data->vi); + vorbis_comment_clear(&vorbis_data->vc); + free(vorbis_data); +} + +static int vorbis_blocksize(vorbis_data_t *vd, ogg_packet *p) +{ + int this = vorbis_packet_blocksize(&vd->vi, p); + int ret = (this + vd->prevW)/4; + + if(!vd->prevW) { + vd->prevW = this; + return 0; + } + + vd->prevW = this; + return ret; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.c mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,1194 @@ +/* + * Copyright (C) 1995-1997 by Sam Rushing + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appear in all + * copies and that both that copyright notice and this permission + * notice appear in supporting documentation, and that the name of Sam + * Rushing not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. + * + * SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + * NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +/* $Id: avl.c,v 1.11 2004/01/27 02:16:25 karl Exp $ */ + +/* + * This is a fairly straightfoward translation of a prototype + * written in python, 'avl_tree.py'. Read that file first. + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#include "avl.h" + +avl_node * +avl_node_new (void * key, + avl_node * parent) +{ + avl_node * node = (avl_node *) malloc (sizeof (avl_node)); + + if (!node) { + return NULL; + } else { + node->parent = parent; + node->key = key; + node->left = NULL; + node->right = NULL; + node->rank_and_balance = 0; + AVL_SET_BALANCE (node, 0); + AVL_SET_RANK (node, 1); +#ifdef HAVE_AVL_NODE_LOCK + thread_rwlock_create(&node->rwlock); +#endif + return node; + } +} + +avl_tree * +avl_tree_new (avl_key_compare_fun_type compare_fun, + void * compare_arg) +{ + avl_tree * t = (avl_tree *) malloc (sizeof (avl_tree)); + + if (!t) { + return NULL; + } else { + avl_node * root = avl_node_new((void *)NULL, (avl_node *) NULL); + if (!root) { + free (t); + return NULL; + } else { + t->root = root; + t->height = 0; + t->length = 0; + t->compare_fun = compare_fun; + t->compare_arg = compare_arg; + thread_rwlock_create(&t->rwlock); + return t; + } + } +} + +static void +avl_tree_free_helper (avl_node * node, avl_free_key_fun_type free_key_fun) +{ + if (node->left) { + avl_tree_free_helper (node->left, free_key_fun); + } + if (free_key_fun) + free_key_fun (node->key); + if (node->right) { + avl_tree_free_helper (node->right, free_key_fun); + } +#ifdef HAVE_AVL_NODE_LOCK + thread_rwlock_destroy (&node->rwlock); +#endif + free (node); +} + +void +avl_tree_free (avl_tree * tree, avl_free_key_fun_type free_key_fun) +{ + if (tree->length) { + avl_tree_free_helper (tree->root->right, free_key_fun); + } + if (tree->root) { +#ifdef HAVE_AVL_NODE_LOCK + thread_rwlock_destroy(&tree->root->rwlock); +#endif + free (tree->root); + } + thread_rwlock_destroy(&tree->rwlock); + free (tree); +} + +int +avl_insert (avl_tree * ob, + void * key) +{ + if (!(ob->root->right)) { + avl_node * node = avl_node_new (key, ob->root); + if (!node) { + return -1; + } else { + ob->root->right = node; + ob->length = ob->length + 1; + return 0; + } + } else { /* not self.right == None */ + avl_node *t, *p, *s, *q, *r; + int a; + + t = ob->root; + s = p = t->right; + + while (1) { + if (ob->compare_fun (ob->compare_arg, key, p->key) < 1) { + /* move left */ + AVL_SET_RANK (p, (AVL_GET_RANK (p) + 1)); + q = p->left; + if (!q) { + /* insert */ + avl_node * q_node = avl_node_new (key, p); + if (!q_node) { + return (-1); + } else { + q = q_node; + p->left = q; + break; + } + } else if (AVL_GET_BALANCE(q)) { + t = p; + s = q; + } + p = q; + } else { + /* move right */ + q = p->right; + if (!q) { + /* insert */ + avl_node * q_node = avl_node_new (key, p); + if (!q_node) { + return -1; + } else { + q = q_node; + p->right = q; + break; + } + } else if (AVL_GET_BALANCE(q)) { + t = p; + s = q; + } + p = q; + } + } + + ob->length = ob->length + 1; + + /* adjust balance factors */ + if (ob->compare_fun (ob->compare_arg, key, s->key) < 1) { + r = p = s->left; + } else { + r = p = s->right; + } + while (p != q) { + if (ob->compare_fun (ob->compare_arg, key, p->key) < 1) { + AVL_SET_BALANCE (p, -1); + p = p->left; + } else { + AVL_SET_BALANCE (p, +1); + p = p->right; + } + } + + /* balancing act */ + + if (ob->compare_fun (ob->compare_arg, key, s->key) < 1) { + a = -1; + } else { + a = +1; + } + + if (AVL_GET_BALANCE (s) == 0) { + AVL_SET_BALANCE (s, a); + ob->height = ob->height + 1; + return 0; + } else if (AVL_GET_BALANCE (s) == -a) { + AVL_SET_BALANCE (s, 0); + return 0; + } else if (AVL_GET_BALANCE(s) == a) { + if (AVL_GET_BALANCE (r) == a) { + /* single rotation */ + p = r; + if (a == -1) { + s->left = r->right; + if (r->right) { + r->right->parent = s; + } + r->right = s; + s->parent = r; + AVL_SET_RANK (s, (AVL_GET_RANK (s) - AVL_GET_RANK (r))); + } else { + s->right = r->left; + if (r->left) { + r->left->parent = s; + } + r->left = s; + s->parent = r; + AVL_SET_RANK (r, (AVL_GET_RANK (r) + AVL_GET_RANK (s))); + } + AVL_SET_BALANCE (s, 0); + AVL_SET_BALANCE (r, 0); + } else if (AVL_GET_BALANCE (r) == -a) { + /* double rotation */ + if (a == -1) { + p = r->right; + r->right = p->left; + if (p->left) { + p->left->parent = r; + } + p->left = r; + r->parent = p; + s->left = p->right; + if (p->right) { + p->right->parent = s; + } + p->right = s; + s->parent = p; + AVL_SET_RANK (p, (AVL_GET_RANK (p) + AVL_GET_RANK (r))); + AVL_SET_RANK (s, (AVL_GET_RANK (s) - AVL_GET_RANK (p))); + } else { + p = r->left; + r->left = p->right; + if (p->right) { + p->right->parent = r; + } + p->right = r; + r->parent = p; + s->right = p->left; + if (p->left) { + p->left->parent = s; + } + p->left = s; + s->parent = p; + AVL_SET_RANK (r, (AVL_GET_RANK (r) - AVL_GET_RANK (p))); + AVL_SET_RANK (p, (AVL_GET_RANK (p) + AVL_GET_RANK (s))); + } + if (AVL_GET_BALANCE (p) == a) { + AVL_SET_BALANCE (s, -a); + AVL_SET_BALANCE (r, 0); + } else if (AVL_GET_BALANCE (p) == -a) { + AVL_SET_BALANCE (s, 0); + AVL_SET_BALANCE (r, a); + } else { + AVL_SET_BALANCE (s, 0); + AVL_SET_BALANCE (r, 0); + } + AVL_SET_BALANCE (p, 0); + } + /* finishing touch */ + if (s == t->right) { + t->right = p; + } else { + t->left = p; + } + p->parent = t; + } + } + return 0; +} + +int +avl_get_by_index (avl_tree * tree, + unsigned long index, + void ** value_address) +{ + avl_node * p = tree->root->right; + unsigned long m = index + 1; + while (1) { + if (!p) { + return -1; + } + if (m < AVL_GET_RANK(p)) { + p = p->left; + } else if (m > AVL_GET_RANK(p)) { + m = m - AVL_GET_RANK(p); + p = p->right; + } else { + *value_address = p->key; + return 0; + } + } +} + +int +avl_get_by_key (avl_tree * tree, + void * key, + void **value_address) +{ + avl_node * x = tree->root->right; + if (!x) { + return -1; + } + while (1) { + int compare_result = tree->compare_fun (tree->compare_arg, key, x->key); + if (compare_result < 0) { + if (x->left) { + x = x->left; + } else { + return -1; + } + } else if (compare_result > 0) { + if (x->right) { + x = x->right; + } else { + return -1; + } + } else { + *value_address = x->key; + return 0; + } + } +} + +int avl_delete(avl_tree *tree, void *key, avl_free_key_fun_type free_key_fun) +{ + avl_node *x, *y, *p, *q, *r, *top, *x_child; + int shortened_side, shorter; + + x = tree->root->right; + if (!x) { + return -1; + } + while (1) { + int compare_result = tree->compare_fun (tree->compare_arg, key, x->key); + if (compare_result < 0) { + /* move left + * We will be deleting from the left, adjust this node's + * rank accordingly + */ + AVL_SET_RANK (x, (AVL_GET_RANK(x) - 1)); + if (x->left) { + x = x->left; + } else { + /* Oops! now we have to undo the rank changes + * all the way up the tree + */ + AVL_SET_RANK(x, (AVL_GET_RANK (x) + 1)); + while (x != tree->root->right) { + if (x->parent->left == x) { + AVL_SET_RANK(x->parent, (AVL_GET_RANK (x->parent) + 1)); + } + x = x->parent; + } + return -1; /* key not in tree */ + } + } else if (compare_result > 0) { + /* move right */ + if (x->right) { + x = x->right; + } else { + AVL_SET_RANK(x, (AVL_GET_RANK (x) + 1)); + while (x != tree->root->right) { + if (x->parent->left == x) { + AVL_SET_RANK(x->parent, (AVL_GET_RANK (x->parent) + 1)); + } + x = x->parent; + } + return -1; /* key not in tree */ + } + } else { + break; + } + } + + if (x->left && x->right) { + void * temp_key; + + /* The complicated case. + * reduce this to the simple case where we are deleting + * a node with at most one child. + */ + + /* find the immediate predecessor */ + y = x->left; + while (y->right) { + y = y->right; + } + /* swap with */ + temp_key = x->key; + x->key = y->key; + y->key = temp_key; + /* we know 's left subtree lost a node because that's + * where we took it from + */ + AVL_SET_RANK (x, (AVL_GET_RANK (x) - 1)); + x = y; + } + /* now has at most one child + * scoot this child into the place of + */ + if (x->left) { + x_child = x->left; + x_child->parent = x->parent; + } else if (x->right) { + x_child = x->right; + x_child->parent = x->parent; + } else { + x_child = NULL; + } + + /* now tell 's parent that a grandchild became a child */ + if (x == x->parent->left) { + x->parent->left = x_child; + shortened_side = -1; + } else { + x->parent->right = x_child; + shortened_side = +1; + } + + /* + * the height of the subtree + * has now been shortened. climb back up + * the tree, rotating when necessary to adjust + * for the change. + */ + shorter = 1; + p = x->parent; + + /* return the key and node to storage */ + if (free_key_fun) + free_key_fun (x->key); +#ifdef HAVE_AVL_NODE_LOCK + thread_rwlock_destroy (&x->rwlock); +#endif + free (x); + + while (shorter && p->parent) { + + /* case 1: height unchanged */ + if (AVL_GET_BALANCE(p) == 0) { + if (shortened_side == -1) { + /* we removed a left child, the tree is now heavier + * on the right + */ + AVL_SET_BALANCE (p, +1); + } else { + /* we removed a right child, the tree is now heavier + * on the left + */ + AVL_SET_BALANCE (p, -1); + } + shorter = 0; + + } else if (AVL_GET_BALANCE (p) == shortened_side) { + /* case 2: taller subtree shortened, height reduced */ + AVL_SET_BALANCE (p, 0); + } else { + /* case 3: shorter subtree shortened */ + top = p->parent; + /* set to the taller of the two subtrees of

*/ + if (shortened_side == 1) { + q = p->left; + } else { + q = p->right; + } + if (AVL_GET_BALANCE (q) == 0) { + /* case 3a: height unchanged */ + if (shortened_side == -1) { + /* single rotate left */ + q->parent = p->parent; + p->right = q->left; + if (q->left) { + q->left->parent = p; + } + q->left = p; + p->parent = q; + AVL_SET_RANK (q, (AVL_GET_RANK (q) + AVL_GET_RANK (p))); + } else { + /* single rotate right */ + q->parent = p->parent; + p->left = q->right; + if (q->right) { + q->right->parent = p; + } + q->right = p; + p->parent = q; + AVL_SET_RANK (p, (AVL_GET_RANK (p) - AVL_GET_RANK (q))); + } + shorter = 0; + AVL_SET_BALANCE (q, shortened_side); + AVL_SET_BALANCE (p, (- shortened_side)); + } else if (AVL_GET_BALANCE (q) == AVL_GET_BALANCE (p)) { + /* case 3b: height reduced */ + if (shortened_side == -1) { + /* single rotate left */ + q->parent = p->parent; + p->right = q->left; + if (q->left) { + q->left->parent = p; + } + q->left = p; + p->parent = q; + AVL_SET_RANK (q, (AVL_GET_RANK (q) + AVL_GET_RANK (p))); + } else { + /* single rotate right */ + q->parent = p->parent; + p->left = q->right; + if (q->right) { + q->right->parent = p; + } + q->right = p; + p->parent = q; + AVL_SET_RANK (p, (AVL_GET_RANK (p) - AVL_GET_RANK (q))); + } + shorter = 1; + AVL_SET_BALANCE (q, 0); + AVL_SET_BALANCE (p, 0); + } else { + /* case 3c: height reduced, balance factors opposite */ + if (shortened_side == 1) { + /* double rotate right */ + /* first, a left rotation around q */ + r = q->right; + r->parent = p->parent; + q->right = r->left; + if (r->left) { + r->left->parent = q; + } + r->left = q; + q->parent = r; + /* now, a right rotation around p */ + p->left = r->right; + if (r->right) { + r->right->parent = p; + } + r->right = p; + p->parent = r; + AVL_SET_RANK (r, (AVL_GET_RANK (r) + AVL_GET_RANK (q))); + AVL_SET_RANK (p, (AVL_GET_RANK (p) - AVL_GET_RANK (r))); + } else { + /* double rotate left */ + /* first, a right rotation around q */ + r = q->left; + r->parent = p->parent; + q->left = r->right; + if (r->right) { + r->right->parent = q; + } + r->right = q; + q->parent = r; + /* now a left rotation around p */ + p->right = r->left; + if (r->left) { + r->left->parent = p; + } + r->left = p; + p->parent = r; + AVL_SET_RANK (q, (AVL_GET_RANK (q) - AVL_GET_RANK (r))); + AVL_SET_RANK (r, (AVL_GET_RANK (r) + AVL_GET_RANK (p))); + } + if (AVL_GET_BALANCE (r) == shortened_side) { + AVL_SET_BALANCE (q, (- shortened_side)); + AVL_SET_BALANCE (p, 0); + } else if (AVL_GET_BALANCE (r) == (- shortened_side)) { + AVL_SET_BALANCE (q, 0); + AVL_SET_BALANCE (p, shortened_side); + } else { + AVL_SET_BALANCE (q, 0); + AVL_SET_BALANCE (p, 0); + } + AVL_SET_BALANCE (r, 0); + q = r; + } + /* a rotation has caused (or in case 3c) to become + * the root. let

's former parent know this. + */ + if (top->left == p) { + top->left = q; + } else { + top->right = q; + } + /* end case 3 */ + p = q; + } + x = p; + p = x->parent; + /* shortened_side tells us which side we came up from */ + if (x == p->left) { + shortened_side = -1; + } else { + shortened_side = +1; + } + } /* end while(shorter) */ + /* when we're all done, we're one shorter */ + tree->length = tree->length - 1; + return (0); +} + +static int +avl_iterate_inorder_helper (avl_node * node, + avl_iter_fun_type iter_fun, + void * iter_arg) +{ + int result; + if (node->left) { + result = avl_iterate_inorder_helper (node->left, iter_fun, iter_arg); + if (result != 0) { + return result; + } + } + result = (iter_fun (node->key, iter_arg)); + if (result != 0) { + return result; + } + if (node->right) { + result = avl_iterate_inorder_helper (node->right, iter_fun, iter_arg); + if (result != 0) { + return result; + } + } + return 0; +} + +int +avl_iterate_inorder (avl_tree * tree, + avl_iter_fun_type iter_fun, + void * iter_arg) +{ + int result; + + if (tree->length) { + result = avl_iterate_inorder_helper (tree->root->right, iter_fun, iter_arg); + return (result); + } else { + return 0; + } +} + +avl_node *avl_get_first(avl_tree *tree) +{ + avl_node *node; + + node = tree->root->right; + if (node == NULL || node->key == NULL) return NULL; + + while (node->left) + node = node->left; + + return node; +} + +avl_node *avl_get_prev(avl_node *node) +{ + if (node->left) { + node = node->left; + while (node->right) { + node = node->right; + } + + return node; + } else { + avl_node *child = node; + while (node->parent && node->parent->key) { + node = node->parent; + if (child == node->right) { + return node; + } + child = node; + } + + return NULL; + } +} + +avl_node *avl_get_next(avl_node *node) +{ + if (node->right) { + node = node->right; + while (node->left) { + node = node->left; + } + + return node; + } else { + avl_node *child = node; + while (node->parent && node->parent->key) { + node = node->parent; + if (child == node->left) { + return node; + } + child = node; + } + + return NULL; + } +} + +/* iterate a function over a range of indices, using get_predecessor */ + +int +avl_iterate_index_range (avl_tree * tree, + avl_iter_index_fun_type iter_fun, + unsigned long low, + unsigned long high, + void * iter_arg) +{ + unsigned long m; + unsigned long num_left; + avl_node * node; + + if (high > tree->length) { + return -1; + } + num_left = (high - low); + /* find the th node */ + m = high; + node = tree->root->right; + while (1) { + if (m < AVL_GET_RANK (node)) { + node = node->left; + } else if (m > AVL_GET_RANK (node)) { + m = m - AVL_GET_RANK (node); + node = node->right; + } else { + break; + } + } + /* call on , , ... */ + while (num_left) { + num_left = num_left - 1; + if (iter_fun (num_left, node->key, iter_arg) != 0) { + return -1; + } + node = avl_get_prev (node); + } + return 0; +} + +/* If is present in the tree, return that key's node, and set <*index> + * appropriately. If not, return NULL, and set <*index> to the position + * representing the closest preceding value. + */ + +static avl_node * +avl_get_index_by_key (avl_tree * tree, + void * key, + unsigned long * index) +{ + avl_node * x = tree->root->right; + unsigned long m; + + if (!x) { + return NULL; + } + m = AVL_GET_RANK (x); + + while (1) { + int compare_result = tree->compare_fun (tree->compare_arg, key, x->key); + if (compare_result < 0) { + if (x->left) { + m = m - AVL_GET_RANK(x); + x = x->left; + m = m + AVL_GET_RANK(x); + } else { + *index = m - 2; + return NULL; + } + } else if (compare_result > 0) { + if (x->right) { + x = x->right; + m = m + AVL_GET_RANK(x); + } else { + *index = m - 1; + return NULL; + } + } else { + *index = m - 1; + return x; + } + } +} + +/* return the (low index, high index) pair that spans the given key */ + +int +avl_get_span_by_key (avl_tree * tree, + void * key, + unsigned long * low, + unsigned long * high) +{ + unsigned long m, i, j; + avl_node * node; + + node = avl_get_index_by_key (tree, key, &m); + + /* did we find an exact match? + * if so, we have to search left and right + * to find the span, since we know nothing about + * the arrangement of like keys. + */ + if (node) { + avl_node * left, * right; + /* search left */ + left = avl_get_prev (node); + i = m; + while (left && (i > 0) && (tree->compare_fun (tree->compare_arg, key, left->key) == 0)) { + left = avl_get_prev (left); + i = i - 1; + } + /* search right */ + right = avl_get_next (node); + j = m; + while (right && (j <= tree->length) && (tree->compare_fun (tree->compare_arg, key, right->key) == 0)) { + right = avl_get_next (right); + j = j + 1; + } + *low = i; + *high = j + 1; + return 0; + } else { + *low = *high = m; + } + return 0; +} + +/* return the (low index, high index) pair that spans the given key */ + +int +avl_get_span_by_two_keys (avl_tree * tree, + void * low_key, + void * high_key, + unsigned long * low, + unsigned long * high) +{ + unsigned long i, j; + avl_node * low_node, * high_node; + int order; + + /* we may need to swap them */ + order = tree->compare_fun (tree->compare_arg, low_key, high_key); + if (order > 0) { + void * temp = low_key; + low_key = high_key; + high_key = temp; + } + + low_node = avl_get_index_by_key (tree, low_key, &i); + high_node = avl_get_index_by_key (tree, high_key, &j); + + if (low_node) { + avl_node * left; + /* search left */ + left = avl_get_prev (low_node); + while (left && (i > 0) && (tree->compare_fun (tree->compare_arg, low_key, left->key) == 0)) { + left = avl_get_prev (left); + i = i - 1; + } + } else { + i = i + 1; + } + if (high_node) { + avl_node * right; + /* search right */ + right = avl_get_next (high_node); + while (right && (j <= tree->length) && (tree->compare_fun (tree->compare_arg, high_key, right->key) == 0)) { + right = avl_get_next (right); + j = j + 1; + } + } else { + j = j + 1; + } + + *low = i; + *high = j; + return 0; +} + + +int +avl_get_item_by_key_most (avl_tree * tree, + void * key, + void **value_address) +{ + avl_node * x = tree->root->right; + *value_address = NULL; + + if (!x) { + return -1; + } + while (1) { + int compare_result = tree->compare_fun (tree->compare_arg, key, x->key); + + if (compare_result == 0) { + *value_address = x->key; + return 0; + } else if (compare_result < 0) { + /* the given key is less than the current key */ + if (x->left) { + x = x->left; + } else { + if (*value_address) + return 0; + else + return -1; + } + } else { + /* the given key is more than the current key */ + /* save this value, it might end up being the right one! */ + *value_address = x->key; + if (x->right) { + /* there is a bigger entry */ + x = x->right; + } else { + if (*value_address) + return 0; + else + return -1; + } + } + } +} + +int +avl_get_item_by_key_least (avl_tree * tree, + void * key, + void **value_address) +{ + avl_node * x = tree->root->right; + *value_address = NULL; + + if (!x) { + return -1; + } + while (1) { + int compare_result = tree->compare_fun (tree->compare_arg, key, x->key); + if (compare_result == 0) { + *value_address = x->key; + return 0; /* exact match */ + } else if (compare_result < 0) { + /* the given key is less than the current key */ + /* save this value, it might end up being the right one! */ + *value_address = x->key; + if (x->left) { + x = x->left; + } else { + if (*value_address) /* we have found a valid entry */ + return 0; + else + return -1; + } + } else { + if (x->right) { + /* there is a bigger entry */ + x = x->right; + } else { + if (*value_address) /* we have found a valid entry */ + return 0; + else + return -1; + } + } + } +} + +#define AVL_MAX(X, Y) ((X) > (Y) ? (X) : (Y)) + +static long +avl_verify_balance (avl_node * node) +{ + if (!node) { + return 0; + } else { + long lh = avl_verify_balance (node->left); + long rh = avl_verify_balance (node->right); + if ((rh - lh) != AVL_GET_BALANCE(node)) { + return 0; + } + if (((lh - rh) > 1) || ((lh - rh) < -1)) { + return 0; + } + return (1 + AVL_MAX (lh, rh)); + } +} + +static void +avl_verify_parent (avl_node * node, avl_node * parent) +{ + if (node->parent != parent) { + return; + } + if (node->left) { + avl_verify_parent (node->left, node); + } + if (node->right) { + avl_verify_parent (node->right, node); + } +} + +static long +avl_verify_rank (avl_node * node) +{ + if (!node) { + return 0; + } else { + unsigned long num_left=0, num_right=0; + if (node->left) { + num_left = avl_verify_rank (node->left); + } + if (node->right) { + num_right = avl_verify_rank (node->right); + } + if (AVL_GET_RANK (node) != num_left + 1) { + fprintf (stderr, "invalid rank at node %ld\n", (long) node->key); + exit (1); + } + return (num_left + num_right + 1); + } +} + +/* sanity-check the tree */ + +int +avl_verify (avl_tree * tree) +{ + if (tree->length) { + avl_verify_balance (tree->root->right); + avl_verify_parent (tree->root->right, tree->root); + avl_verify_rank (tree->root->right); + } + return (0); +} + +/* + * These structures are accumulated on the stack during print_tree + * and are used to keep track of the width and direction of each + * branch in the history of a particular line . + */ + +typedef struct _link_node { + struct _link_node * parent; + char direction; + int width; +} link_node; + +static char balance_chars[3] = {'\\', '-', '/'}; + +static int +default_key_printer (char * buffer, void * key) +{ + return snprintf (buffer, AVL_KEY_PRINTER_BUFLEN, "%p", key); +} + +/* + * When traveling the family tree, a change in direction + * indicates when to print a connector. This is kinda crazy, + * we use the stack to build a linked list, and then travel + * it backwards using recursion. + */ + +static void +print_connectors (link_node * link) +{ + if (link->parent) { + print_connectors (link->parent); + } + if (link->parent && (link->parent->direction != link->direction) && (link->parent->parent)) { + int i; + fprintf (stdout, "|"); + for (i=0; i < (link->width - 1); i++) { + fprintf (stdout, " "); + } + } else { + int i; + for (i=0; i < (link->width); i++) { + fprintf (stdout, " "); + } + } +} + +/* + * The function writes a representation of the + * key into (which is conveniently fixed in size to add + * the spice of danger). It should return the size of the + * representation. + */ + +static void +print_node (avl_key_printer_fun_type key_printer, + avl_node * node, + link_node * link) +{ + char buffer[AVL_KEY_PRINTER_BUFLEN]; + unsigned int width; + width = key_printer (buffer, node->key); + + if (node->right) { + link_node here; + here.parent = link; + here.direction = 1; + here.width = width + 11; + print_node (key_printer, node->right, &here); + } + print_connectors (link); + fprintf (stdout, "+-[%c %s %03d]", + balance_chars[AVL_GET_BALANCE(node)+1], + buffer, + (int)AVL_GET_RANK(node)); + if (node->left || node->right) { + fprintf (stdout, "-|\n"); + } else { + fprintf (stdout, "\n"); + } + if (node->left) { + link_node here; + here.parent = link; + here.direction = -1; + here.width = width + 11; + print_node (key_printer, node->left, &here); + } +} + +void +avl_print_tree (avl_tree * tree, avl_key_printer_fun_type key_printer) +{ + link_node top = {NULL, 0, 0}; + if (!key_printer) { + key_printer = default_key_printer; + } + if (tree->length) { + print_node (key_printer, tree->root->right, &top); + } else { + fprintf (stdout, "\n"); + } +} + + +void avl_tree_rlock(avl_tree *tree) +{ + thread_rwlock_rlock(&tree->rwlock); +} + +void avl_tree_wlock(avl_tree *tree) +{ + thread_rwlock_wlock(&tree->rwlock); +} + +void avl_tree_unlock(avl_tree *tree) +{ + thread_rwlock_unlock(&tree->rwlock); +} + +#ifdef HAVE_AVL_NODE_LOCK +void avl_node_rlock(avl_node *node) +{ + thread_rwlock_rlock(&node->rwlock); +} + +void avl_node_wlock(avl_node *node) +{ + thread_rwlock_wlock(&node->rwlock); +} + +void avl_node_unlock(avl_node *node) +{ + thread_rwlock_unlock(&node->rwlock); +} +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.dsp mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.dsp --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.dsp 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.dsp 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,100 @@ +# Microsoft Developer Studio Project File - Name="avl" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=avl - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "avl.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "avl.mak" CFG="avl - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "avl - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "avl - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "avl - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "avl - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "avl - Win32 Release" +# Name "avl - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\avl.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\avl.h +# End Source File +# End Group +# End Target +# End Project diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.h mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/avl.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/avl.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,205 @@ +/* + * Copyright (C) 1995 by Sam Rushing + */ + +/* $Id: avl.h,v 1.7 2003/07/07 01:10:14 brendan Exp $ */ + +#ifndef __AVL_H +#define __AVL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define AVL_KEY_PRINTER_BUFLEN (256) + +#ifndef NO_THREAD +#include "thread/thread.h" +#else +#define thread_rwlock_create(x) do{}while(0) +#define thread_rwlock_destroy(x) do{}while(0) +#define thread_rwlock_rlock(x) do{}while(0) +#define thread_rwlock_wlock(x) do{}while(0) +#define thread_rwlock_unlock(x) do{}while(0) +#endif + +typedef struct avl_node_tag { + void * key; + struct avl_node_tag * left; + struct avl_node_tag * right; + struct avl_node_tag * parent; + /* + * The lower 2 bits of specify the balance + * factor: 00==-1, 01==0, 10==+1. + * The rest of the bits are used for + */ + unsigned int rank_and_balance; +#if !defined(NO_THREAD) && defined(HAVE_AVL_NODE_LOCK) + rwlock_t rwlock; +#endif +} avl_node; + +#define AVL_GET_BALANCE(n) ((int)(((n)->rank_and_balance & 3) - 1)) + +#define AVL_GET_RANK(n) (((n)->rank_and_balance >> 2)) + +#define AVL_SET_BALANCE(n,b) \ + ((n)->rank_and_balance) = \ + (((n)->rank_and_balance & (~3)) | ((int)((b) + 1))) + +#define AVL_SET_RANK(n,r) \ + ((n)->rank_and_balance) = \ + (((n)->rank_and_balance & 3) | (r << 2)) + +struct _avl_tree; + +typedef int (*avl_key_compare_fun_type) (void * compare_arg, void * a, void * b); +typedef int (*avl_iter_fun_type) (void * key, void * iter_arg); +typedef int (*avl_iter_index_fun_type) (unsigned long index, void * key, void * iter_arg); +typedef int (*avl_free_key_fun_type) (void * key); +typedef int (*avl_key_printer_fun_type) (char *, void *); + +/* + * and let us associate a particular compare + * function with each tree, separately. + */ + +#ifdef _mangle +# define avl_tree_new _mangle(avl_tree_new) +# define avl_node_new _mangle(avl_node_new) +# define avl_tree_free _mangle(avl_tree_free) +# define avl_insert _mangle(avl_insert) +# define avl_delete _mangle(avl_delete) +# define avl_get_by_index _mangle(avl_get_by_index) +# define avl_get_by_key _mangle(avl_get_by_key) +# define avl_iterate_inorder _mangle(avl_iterate_inorder) +# define avl_iterate_index_range _mangle(avl_iterate_index_range) +# define avl_tree_rlock _mangle(avl_tree_rlock) +# define avl_tree_wlock _mangle(avl_tree_wlock) +# define avl_tree_wlock _mangle(avl_tree_wlock) +# define avl_tree_unlock _mangle(avl_tree_unlock) +# define avl_node_rlock _mangle(avl_node_rlock) +# define avl_node_wlock _mangle(avl_node_wlock) +# define avl_node_unlock _mangle(avl_node_unlock) +# define avl_get_span_by_key _mangle(avl_get_span_by_key) +# define avl_get_span_by_two_keys _mangle(avl_get_span_by_two_keys) +# define avl_verify _mangle(avl_verify) +# define avl_print_tree _mangle(avl_print_tree) +# define avl_get_first _mangle(avl_get_first) +# define avl_get_prev _mangle(avl_get_prev) +# define avl_get_next _mangle(avl_get_next) +# define avl_get_item_by_key_most _mangle(avl_get_item_by_key_most) +# define avl_get_item_by_key_least _mangle(avl_get_item_by_key_least) +#endif + +typedef struct _avl_tree { + avl_node * root; + unsigned int height; + unsigned int length; + avl_key_compare_fun_type compare_fun; + void * compare_arg; +#ifndef NO_THREAD + rwlock_t rwlock; +#endif +} avl_tree; + +avl_tree * avl_tree_new (avl_key_compare_fun_type compare_fun, void * compare_arg); +avl_node * avl_node_new (void * key, avl_node * parent); + +void avl_tree_free ( + avl_tree * tree, + avl_free_key_fun_type free_key_fun + ); + +int avl_insert ( + avl_tree * ob, + void * key + ); + +int avl_delete ( + avl_tree * tree, + void * key, + avl_free_key_fun_type free_key_fun + ); + +int avl_get_by_index ( + avl_tree * tree, + unsigned long index, + void ** value_address + ); + +int avl_get_by_key ( + avl_tree * tree, + void * key, + void ** value_address + ); + +int avl_iterate_inorder ( + avl_tree * tree, + avl_iter_fun_type iter_fun, + void * iter_arg + ); + +int avl_iterate_index_range ( + avl_tree * tree, + avl_iter_index_fun_type iter_fun, + unsigned long low, + unsigned long high, + void * iter_arg + ); + +int avl_get_span_by_key ( + avl_tree * tree, + void * key, + unsigned long * low, + unsigned long * high + ); + +int avl_get_span_by_two_keys ( + avl_tree * tree, + void * key_a, + void * key_b, + unsigned long * low, + unsigned long * high + ); + +int avl_verify (avl_tree * tree); + +void avl_print_tree ( + avl_tree * tree, + avl_key_printer_fun_type key_printer + ); + +avl_node *avl_get_first(avl_tree *tree); + +avl_node *avl_get_prev(avl_node * node); + +avl_node *avl_get_next(avl_node * node); + +/* These two are from David Ascher */ + +int avl_get_item_by_key_most ( + avl_tree * tree, + void * key, + void ** value_address + ); + +int avl_get_item_by_key_least ( + avl_tree * tree, + void * key, + void ** value_address + ); + +/* optional locking stuff */ +void avl_tree_rlock(avl_tree *tree); +void avl_tree_wlock(avl_tree *tree); +void avl_tree_unlock(avl_tree *tree); +void avl_node_rlock(avl_node *node); +void avl_node_wlock(avl_node *node); +void avl_node_unlock(avl_node *node); + +#ifdef __cplusplus +} +#endif + +#endif /* __AVL_H */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/BUILDING mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/BUILDING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/BUILDING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/BUILDING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7 @@ +defines that affect compilation + +none + +library dependencies + +none diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/COPYING mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = BUILDING COPYING README TODO avl.dsp test.c + +noinst_LTLIBRARIES = libiceavl.la +noinst_HEADERS = avl.h + +libiceavl_la_SOURCES = avl.c +libiceavl_la_CFLAGS = @XIPH_CFLAGS@ + +INCLUDES = -I$(srcdir)/.. + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/README mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/README --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,6 @@ +this is the avl tree library. + +lgpl + +by sam rushing +modified by jack moffitt diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/test.c mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/test.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/test.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/test.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,95 @@ +#include +#include "avl.h" + +#ifdef _WIN32 +#define snprintf _snprintf +#endif + +int _compare(void *compare_arg, void *a, void *b); +int _free(void *key); +int _printer(char *buff, void *key); + +int main(int argc, char **argv) +{ + int i, max_nodes; + avl_tree *tree; + avl_node *node; + + max_nodes = 25; + + if (argc == 2) { + max_nodes = atoi(argv[1]); + if (max_nodes == 0) + max_nodes = 10; + } + + printf("avl test... max_nodes = %d...\n", max_nodes); + + tree = avl_tree_new(_compare, NULL); + + printf("Filling tree...\n"); + for (i = 0; i < max_nodes; i++) { + avl_insert(tree, (void *)rand()); + } + + printf("Traversing tree...\n"); + node = avl_get_first(tree); + while (node) { + i = (int)node->key; + + printf("...%5d\n", i); + + node = avl_get_next(node); + } + + printf("Trying to go backwards...\n"); + node = tree->root->right; + while (node) { + i = (int)node->key; + printf("...%5d\n", i); + node = avl_get_prev(node); + } + + printf("Printing tree...\n"); + avl_print_tree(tree, _printer); + + avl_tree_free(tree, _free); + + return 0; +} + +int _compare(void *compare_arg, void *a, void *b) +{ + int i, j; + + i = (int)a; + j = (int)b; + + if (i > j) + return 1; + if (j > i) + return -1; + return 0; +} + +int _free(void *key) +{ + return 1; +} + +int _printer(char *buff, void *key) +{ + return snprintf(buff, 25, "%d", (int)key); +} + + + + + + + + + + + + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/TODO mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/TODO --- mixxx-2.2.3~dfsg/lib/libshout/src/common/avl/TODO 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/avl/TODO 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,2 @@ +- avl_get_last() +- a little more cleanup probably diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/COPYING mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/encoding.c mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/encoding.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/encoding.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/encoding.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,787 @@ +/* encoding.c +** +** http transfer encoding library +** See RFC2616 section 3.6 for more details. +** +** Copyright (C) 2015 Philipp "ph3-der-loewe" Schafft +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public +** License as published by the Free Software Foundation; either +** version 2 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Library General Public License for more details. +** +** You should have received a copy of the GNU Library General Public +** License along with this library; if not, write to the +** Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +** Boston, MA 02110-1301, USA. +** +*/ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include + +#include "encoding.h" + +struct httpp_encoding_tag { + size_t refc; + + ssize_t (*process_read)(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata); + ssize_t (*process_write)(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata); + + httpp_meta_t *meta_read; + httpp_meta_t *meta_write; + + void *buf_read_raw; /* input buffer */ + size_t buf_read_raw_offset, buf_read_raw_len; + + void *buf_read_decoded; /* decoded stuff */ + size_t buf_read_decoded_offset, buf_read_decoded_len; + + void *buf_write_raw; /* input buffer */ + size_t buf_write_raw_offset, buf_write_raw_len; + + void *buf_write_encoded; /* encoded output */ + size_t buf_write_encoded_offset, buf_write_encoded_len; + + /* backend specific stuff */ + size_t read_bytes_till_header; +}; + + +/* Handlers, at end of file */ +static ssize_t __enc_identity_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata); +static ssize_t __enc_identity_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata); +static ssize_t __enc_chunked_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata); +static ssize_t __enc_chunked_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata); + +/* function to move some data out of our buffers */ +ssize_t __copy_buffer(void *dst, void **src, size_t *boffset, size_t *blen, size_t len) +{ + void *p; + size_t have_len; + size_t todo; + + if (!len) + return 0; + + if (!dst || !src || !*src || !boffset || !blen) + return -1; + + have_len = *blen - *boffset; + p = *src + *boffset; + + todo = len < have_len ? len : have_len; + + memcpy(dst, p, todo); + + *boffset += todo; + + if (*boffset == *blen) { + free(*src); + *src = NULL; + *boffset = 0; + *blen = 0; + } + + return todo; +} + +/* try to flush output buffers */ +static inline void __flush_output(httpp_encoding_t *self, ssize_t (*cb)(void*, const void*, size_t), void *userdata) +{ + if (cb && self->buf_write_encoded) { + ssize_t ret = cb(userdata, + self->buf_write_encoded + self->buf_write_encoded_offset, + self->buf_write_encoded_len - self->buf_write_encoded_offset); + if (ret > 0) { + self->buf_write_encoded_offset += ret; + if (self->buf_write_encoded_offset == self->buf_write_encoded_len) { + free(self->buf_write_encoded); + self->buf_write_encoded = NULL; + self->buf_write_encoded_offset = 0; + self->buf_write_encoded_len = 0; + } + } + } +} + +/* meta data functions */ +/* meta data is to be used in a encoding-specific way */ +httpp_meta_t *httpp_encoding_meta_new(const char *key, const char *value) +{ + httpp_meta_t *ret = calloc(1, sizeof(httpp_meta_t)); + if (!ret) + return ret; + + if (key) + if ((ret->key = strdup(key)) == NULL) + goto fail; + + if (value) { + if ((ret->value = strdup(value)) == NULL) + goto fail; + ret->value_len = strlen(ret->value); + } + + return ret; +fail: + httpp_encoding_meta_free(ret); + return NULL; +} + +int httpp_encoding_meta_free(httpp_meta_t *self) +{ + while (self) { + httpp_meta_t *cur = self; + self = self->next; + + if (cur->key) + free(cur->key); + if (cur->value) + free(cur->value); + free(cur); + } + + return 0; +} + +int httpp_encoding_meta_append(httpp_meta_t **dst, httpp_meta_t *next) +{ + httpp_meta_t **cur; + + if (!dst) + return -1; + if (!next) + return 0; + + cur = dst; + while (*cur) + cur = &((*cur)->next); + + *cur = next; + + return 0; +} + +/* General setup */ +httpp_encoding_t *httpp_encoding_new(const char *encoding) { + httpp_encoding_t *ret = calloc(1, sizeof(httpp_encoding_t)); + if (!ret) + return NULL; + + ret->refc = 1; + + if (strcasecmp(encoding, HTTPP_ENCODING_IDENTITY) == 0) { + ret->process_read = __enc_identity_read; + ret->process_write = __enc_identity_write; + } else if (strcasecmp(encoding, HTTPP_ENCODING_CHUNKED) == 0) { + ret->process_read = __enc_chunked_read; + ret->process_write = __enc_chunked_write; + } else { + goto fail; + } + + return ret; + +fail: + httpp_encoding_release(ret); + return NULL; +} + +int httpp_encoding_addref(httpp_encoding_t *self) +{ + if (!self) + return -1; + self->refc++; + return 0; +} + +int httpp_encoding_release(httpp_encoding_t *self) +{ + if (!self) + return -1; + + self->refc--; + if (self->refc) + return 0; + + httpp_encoding_meta_free(self->meta_read); + httpp_encoding_meta_free(self->meta_write); + + if (self->buf_read_raw) + free(self->buf_read_raw); + if (self->buf_read_decoded) + free(self->buf_read_decoded); + if (self->buf_write_raw) + free(self->buf_write_raw); + if (self->buf_write_encoded) + free(self->buf_write_encoded); + free(self); + return 0; +} + +/* Read data from backend. + * if cb is NULL this will read from the internal buffer. + */ +ssize_t httpp_encoding_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata) +{ + ssize_t done = 0; + ssize_t ret; + + if (!self || !buf) + return -1; + + if (!len) + return 0; + + ret = __copy_buffer(buf, &(self->buf_read_decoded), &(self->buf_read_decoded_offset), &(self->buf_read_decoded_len), len); + + if (ret == (ssize_t)len) + return ret; + + if (ret > 0) { + done += ret; + buf += ret; + len -= ret; + } + + ret = self->process_read(self, buf, len, cb, userdata); + if (ret == -1 && done) + return done; + if (ret == -1) + return -1; + + done += ret; + buf += ret; + len -= ret; + + if (len) { + ret = __copy_buffer(buf, &(self->buf_read_decoded), &(self->buf_read_decoded_offset), &(self->buf_read_decoded_len), len); + if (ret > 0) { + done += ret; + buf += ret; + len -= ret; + } + } + + return done; +} + +/* Read any meta data that is in buffer. + * After a call to this function the meta data is released from the + * encoding object and the caller is responsible to free it. + */ +httpp_meta_t *httpp_encoding_get_meta(httpp_encoding_t *self) +{ + httpp_meta_t *ret; + + if (!self) + return NULL; + + ret = self->meta_read; + self->meta_read = NULL; + return ret; +} + +/* Write data to backend. + * If buf is NULL this will flush buffers. + * Depending on encoding flushing buffers may not be safe if not + * at end of stream. + */ +ssize_t httpp_encoding_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata) +{ + ssize_t ret; + + if (!self || !cb) + return -1; + + /* first try to flush buffers */ + __flush_output(self, cb, userdata); + + /* now run the processor */ + ret = self->process_write(self, buf, len, cb, userdata); + + /* try to flush buffers again, maybe they are filled now! */ + __flush_output(self, cb, userdata); + + return ret; +} + +/* Check if we have something to flush. */ +ssize_t httpp_encoding_pending(httpp_encoding_t *self) +{ + if (!self) + return -1; + if (!self->buf_write_encoded) + return 0; + return self->buf_write_encoded_len - self->buf_write_encoded_offset; +} + +/* Attach meta data to the stream. + * this is to be written out as soon as the encoding supports. + */ +int httpp_encoding_append_meta(httpp_encoding_t *self, httpp_meta_t *meta) +{ + if (!self) + return -1; + return httpp_encoding_meta_append(&(self->meta_write), meta); +} + +/* handlers for encodings */ +static ssize_t __enc_identity_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata) +{ + (void)self; + if (!cb) + return -1; + return cb(userdata, buf, len); +} + +static ssize_t __enc_identity_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata) +{ + (void)self; + if (!cb) + return -1; + return cb(userdata, buf, len); +} + +/* Here is what chunked encoding looks like: + * + * You have any number of chunks. They are just chained. + * The last chunk has a length of zero set. + * After the last chunk there are tailing headers and a final "\r\n". + * + * Each chunk looks like this: + * LENGTH as hex [";" extension [";" extention [...]]] "\r\n" BODY "\r\n". + * extension is: TOKEN ["=" data]; + * data is: TOKEN | STRING as quoted. + * + */ + +static void __enc_chunked_read_extentions(httpp_encoding_t *self, char *p, size_t len) +{ + /* ok. If you want to ruin your day... go ahead and try to understand this. */ + httpp_meta_t **parent; + httpp_meta_t *meta; + size_t value_len; + size_t value_decoded_len; + size_t key_len; + char *value; + char *c; + int in_quote; + + if (self->meta_read) { + parent = &(self->meta_read); + while (*parent) + parent = &((*parent)->next); + } else { + parent = &(self->meta_read); + } + + while (len) { + if (*p != ';') /* not a valid extension */ + break; + p++; + len--; + + *parent = meta = httpp_encoding_meta_new(NULL, NULL); + parent = &(meta->next); + + for (key_len = 0; key_len < len && p[key_len] != '='; key_len++); + meta->key = malloc(key_len + 1); + if (!meta->key) + return; + memcpy(meta->key, p, key_len); + meta->key[key_len] = 0; + p += key_len; + len -= key_len; + if (!len) + break; + + if (*p != '=') /* check if we have a value */ + continue; + + p++; + len--; + + if (!len) + break; + + in_quote = 0; + for (value_len = 0; value_len < len; value_len++) { + if (in_quote) { + if (p[value_len] == '\\') in_quote = 2; + else if (p[value_len] == '"') in_quote--; + if (in_quote) + continue; + value_len++; + break; + } + if (p[value_len] == '"') { + in_quote = 1; + } else if (p[value_len] == ';') + break; + } + + value = meta->value = malloc(value_len + 1); + if (!meta->value) + return; + in_quote = 0; + for (c = p, p += value_len, len -= value_len, value_decoded_len = 0; value_len; value_len--, c++) { + if (in_quote) { + if (*c == '\\') in_quote = 2; + else if (*c == '"') { + in_quote--; + if (in_quote) + value[value_decoded_len++] = '"'; + } else + value[value_decoded_len++] = *c; + if (in_quote) + continue; + break; + } + if (*c == '"') { + in_quote = 1; + } else if (p[value_len] == ';') + break; + else + value[value_decoded_len++] = *c; + } + value[value_decoded_len] = 0; + meta->value_len = value_decoded_len; + } +} + +static ssize_t __enc_chunked_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata) +{ + ssize_t ret; + size_t buflen; + void *bufptr; + size_t i; + char *c; + int in_quote; + ssize_t offset_extentions; + ssize_t offset_CR; + ssize_t offset_LF; + long long unsigned int bodylen; + + if (!cb) + return -1; + + /* see if we have still a few bytes to go till the next header + * The 2 is the end of chunk mark that is not part of the body! */ + if (self->read_bytes_till_header > 2) { + size_t todo = len > (self->read_bytes_till_header - 2) ? (self->read_bytes_till_header - 2) : len; + ret = cb(userdata, buf, todo); + if (ret < 1) + return ret; + self->read_bytes_till_header -= ret; + return ret; + } + + /* ok. now we should have 2 or less bytes till next header. + * We just read a few bytes into our decoding buffer and see what we got. + */ + buflen = 1024; + + if (self->buf_read_raw) { + bufptr = realloc(self->buf_read_raw, self->buf_read_raw_len + buflen); + } else { + bufptr = malloc(buflen); + self->buf_read_raw_offset = 0; + self->buf_read_raw_len = 0; + } + if (!bufptr) + return -1; + + self->buf_read_raw = bufptr; + + ret = cb(userdata, self->buf_read_raw + self->buf_read_raw_len, buflen); + if (ret < 1) { + if (!self->buf_read_raw_len) { + free(self->buf_read_raw); + self->buf_read_raw = NULL; + } + return ret; + } + + self->buf_read_raw_len += ret; + + /* now we should have some bytes in our buffer. + * Now skip the "\r\n" that may be left to do from self->read_bytes_till_header. + */ + + if ((self->buf_read_raw_len - self->buf_read_raw_offset) == self->read_bytes_till_header) { + /* ok, that wasn't super big step forward. At least we got rid of self->read_bytes_till_header. + * now freeing buffers again... + */ + free(self->buf_read_raw); + self->buf_read_raw = NULL; + self->buf_read_raw_offset = 0; + self->buf_read_raw_len = 0; + self->read_bytes_till_header = 0; + return 0; + } else if ((self->buf_read_raw_len - self->buf_read_raw_offset) > self->read_bytes_till_header) { + /* ship the tailing "\r\n". + * We should check we really got that and not some other stuff, eh? Yes, I'm sure we should... + */ + self->buf_read_raw_offset += self->read_bytes_till_header; + self->read_bytes_till_header = 0; + } + + /* ok. next we have at least a little bit if a header. + * Now we need to find out of the header is complet. + * If it is we will process it. If it isn't we will + * just return a short read and try again later! + * + * Hint: A complet header ends with "\r\n". + * But be aware! That is valid in any quoted string + * that is part of the header as well! + */ + + in_quote = 0; + offset_extentions = -1; + offset_CR = -1; + offset_LF = -1; + for (i = self->buf_read_raw_offset, c = self->buf_read_raw + self->buf_read_raw_offset; + i < self->buf_read_raw_len; + i++, c++) { + if (in_quote) { + if (*c == '\\') in_quote = 2; + else if (*c == '"') in_quote--; + continue; + } + if (*c == '"') { + in_quote = 1; + } else if (*c == ';' && offset_extentions == -1) { + offset_extentions = i; + } else if (*c == '\r') { + offset_CR = i; + } else if (*c == '\n' && offset_CR == (ssize_t)(i - 1)) { + offset_LF = i; + break; + } + } + + /* ok, now we know a lot more!: + * offset_extentions is the offset to the extentions if any. + * offset_LF is the offset to the byte before the body if any. + * if offset_LF is > -1 we know we have a complet header. + * if we don't just return a short read and try again later. + */ + + if (offset_LF == -1) + return 0; + + /* ok. Now we have a complet header. + * First pass the extentions to extention parser if any. + */ + if (offset_extentions != -1) + __enc_chunked_read_extentions(self, self->buf_read_raw + offset_extentions, offset_CR - offset_extentions); + + /* ok. Next we parse the body length. + * We just replace whatever comes after the length by \0 + * and try to parse the hex value. + */ + if (offset_extentions != -1) { + c = self->buf_read_raw + offset_extentions; + } else { + c = self->buf_read_raw + offset_CR; + } + *c = 0; + + /* we hope that will work... */ + if (sscanf(self->buf_read_raw + self->buf_read_raw_offset, "%llx", &bodylen) != 1) + return -1; + + /* ok, Now we move the offset forward to the body. */ + self->buf_read_raw_offset = offset_LF + 1; + + /* Do we still have some data in buffer? + * If not free the buffer and set the counters + * to point to the next header. + */ + if (self->buf_read_raw_offset == self->buf_read_raw_len) { + free(self->buf_read_raw); + self->buf_read_raw = NULL; + self->buf_read_raw_offset = 0; + self->buf_read_raw_len = 0; + self->read_bytes_till_header = bodylen + 2; /* 2 = tailing "\r\n" */ + return 0; + } + + /* ok, now we check if what we have in the buffer is less or equal than our bodylen. */ + if ((self->buf_read_raw_len - self->buf_read_raw_offset) <= bodylen) { + /* ok, this is fantastic. The framework can do the rest for us! */ + self->buf_read_decoded = self->buf_read_raw; + self->buf_read_decoded_offset = self->buf_read_raw_offset; + self->buf_read_decoded_len = self->buf_read_raw_len; + self->buf_read_raw = NULL; + self->buf_read_raw_offset = 0; + self->buf_read_raw_len = 0; + self->read_bytes_till_header = bodylen + 2 - (self->buf_read_decoded_len - self->buf_read_decoded_offset); + return 0; + } + + /* ok, final case left: + * we have more than just the body in our buffer. + * What we do now is to allocate buffer, move the body over + * and let our internal structures point to the next header. + */ + + self->buf_read_decoded = malloc(bodylen); + if (!self->buf_read_decoded) /* just retry later if we can not allocate a buffer */ + return -1; + self->buf_read_decoded_offset = 0; + self->buf_read_decoded_len = bodylen; + memcpy(self->buf_read_decoded, self->buf_read_raw + self->buf_read_raw_offset, bodylen); + self->buf_read_raw_offset += bodylen; + self->read_bytes_till_header = 2; /* tailing "\r\n" */ + + return 0; +} + +static size_t __enc_chunked_write_extensions_valuelen(httpp_meta_t *cur) +{ + size_t ret = cur->value_len; + size_t i; + char *p = cur->value; + + if (!cur->value || !cur->value_len) + return 0; + + for (i = 0; i < cur->value_len; i++, p++) + if (*p == '"') + ret++; + + return ret; +} + +static char *__enc_chunked_write_extensions(httpp_encoding_t *self) +{ + size_t buflen; + void *buf; + char *p; + size_t len; + httpp_meta_t *cur; + + if (!self->meta_write) + return NULL; + + /* first find out how long the buffer must be. */ + buflen = 1; /* tailing \0 */ + + cur = self->meta_write; + while (cur) { + if (!cur->key || (cur->value_len && !cur->value)) { + cur = cur->next; + continue; + } + + buflen += 4; /* ; and = and two " */ + buflen += strlen(cur->key); + buflen += __enc_chunked_write_extensions_valuelen(cur); + cur = cur->next; + } + + p = buf = malloc(buflen); + if (!buf) + return NULL; + + cur = self->meta_write; + while (cur) { + if (!cur->key || (cur->value_len && !cur->value)) { + cur = cur->next; + continue; + } + + *(p++) = ';'; + len = strlen(cur->key); + memcpy(p, cur->key, len); + p += len; + + if (cur->value_len) { + const char *c; + size_t i; + + *(p++) = '='; + *(p++) = '"'; + for (i = 0, c = cur->value; i < cur->value_len; i++, c++) { + if (*c == '"') + *(p++) = '\\'; + *(p++) = *c; + } + *(p++) = '"'; + } + + cur = cur->next; + } + + *p = 0; /* terminate the string */ + + httpp_encoding_meta_free(self->meta_write); + self->meta_write = NULL; + + return buf; +} +static ssize_t __enc_chunked_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata) +{ + char encoded_length[32]; + char *extensions = NULL; + ssize_t total_chunk_size; + ssize_t header_length; + + (void)cb, (void)userdata; + + if (!buf) + len = 0; + + /* refuse to write if we still have stuff to flush. */ + if (httpp_encoding_pending(self) > 0) + return 0; + + /* limit length to a bit more sane value */ + if (len > 1048576) + len = 1048576; + + snprintf(encoded_length, sizeof(encoded_length), "%lx", (long int)len); + + extensions = __enc_chunked_write_extensions(self); + + /* 2 = end of header and tailing "\r\n" */ + header_length = strlen(encoded_length) + (extensions ? strlen(extensions) : 0) + 2; + total_chunk_size = header_length + len + 2; + if (!buf) + total_chunk_size += 2; + + /* ok, we now allocate a huge buffer. We do it as if we would do it only when needed + * and it would fail we would end in bad state that can not be recovered */ + self->buf_write_encoded = malloc(total_chunk_size); + if (!self->buf_write_encoded) { + if (extensions) + free(extensions); + return -1; + } + + self->buf_write_encoded_offset = 0; + self->buf_write_encoded_len = total_chunk_size; + snprintf(self->buf_write_encoded, total_chunk_size, "%s%s\r\n", encoded_length, extensions ? extensions : ""); + memcpy(self->buf_write_encoded + header_length, buf, len); + memcpy(self->buf_write_encoded + header_length + len, "\r\n\r\n", buf ? 2 : 4); + + if (extensions) + free(extensions); + + return len; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/encoding.h mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/encoding.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/encoding.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/encoding.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,84 @@ +/* encoding.h +** +** http transfer encoding library +** See RFC2616 section 3.6 for more details. +** +** Copyright (C) 2015 Philipp "ph3-der-loewe" Schafft +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public +** License as published by the Free Software Foundation; either +** version 2 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Library General Public License for more details. +** +** You should have received a copy of the GNU Library General Public +** License along with this library; if not, write to the +** Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +** Boston, MA 02110-1301, USA. +** +*/ + +#ifndef __ENCODING_H +#define __ENCODING_H + +#include + +/* known encodings */ +#define HTTPP_ENCODING_IDENTITY "identity" /* RFC2616 */ +#define HTTPP_ENCODING_CHUNKED "chunked" /* RFC2616 */ +#define HTTPP_ENCODING_GZIP "gzip" /* RFC1952 */ +#define HTTPP_ENCODING_COMPRESS "compress" /* ??? */ +#define HTTPP_ENCODING_DEFLATE "deflate" /* RFC1950, RFC1951 */ + +typedef struct httpp_encoding_tag httpp_encoding_t; + +typedef struct httpp_meta_tag httpp_meta_t; +struct httpp_meta_tag { + char *key; + void *value; + size_t value_len; + httpp_meta_t *next; +}; + +/* meta data functions */ +/* meta data is to be used in a encoding-specific way */ +httpp_meta_t *httpp_encoding_meta_new(const char *key, const char *value); +int httpp_encoding_meta_free(httpp_meta_t *self); +int httpp_encoding_meta_append(httpp_meta_t **dst, httpp_meta_t *next); + +/* General setup */ +httpp_encoding_t *httpp_encoding_new(const char *encoding); +int httpp_encoding_addref(httpp_encoding_t *self); +int httpp_encoding_release(httpp_encoding_t *self); + +/* Read data from backend. + * if cb is NULL this will read from the internal buffer. + */ +ssize_t httpp_encoding_read(httpp_encoding_t *self, void *buf, size_t len, ssize_t (*cb)(void*, void*, size_t), void *userdata); + +/* Read any meta data that is in buffer. + * After a call to this function the meta data is released from the + * encoding object and the caller is responsible to free it. + */ +httpp_meta_t *httpp_encoding_get_meta(httpp_encoding_t *self); + +/* Write data to backend. + * If buf is NULL this will flush buffers. + * Depending on encoding flushing buffers may not be safe if not + * at end of stream. + */ +ssize_t httpp_encoding_write(httpp_encoding_t *self, const void *buf, size_t len, ssize_t (*cb)(void*, const void*, size_t), void *userdata); + +/* Check if we have something to flush. */ +ssize_t httpp_encoding_pending(httpp_encoding_t *self); + +/* Attach meta data to the stream. + * this is to be written out as soon as the encoding supports. + */ +int httpp_encoding_append_meta(httpp_encoding_t *self, httpp_meta_t *meta); + +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/httpp.c mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/httpp.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/httpp.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/httpp.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,610 @@ +/* Httpp.c +** +** http parsing engine +** +** Copyright (C) 2014 Michael Smith , +** Ralph Giles , +** Ed "oddsock" Zaleski , +** Karl Heyes , +** Philipp "ph3-der-loewe" Schafft +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public +** License as published by the Free Software Foundation; either +** version 2 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Library General Public License for more details. +** +** You should have received a copy of the GNU Library General Public +** License along with this library; if not, write to the +** Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +** Boston, MA 02110-1301, USA. +** +*/ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#include +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif + +#include +#include "httpp.h" + +#define MAX_HEADERS 32 + +/* internal functions */ + +/* misc */ +static char *_lowercase(char *str); + +/* for avl trees */ +static int _compare_vars(void *compare_arg, void *a, void *b); +static int _free_vars(void *key); + +http_parser_t *httpp_create_parser(void) +{ + return (http_parser_t *)malloc(sizeof(http_parser_t)); +} + +void httpp_initialize(http_parser_t *parser, http_varlist_t *defaults) +{ + http_varlist_t *list; + + parser->req_type = httpp_req_none; + parser->uri = NULL; + parser->vars = avl_tree_new(_compare_vars, NULL); + parser->queryvars = avl_tree_new(_compare_vars, NULL); + + /* now insert the default variables */ + list = defaults; + while (list != NULL) { + httpp_setvar(parser, list->var.name, list->var.value); + list = list->next; + } +} + +static int split_headers(char *data, unsigned long len, char **line) +{ + /* first we count how many lines there are + ** and set up the line[] array + */ + int lines = 0; + unsigned long i; + line[lines] = data; + for (i = 0; i < len && lines < MAX_HEADERS; i++) { + if (data[i] == '\r') + data[i] = '\0'; + if (data[i] == '\n') { + lines++; + data[i] = '\0'; + if (lines >= MAX_HEADERS) + return MAX_HEADERS; + if (i + 1 < len) { + if (data[i + 1] == '\n' || data[i + 1] == '\r') + break; + line[lines] = &data[i + 1]; + } + } + } + + i++; + while (i < len && data[i] == '\n') i++; + + return lines; +} + +static void parse_headers(http_parser_t *parser, char **line, int lines) +{ + int i, l; + int whitespace, slen; + char *name = NULL; + char *value = NULL; + + /* parse the name: value lines. */ + for (l = 1; l < lines; l++) { + whitespace = 0; + name = line[l]; + value = NULL; + slen = strlen(line[l]); + for (i = 0; i < slen; i++) { + if (line[l][i] == ':') { + whitespace = 1; + line[l][i] = '\0'; + } else { + if (whitespace) { + whitespace = 0; + while (i < slen && line[l][i] == ' ') + i++; + + if (i < slen) + value = &line[l][i]; + + break; + } + } + } + + if (name != NULL && value != NULL) { + httpp_setvar(parser, _lowercase(name), value); + name = NULL; + value = NULL; + } + } +} + +int httpp_parse_response(http_parser_t *parser, const char *http_data, unsigned long len, const char *uri) +{ + char *data; + char *line[MAX_HEADERS]; + int lines, slen,i, whitespace=0, where=0,code; + char *version=NULL, *resp_code=NULL, *message=NULL; + + if(http_data == NULL) + return 0; + + /* make a local copy of the data, including 0 terminator */ + data = (char *)malloc(len+1); + if (data == NULL) return 0; + memcpy(data, http_data, len); + data[len] = 0; + + lines = split_headers(data, len, line); + + /* In this case, the first line contains: + * VERSION RESPONSE_CODE MESSAGE, such as HTTP/1.0 200 OK + */ + slen = strlen(line[0]); + version = line[0]; + for(i=0; i < slen; i++) { + if(line[0][i] == ' ') { + line[0][i] = 0; + whitespace = 1; + } else if(whitespace) { + whitespace = 0; + where++; + if(where == 1) + resp_code = &line[0][i]; + else { + message = &line[0][i]; + break; + } + } + } + + if(version == NULL || resp_code == NULL || message == NULL) { + free(data); + return 0; + } + + httpp_setvar(parser, HTTPP_VAR_ERROR_CODE, resp_code); + code = atoi(resp_code); + if(code < 200 || code >= 300) { + httpp_setvar(parser, HTTPP_VAR_ERROR_MESSAGE, message); + } + + httpp_setvar(parser, HTTPP_VAR_URI, uri); + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "NONE"); + + parse_headers(parser, line, lines); + + free(data); + + return 1; +} + +static int hex(char c) +{ + if(c >= '0' && c <= '9') + return c - '0'; + else if(c >= 'A' && c <= 'F') + return c - 'A' + 10; + else if(c >= 'a' && c <= 'f') + return c - 'a' + 10; + else + return -1; +} + +static char *url_escape(const char *src) +{ + int len = strlen(src); + unsigned char *decoded; + int i; + char *dst; + int done = 0; + + decoded = calloc(1, len + 1); + + dst = (char *)decoded; + + for(i=0; i < len; i++) { + switch(src[i]) { + case '%': + if(i+2 >= len) { + free(decoded); + return NULL; + } + if(hex(src[i+1]) == -1 || hex(src[i+2]) == -1 ) { + free(decoded); + return NULL; + } + + *dst++ = hex(src[i+1]) * 16 + hex(src[i+2]); + i+= 2; + break; + case '+': + *dst++ = ' '; + break; + case '#': + done = 1; + break; + case 0: + free(decoded); + return NULL; + break; + default: + *dst++ = src[i]; + break; + } + if(done) + break; + } + + *dst = 0; /* null terminator */ + + return (char *)decoded; +} + +/** TODO: This is almost certainly buggy in some cases */ +static void parse_query(http_parser_t *parser, char *query) +{ + int len; + int i=0; + char *key = query; + char *val=NULL; + + if(!query || !*query) + return; + + len = strlen(query); + + while(ireq_type = httpp_str_to_method(req_type); + + if (uri != NULL && strlen(uri) > 0) { + char *query; + if((query = strchr(uri, '?')) != NULL) { + httpp_setvar(parser, HTTPP_VAR_RAWURI, uri); + httpp_setvar(parser, HTTPP_VAR_QUERYARGS, query); + *query = 0; + query++; + parse_query(parser, query); + } + + parser->uri = strdup(uri); + } else { + free(data); + return 0; + } + + if ((version != NULL) && ((tmp = strchr(version, '/')) != NULL)) { + tmp[0] = '\0'; + if ((strlen(version) > 0) && (strlen(&tmp[1]) > 0)) { + httpp_setvar(parser, HTTPP_VAR_PROTOCOL, version); + httpp_setvar(parser, HTTPP_VAR_VERSION, &tmp[1]); + } else { + free(data); + return 0; + } + } else { + free(data); + return 0; + } + + if (parser->req_type != httpp_req_none && parser->req_type != httpp_req_unknown) { + switch (parser->req_type) { + case httpp_req_get: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "GET"); + break; + case httpp_req_post: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "POST"); + break; + case httpp_req_put: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "PUT"); + break; + case httpp_req_head: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "HEAD"); + break; + case httpp_req_options: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "OPTIONS"); + break; + case httpp_req_delete: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "DELETE"); + break; + case httpp_req_trace: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "TRACE"); + break; + case httpp_req_connect: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "CONNECT"); + break; + case httpp_req_source: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "SOURCE"); + break; + case httpp_req_play: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "PLAY"); + break; + case httpp_req_stats: + httpp_setvar(parser, HTTPP_VAR_REQ_TYPE, "STATS"); + break; + default: + break; + } + } else { + free(data); + return 0; + } + + if (parser->uri != NULL) { + httpp_setvar(parser, HTTPP_VAR_URI, parser->uri); + } else { + free(data); + return 0; + } + + parse_headers(parser, line, lines); + + free(data); + + return 1; +} + +void httpp_deletevar(http_parser_t *parser, const char *name) +{ + http_var_t var; + + if (parser == NULL || name == NULL) + return; + var.name = (char*)name; + var.value = NULL; + avl_delete(parser->vars, (void *)&var, _free_vars); +} + +void httpp_setvar(http_parser_t *parser, const char *name, const char *value) +{ + http_var_t *var; + + if (name == NULL || value == NULL) + return; + + var = (http_var_t *)malloc(sizeof(http_var_t)); + if (var == NULL) return; + + var->name = strdup(name); + var->value = strdup(value); + + if (httpp_getvar(parser, name) == NULL) { + avl_insert(parser->vars, (void *)var); + } else { + avl_delete(parser->vars, (void *)var, _free_vars); + avl_insert(parser->vars, (void *)var); + } +} + +const char *httpp_getvar(http_parser_t *parser, const char *name) +{ + http_var_t var; + http_var_t *found; + void *fp; + + if (parser == NULL || name == NULL) + return NULL; + + fp = &found; + var.name = (char*)name; + var.value = NULL; + + if (avl_get_by_key(parser->vars, &var, fp) == 0) + return found->value; + else + return NULL; +} + +void httpp_set_query_param(http_parser_t *parser, const char *name, const char *value) +{ + http_var_t *var; + + if (name == NULL || value == NULL) + return; + + var = (http_var_t *)malloc(sizeof(http_var_t)); + if (var == NULL) return; + + var->name = strdup(name); + var->value = url_escape(value); + + if (httpp_get_query_param(parser, name) == NULL) { + avl_insert(parser->queryvars, (void *)var); + } else { + avl_delete(parser->queryvars, (void *)var, _free_vars); + avl_insert(parser->queryvars, (void *)var); + } +} + +const char *httpp_get_query_param(http_parser_t *parser, const char *name) +{ + http_var_t var; + http_var_t *found; + void *fp; + + fp = &found; + var.name = (char *)name; + var.value = NULL; + + if (avl_get_by_key(parser->queryvars, (void *)&var, fp) == 0) + return found->value; + else + return NULL; +} + +void httpp_clear(http_parser_t *parser) +{ + parser->req_type = httpp_req_none; + if (parser->uri) + free(parser->uri); + parser->uri = NULL; + avl_tree_free(parser->vars, _free_vars); + avl_tree_free(parser->queryvars, _free_vars); + parser->vars = NULL; +} + +void httpp_destroy(http_parser_t *parser) +{ + httpp_clear(parser); + free(parser); +} + +static char *_lowercase(char *str) +{ + char *p = str; + for (; *p != '\0'; p++) + *p = tolower(*p); + + return str; +} + +static int _compare_vars(void *compare_arg, void *a, void *b) +{ + http_var_t *vara, *varb; + + vara = (http_var_t *)a; + varb = (http_var_t *)b; + + return strcmp(vara->name, varb->name); +} + +static int _free_vars(void *key) +{ + http_var_t *var; + + var = (http_var_t *)key; + + if (var->name) + free(var->name); + if (var->value) + free(var->value); + free(var); + + return 1; +} + +httpp_request_type_e httpp_str_to_method(const char * method) { + if (strcasecmp("GET", method) == 0) { + return httpp_req_get; + } else if (strcasecmp("POST", method) == 0) { + return httpp_req_post; + } else if (strcasecmp("PUT", method) == 0) { + return httpp_req_put; + } else if (strcasecmp("HEAD", method) == 0) { + return httpp_req_head; + } else if (strcasecmp("OPTIONS", method) == 0) { + return httpp_req_options; + } else if (strcasecmp("DELETE", method) == 0) { + return httpp_req_delete; + } else if (strcasecmp("TRACE", method) == 0) { + return httpp_req_trace; + } else if (strcasecmp("CONNECT", method) == 0) { + return httpp_req_connect; + } else if (strcasecmp("SOURCE", method) == 0) { + return httpp_req_source; + } else if (strcasecmp("PLAY", method) == 0) { + return httpp_req_play; + } else if (strcasecmp("STATS", method) == 0) { + return httpp_req_stats; + } else { + return httpp_req_unknown; + } +} + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/httpp.h mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/httpp.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/httpp.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/httpp.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,111 @@ +/* httpp.h +** +** http parsing library +** +** Copyright (C) 2014 Michael Smith , +** Ralph Giles , +** Karl Heyes , +** Philipp "ph3-der-loewe" Schafft +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public +** License as published by the Free Software Foundation; either +** version 2 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Library General Public License for more details. +** +** You should have received a copy of the GNU Library General Public +** License along with this library; if not, write to the +** Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +** Boston, MA 02110-1301, USA. +** +*/ + +#ifndef __HTTPP_H +#define __HTTPP_H + +#include + +#define HTTPP_VAR_PROTOCOL "__protocol" +#define HTTPP_VAR_VERSION "__version" +#define HTTPP_VAR_URI "__uri" +#define HTTPP_VAR_RAWURI "__rawuri" +#define HTTPP_VAR_QUERYARGS " __queryargs" +#define HTTPP_VAR_REQ_TYPE "__req_type" +#define HTTPP_VAR_ERROR_MESSAGE "__errormessage" +#define HTTPP_VAR_ERROR_CODE "__errorcode" +#define HTTPP_VAR_ICYPASSWORD "__icy_password" + +typedef enum httpp_request_type_tag { + /* Initial and internally used state of the engine */ + httpp_req_none = 0, + /* Part of HTTP standard: GET, POST, PUT and HEAD */ + httpp_req_get, + httpp_req_post, + httpp_req_put, + httpp_req_head, + httpp_req_options, + httpp_req_delete, + httpp_req_trace, + httpp_req_connect, + /* Icecast SOURCE, to be replaced with PUT some day */ + httpp_req_source, + /* XXX: ??? */ + httpp_req_play, + /* Icecast 2.x STATS, to request a live stream of stats events */ + httpp_req_stats, + /* Used if request method is unknown. MUST BE LAST ONE IN LIST. */ + httpp_req_unknown +} httpp_request_type_e; + +typedef struct http_var_tag { + char *name; + char *value; +} http_var_t; + +typedef struct http_varlist_tag { + http_var_t var; + struct http_varlist_tag *next; +} http_varlist_t; + +typedef struct http_parser_tag { + httpp_request_type_e req_type; + char *uri; + avl_tree *vars; + avl_tree *queryvars; +} http_parser_t; + +#ifdef _mangle +# define httpp_create_parser _mangle(httpp_create_parser) +# define httpp_initialize _mangle(httpp_initialize) +# define httpp_parse _mangle(httpp_parse) +# define httpp_parse_icy _mangle(httpp_parse_icy) +# define httpp_parse_response _mangle(httpp_parse_response) +# define httpp_setvar _mangle(httpp_setvar) +# define httpp_getvar _mangle(httpp_getvar) +# define httpp_set_query_param _mangle(httpp_set_query_param) +# define httpp_get_query_param _mangle(httpp_get_query_param) +# define httpp_destroy _mangle(httpp_destroy) +# define httpp_clear _mangle(httpp_clear) +#endif + +http_parser_t *httpp_create_parser(void); +void httpp_initialize(http_parser_t *parser, http_varlist_t *defaults); +int httpp_parse(http_parser_t *parser, const char *http_data, unsigned long len); +int httpp_parse_icy(http_parser_t *parser, const char *http_data, unsigned long len); +int httpp_parse_response(http_parser_t *parser, const char *http_data, unsigned long len, const char *uri); +void httpp_setvar(http_parser_t *parser, const char *name, const char *value); +void httpp_deletevar(http_parser_t *parser, const char *name); +const char *httpp_getvar(http_parser_t *parser, const char *name); +void httpp_set_query_param(http_parser_t *parser, const char *name, const char *value); +const char *httpp_get_query_param(http_parser_t *parser, const char *name); +void httpp_destroy(http_parser_t *parser); +void httpp_clear(http_parser_t *parser); + +/* util functions */ +httpp_request_type_e httpp_str_to_method(const char * method); + +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,22 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +noinst_LTLIBRARIES = libicehttpp.la +noinst_HEADERS = httpp.h encoding.h + +libicehttpp_la_SOURCES = httpp.c encoding.c +libicehttpp_la_CFLAGS = @XIPH_CFLAGS@ +AM_CPPFLAGS = @XIPH_CPPFLAGS@ + +INCLUDES = -I$(srcdir)/.. + +# SCCS stuff (for BitKeeper) +GET = true + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/README mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/README --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,5 @@ +httpp is a simple http parser + +licensed under the lgpl + +created by jack moffitt diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/TODO mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/TODO --- mixxx-2.2.3~dfsg/lib/libshout/src/common/httpp/TODO 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/httpp/TODO 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1 @@ +- nothing i can think of diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/BUILDING mixxx-2.2.4~dfsg/lib/libshout/src/common/net/BUILDING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/BUILDING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/BUILDING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,3 @@ +defines that affect compilation + +none currently diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/COPYING mixxx-2.2.4~dfsg/lib/libshout/src/common/net/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/common/net/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = BUILDING COPYING README TODO test_resolver.c + +noinst_LTLIBRARIES = libicenet.la +noinst_HEADERS = resolver.h sock.h + +libicenet_la_SOURCES = sock.c resolver.c +libicenet_la_CFLAGS = @XIPH_CFLAGS@ + +INCLUDES = -I$(srcdir)/.. + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@ + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/README mixxx-2.2.4~dfsg/lib/libshout/src/common/net/README --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,10 @@ +This is a name resolving library that's threadsafe. + +Right now it only implements this with mutexes, but we should extend it to use gethostbyXXXX_r() +if it's available. + +It shoudl work on win32, but i'm probably forgetting a headerfile. + +API is basically not going to change. Please consult with the rest of the team before changing the interface. + +jack. \ No newline at end of file diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/resolver.c mixxx-2.2.4~dfsg/lib/libshout/src/common/net/resolver.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/resolver.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/resolver.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,233 @@ +/* + * resolver.c - name resolver library + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt , + * Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#include +#include +#include +#else +#include +#endif + +#ifndef NO_THREAD +#include +#else +#define thread_mutex_create(x) do{}while(0) +#define thread_mutex_destroy(x) do{}while(0) +#define thread_mutex_lock(x) do{}while(0) +#define thread_mutex_unlock(x) do{}while(0) +#endif + +#include "resolver.h" +#include "sock.h" + +/* internal function */ + +static int _isip(const char *what); + +/* internal data */ + +#ifndef NO_THREAD +static mutex_t _resolver_mutex; +#endif +static int _initialized = 0; + +#ifdef HAVE_INET_PTON +static int _isip(const char *what) +{ + union { + struct in_addr v4addr; + struct in6_addr v6addr; + } addr_u; + + if (inet_pton(AF_INET, what, &addr_u.v4addr) <= 0) + return inet_pton(AF_INET6, what, &addr_u.v6addr) > 0 ? 1 : 0; + + return 1; +} + +#else +static int _isip(const char *what) +{ + struct in_addr inp; + + return inet_aton(what, &inp); +} +#endif + + +#if defined (HAVE_GETNAMEINFO) && defined (HAVE_GETADDRINFO) +char *resolver_getname(const char *ip, char *buff, int len) +{ + struct addrinfo *head = NULL, hints; + char *ret = NULL; + + if (!_isip(ip)) { + strncpy(buff, ip, len); + buff [len-1] = '\0'; + return buff; + } + + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + if (getaddrinfo (ip, NULL, &hints, &head)) + return NULL; + + if (head) + { + if (getnameinfo(head->ai_addr, head->ai_addrlen, buff, len, NULL, + 0, NI_NAMEREQD) == 0) + ret = buff; + + freeaddrinfo (head); + } + + return ret; +} + + +char *resolver_getip(const char *name, char *buff, int len) +{ + struct addrinfo *head, hints; + char *ret = NULL; + + if (_isip(name)) { + strncpy(buff, name, len); + buff [len-1] = '\0'; + return buff; + } + + memset (&hints, 0, sizeof (hints)); + hints . ai_family = AF_UNSPEC; + hints . ai_socktype = SOCK_STREAM; + if (getaddrinfo (name, NULL, &hints, &head)) + return NULL; + + if (head) + { + if (getnameinfo(head->ai_addr, head->ai_addrlen, buff, len, NULL, + 0, NI_NUMERICHOST) == 0) + ret = buff; + freeaddrinfo (head); + } + + return ret; +} + +#else + +char *resolver_getname(const char *ip, char *buff, int len) +{ + struct hostent *host; + char *ret = NULL; + struct in_addr addr; + + if (! _isip(ip)) + { + strncpy(buff, ip, len); + buff [len-1] = '\0'; + return buff; + } + + thread_mutex_lock(&_resolver_mutex); + if (inet_aton (ip, &addr)) { + /* casting &addr to const char* as it is recommended on win* */ + if ((host=gethostbyaddr ((const char *)&addr, sizeof (struct in_addr), AF_INET))) + { + ret = strncpy (buff, host->h_name, len); + buff [len-1] = '\0'; + } + } + + thread_mutex_unlock(&_resolver_mutex); + return ret; +} + +char *resolver_getip(const char *name, char *buff, int len) +{ + struct hostent *host; + char *ret = NULL; + + if (_isip(name)) + { + strncpy(buff, name, len); + buff [len-1] = '\0'; + return buff; + } + thread_mutex_lock(&_resolver_mutex); + host = gethostbyname(name); + if (host) + { + char * temp = inet_ntoa(*(struct in_addr *)host->h_addr); + ret = strncpy(buff, temp, len); + buff [len-1] = '\0'; + } + thread_mutex_unlock(&_resolver_mutex); + + return ret; +} +#endif + + +void resolver_initialize() +{ + /* initialize the lib if we havne't done so already */ + + if (!_initialized) + { + _initialized = 1; + thread_mutex_create (&_resolver_mutex); + + /* keep dns connects (TCP) open */ +#ifdef HAVE_SETHOSTENT + sethostent(1); +#endif + } +} + +void resolver_shutdown(void) +{ + if (_initialized) + { + thread_mutex_destroy(&_resolver_mutex); + _initialized = 0; +#ifdef HAVE_ENDHOSTENT + endhostent(); +#endif + } +} + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/resolver.h mixxx-2.2.4~dfsg/lib/libshout/src/common/net/resolver.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/resolver.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/resolver.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * resolver.h + * + * name resolver library header + * + * Copyright (C) 2014 Brendan Cully , + * Jack Moffitt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __RESOLVER_H +#define __RESOLVER_H + + +/* +** resolver_lookup +** +** resolves a hosts name from it's ip address +** or +** resolves an ip address from it's host name +** +** returns a pointer to buff, or NULL if an error occured +** +*/ + +#ifdef _mangle +# define resolver_initialize _mangle(resolver_initialize) +# define resolver_shutdown _mangle(resolver_shutdown) +# define resolver_getname _mangle(resolver_getname) +# define resolver_getip _mangle(resolver_getip) +#endif + +void resolver_initialize(void); +void resolver_shutdown(void); + +char *resolver_getname(const char *ip, char *buff, int len); +char *resolver_getip(const char *name, char *buff, int len); + +#endif + + + + + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/sock.c mixxx-2.2.4~dfsg/lib/libshout/src/common/net/sock.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/sock.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/sock.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,962 @@ +/* -*- c-basic-offset: 4; -*- */ +/* sock.c: General Socket Functions + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt , + * Ed "oddsock" Zaleski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_POLL +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifndef _WIN32 +#include +#include +#include +#include +#include +#include +#include +#else +#include +#endif + +#include "sock.h" +#include "resolver.h" + +/* for older C libraries */ +#ifndef AI_NUMERICSERV +# define AI_NUMERICSERV 0 +#endif +#ifndef AI_ADDRCONFIG +# define AI_ADDRCONFIG 0 +#endif + +/* sock_initialize +** +** initializes the socket library. you must call this +** before using the library! +*/ +void sock_initialize(void) +{ +#ifdef _WIN32 + WSADATA wsad; + WSAStartup(0x0101, &wsad); +#endif + + resolver_initialize(); +} + +/* sock_shutdown +** +** shutdown the socket library. remember to call this when you're +** through using the lib +*/ +void sock_shutdown(void) +{ +#ifdef _WIN32 + WSACleanup(); +#endif + + resolver_shutdown(); +} + +/* sock_get_localip +** +** gets the local ip address for the machine +** the ip it returns *should* be on the internet. +** in any case, it's as close as we can hope to get +** unless someone has better ideas on how to do this +*/ +char *sock_get_localip(char *buff, int len) +{ + char temp[1024]; + + if (gethostname(temp, sizeof(temp)) != 0) + return NULL; + + if (resolver_getip(temp, buff, len)) + return buff; + + return NULL; +} + +/* sock_error +** +** returns the last socket error +*/ +int sock_error(void) +{ +#ifdef _WIN32 + return WSAGetLastError(); +#else + return errno; +#endif +} + +void sock_set_error(int val) +{ +#ifdef _WIN32 + WSASetLastError (val); +#else + errno = val; +#endif +} + +/* sock_recoverable +** +** determines if the socket error is recoverable +** in terms of non blocking sockets +*/ +int sock_recoverable(int error) +{ + switch (error) + { + case 0: + case EAGAIN: + case EINTR: + case EINPROGRESS: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif +#if defined (WSAEWOULDBLOCK) && WSAEWOULDBLOCK != EWOULDBLOCK + case WSAEWOULDBLOCK: +#endif +#if defined (WSAEINPROGRESS) && WSAEINPROGRESS != EINPROGRESS + case WSAEINPROGRESS: +#endif +#ifdef ERESTART + case ERESTART: +#endif + return 1; + default: + return 0; + } +} + +int sock_stalled (int error) +{ + switch (error) + { + case EAGAIN: + case EINPROGRESS: + case EALREADY: +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif +#if defined (WSAEWOULDBLOCK) && WSAEWOULDBLOCK != EWOULDBLOCK + case WSAEWOULDBLOCK: +#endif +#if defined (WSAEINPROGRESS) && WSAEINPROGRESS != EINPROGRESS + case WSAEINPROGRESS: +#endif +#ifdef ERESTART + case ERESTART: +#endif + return 1; + default: + return 0; + } +} + + +static int sock_connect_pending (int error) +{ + return error == EINPROGRESS || error == EALREADY; +} + +/* sock_valid_socket +** +** determines if a sock_t represents a valid socket +*/ +int sock_valid_socket(sock_t sock) +{ + int ret; + int optval; + socklen_t optlen; + + optlen = sizeof(int); + /* apparently on windows getsockopt.optval is a char * */ + ret = getsockopt(sock, SOL_SOCKET, SO_TYPE, (void*) &optval, &optlen); + + return (ret == 0); +} + + +/* determines if the passed socket is still connected */ +int sock_active (sock_t sock) +{ + char c; + int l; + + l = recv (sock, &c, 1, MSG_PEEK); + if (l == 0) + return 0; + if (l == SOCK_ERROR && sock_recoverable (sock_error())) + return 1; + return 0; +} + +/* inet_aton +** +** turns an ascii ip address into a binary representation +*/ +#ifdef _WIN32 +int inet_aton(const char *s, struct in_addr *a) +{ + int lsb, b2, b3, msb; + + if (sscanf(s, "%d.%d.%d.%d", &lsb, &b2, &b3, &msb) < 4) { + return 0; + } + + a->s_addr = inet_addr(s); + + return (a->s_addr != INADDR_NONE); +} +#endif /* _WIN32 */ + +/* sock_set_blocking + * + * set the sock blocking or nonblocking + * 1 for blocking + * 0 for nonblocking + */ +int sock_set_blocking(sock_t sock, int block) +{ +#ifdef _WIN32 +#ifdef __MINGW32__ + u_long varblock = 1; +#else + int varblock = 1; +#endif +#endif + + if ((!sock_valid_socket(sock)) || (block < 0) || (block > 1)) + return SOCK_ERROR; + +#ifdef _WIN32 + if (block) varblock = 0; + return ioctlsocket(sock, FIONBIO, &varblock); +#else + return fcntl(sock, F_SETFL, (block) ? 0 : O_NONBLOCK); +#endif +} + +int sock_set_nolinger(sock_t sock) +{ + struct linger lin = { 0, 0 }; + return setsockopt(sock, SOL_SOCKET, SO_LINGER, (void *)&lin, + sizeof(struct linger)); +} + +int sock_set_nodelay(sock_t sock) +{ + int nodelay = 1; + + return setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&nodelay, + sizeof(int)); +} + +int sock_set_keepalive(sock_t sock) +{ + int keepalive = 1; + return setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, + sizeof(int)); +} + +/* sock_close +** +** close the socket +*/ +int sock_close(sock_t sock) +{ +#ifdef _WIN32 + return closesocket(sock); +#else + return close(sock); +#endif +} + +/* sock_writev + * + * write multiple buffers at once, return bytes actually written + */ +#ifdef HAVE_WRITEV + +ssize_t sock_writev (sock_t sock, const struct iovec *iov, size_t count) +{ + return writev (sock, iov, count); +} + +#else + +ssize_t sock_writev (sock_t sock, const struct iovec *iov, size_t count) +{ + int i = count, accum = 0, ret; + const struct iovec *v = iov; + + while (i) + { + if (v->iov_base && v->iov_len) + { + ret = sock_write_bytes (sock, v->iov_base, v->iov_len); + if (ret == -1 && accum==0) + return -1; + if (ret == -1) + ret = 0; + accum += ret; + if (ret < (int)v->iov_len) + break; + } + v++; + i--; + } + return accum; +} + +#endif + +/* sock_write_bytes +** +** write bytes to the socket +** this function will _NOT_ block +*/ +int sock_write_bytes(sock_t sock, const void *buff, size_t len) +{ + /* sanity check */ + if (!buff) { + return SOCK_ERROR; + } else if (len <= 0) { + return SOCK_ERROR; + } /*else if (!sock_valid_socket(sock)) { + return SOCK_ERROR; + } */ + + return send(sock, buff, len, 0); +} + +/* sock_write_string +** +** writes a string to a socket +** This function must only be called with a blocking socket. +*/ +int sock_write_string(sock_t sock, const char *buff) +{ + return (sock_write_bytes(sock, buff, strlen(buff)) > 0); +} + +/* sock_write +** +** write a formatted string to the socket +** this function must only be called with a blocking socket. +** will truncate the string if it's greater than 1024 chars. +*/ +int sock_write(sock_t sock, const char *fmt, ...) +{ + int rc; + va_list ap; + + va_start (ap, fmt); + rc = sock_write_fmt (sock, fmt, ap); + va_end (ap); + + return rc; +} + +#ifdef HAVE_OLD_VSNPRINTF +int sock_write_fmt(sock_t sock, const char *fmt, va_list ap) +{ + va_list ap_local; + unsigned int len = 1024; + char *buff = NULL; + int ret; + + /* don't go infinite, but stop at some huge limit */ + while (len < 2*1024*1024) + { + char *tmp = realloc (buff, len); + ret = -1; + if (tmp == NULL) + break; + buff = tmp; + va_copy (ap_local, ap); + ret = vsnprintf (buff, len, fmt, ap_local); + if (ret > 0) + { + ret = sock_write_bytes (sock, buff, ret); + break; + } + len += 8192; + } + free (buff); + return ret; +} +#else +int sock_write_fmt(sock_t sock, const char *fmt, va_list ap) +{ + char buffer [1024], *buff = buffer; + int len; + int rc = SOCK_ERROR; + va_list ap_retry; + + va_copy (ap_retry, ap); + + len = vsnprintf (buff, sizeof (buffer), fmt, ap); + + if (len > 0) + { + if ((size_t)len < sizeof (buffer)) /* common case */ + rc = sock_write_bytes(sock, buff, (size_t)len); + else + { + /* truncated */ + buff = malloc (++len); + if (buff) + { + len = vsnprintf (buff, len, fmt, ap_retry); + if (len > 0) + rc = sock_write_bytes (sock, buff, len); + free (buff); + } + } + } + va_end (ap_retry); + + return rc; +} +#endif + + +int sock_read_bytes(sock_t sock, char *buff, size_t len) +{ + + /*if (!sock_valid_socket(sock)) return 0; */ + if (!buff) return 0; + if (len <= 0) return 0; + + return recv(sock, buff, len, 0); +} + +/* sock_read_line +** +** Read one line of at max len bytes from sock into buff. +** If ok, return 1 and nullterminate buff. Otherwize return 0. +** Terminating \n is not put into the buffer. +** +** this function will probably not work on sockets in nonblocking mode +*/ +int sock_read_line(sock_t sock, char *buff, const int len) +{ + char c = '\0'; + int read_bytes, pos; + + /*if (!sock_valid_socket(sock)) { + return 0; + } else*/ if (!buff) { + return 0; + } else if (len <= 0) { + return 0; + } + + pos = 0; + read_bytes = recv(sock, &c, 1, 0); + + if (read_bytes < 0) { + return 0; + } + + while ((c != '\n') && (pos < len) && (read_bytes == 1)) { + if (c != '\r') + buff[pos++] = c; + read_bytes = recv(sock, &c, 1, 0); + } + + if (read_bytes == 1) { + buff[pos] = '\0'; + return 1; + } else { + return 0; + } +} + +/* see if a connection has been established. If timeout is < 0 then wait + * indefinitely, else wait for the stated number of seconds. + * return SOCK_TIMEOUT for timeout + * return SOCK_ERROR for failure + * return 0 for try again, interrupted + * return 1 for ok + */ +#ifdef HAVE_POLL +int sock_connected (sock_t sock, int timeout) +{ + struct pollfd check; + int val = SOCK_ERROR; + socklen_t size = sizeof val; + + check.fd = sock; + check.events = POLLOUT; + switch (poll (&check, 1, timeout*1000)) + { + case 0: return SOCK_TIMEOUT; + default: + /* on windows getsockopt.val is defined as char* */ + if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*) &val, &size) == 0) + { + if (val == 0) + return 1; + sock_set_error (val); + } + /* fall through */ + case -1: + if (sock_recoverable (sock_error())) + return 0; + return SOCK_ERROR; + } +} + +#else + +int sock_connected (sock_t sock, int timeout) +{ + fd_set wfds; + int val = SOCK_ERROR; + socklen_t size = sizeof val; + struct timeval tv, *timeval = NULL; + + /* make a timeout of <0 be indefinite */ + if (timeout >= 0) + { + tv.tv_sec = timeout; + tv.tv_usec = 0; + timeval = &tv; + } + + FD_ZERO(&wfds); + FD_SET(sock, &wfds); + + switch (select(sock + 1, NULL, &wfds, NULL, timeval)) + { + case 0: + return SOCK_TIMEOUT; + default: + /* on windows getsockopt.val is defined as char* */ + if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*) &val, &size) == 0) + { + if (val == 0) + return 1; + sock_set_error (val); + } + /* fall through */ + case -1: + if (sock_recoverable (sock_error())) + return 0; + return SOCK_ERROR; + } +} +#endif + +sock_t sock_connect_wto (const char *hostname, int port, int timeout) +{ + return sock_connect_wto_bind(hostname, port, NULL, timeout); +} + +#ifdef HAVE_GETADDRINFO + +sock_t sock_connect_non_blocking (const char *hostname, unsigned port) +{ + int sock = SOCK_ERROR; + struct addrinfo *ai, *head, hints; + char service[8]; + + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + snprintf (service, sizeof (service), "%u", port); + + if (getaddrinfo (hostname, service, &hints, &head)) + return SOCK_ERROR; + + ai = head; + while (ai) + { + if ((sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol)) + > -1) + { + sock_set_blocking (sock, 0); + if (connect(sock, ai->ai_addr, ai->ai_addrlen) < 0 && + !sock_connect_pending(sock_error())) + { + sock_close (sock); + sock = SOCK_ERROR; + } + else + break; + } + ai = ai->ai_next; + } + if (head) freeaddrinfo (head); + + return sock; +} + +/* issue a connect, but return after the timeout (seconds) is reached. If + * timeout is 0 or less then we will wait until the OS gives up on the connect + * The socket is returned + */ +sock_t sock_connect_wto_bind (const char *hostname, int port, const char *bnd, int timeout) +{ + sock_t sock = SOCK_ERROR; + struct addrinfo *ai, *head, *b_head=NULL, hints; + char service[8]; + + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + snprintf (service, sizeof (service), "%u", port); + + if (getaddrinfo (hostname, service, &hints, &head)) + return SOCK_ERROR; + + ai = head; + while (ai) + { + if ((sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol)) >= 0) + { + if (timeout > 0) + sock_set_blocking (sock, 0); + + if (bnd) + { + struct addrinfo b_hints; + memset (&b_hints, 0, sizeof(b_hints)); + b_hints.ai_family = ai->ai_family; + b_hints.ai_socktype = ai->ai_socktype; + b_hints.ai_protocol = ai->ai_protocol; + if (getaddrinfo (bnd, NULL, &b_hints, &b_head) || + bind (sock, b_head->ai_addr, b_head->ai_addrlen) < 0) + { + sock_close (sock); + sock = SOCK_ERROR; + break; + } + } + + if (connect (sock, ai->ai_addr, ai->ai_addrlen) == 0) + break; + + /* loop as the connect maybe async */ + while (sock != SOCK_ERROR) + { + if (sock_recoverable (sock_error())) + { + int connected = sock_connected (sock, timeout); + if (connected == 0) /* try again, interrupted */ + continue; + if (connected == 1) /* connected */ + { + if (timeout >= 0) + sock_set_blocking(sock, 1); + break; + } + } + sock_close (sock); + sock = SOCK_ERROR; + } + if (sock != SOCK_ERROR) + break; + } + ai = ai->ai_next; + } + if (b_head) + freeaddrinfo (b_head); + freeaddrinfo (head); + + return sock; +} + + +sock_t sock_get_server_socket (int port, const char *sinterface) +{ + struct sockaddr_storage sa; + struct addrinfo hints, *res, *ai; + char service [10]; + int sock; + + if (port < 0) + return SOCK_ERROR; + + memset (&sa, 0, sizeof(sa)); + memset (&hints, 0, sizeof(hints)); + + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG | AI_NUMERICSERV | AI_NUMERICHOST; + hints.ai_socktype = SOCK_STREAM; + snprintf (service, sizeof (service), "%d", port); + + if (getaddrinfo (sinterface, service, &hints, &res)) + return SOCK_ERROR; + ai = res; + do + { + int on = 1; + sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (sock < 0) + continue; + + setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)); + on = 0; +#ifdef IPV6_V6ONLY + setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof on); +#endif + + if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) + { + sock_close (sock); + continue; + } + freeaddrinfo (res); + return sock; + + } while ((ai = ai->ai_next)); + + freeaddrinfo (res); + return SOCK_ERROR; +} + + +#else + + +int sock_try_connection (sock_t sock, const char *hostname, unsigned int port) +{ + struct sockaddr_in sin, server; + char ip[MAX_ADDR_LEN]; + + if (!hostname || !hostname[0] || port == 0) + return -1; + + memset(&sin, 0, sizeof(struct sockaddr_in)); + memset(&server, 0, sizeof(struct sockaddr_in)); + + if (!resolver_getip(hostname, ip, MAX_ADDR_LEN)) + { + sock_close (sock); + return -1; + } + + if (inet_aton(ip, (struct in_addr *)&sin.sin_addr) == 0) + { + sock_close(sock); + return -1; + } + + memcpy(&server.sin_addr, &sin.sin_addr, sizeof(struct sockaddr_in)); + + server.sin_family = AF_INET; + server.sin_port = htons((short)port); + + return connect(sock, (struct sockaddr *)&server, sizeof(server)); +} + +sock_t sock_connect_non_blocking (const char *hostname, unsigned port) +{ + sock_t sock; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == SOCK_ERROR) + return SOCK_ERROR; + + sock_set_blocking (sock, 0); + sock_try_connection (sock, hostname, port); + + return sock; +} + +sock_t sock_connect_wto_bind (const char *hostname, int port, const char *bnd, int timeout) +{ + sock_t sock; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == SOCK_ERROR) + return SOCK_ERROR; + + if (bnd) + { + struct sockaddr_in sa; + + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + + if (inet_aton (bnd, &sa.sin_addr) == 0 || + bind (sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) + { + sock_close (sock); + return SOCK_ERROR; + } + } + + if (timeout) + { + sock_set_blocking (sock, 0); + if (sock_try_connection (sock, hostname, port) < 0) + { + int ret = sock_connected (sock, timeout); + if (ret <= 0) + { + sock_close (sock); + return SOCK_ERROR; + } + } + sock_set_blocking(sock, 1); + } + else + { + if (sock_try_connection (sock, hostname, port) < 0) + { + sock_close (sock); + sock = SOCK_ERROR; + } + } + return sock; +} + + +/* sock_get_server_socket +** +** create a socket for incoming requests on a specified port and +** interface. if interface is null, listen on all interfaces. +** returns the socket, or SOCK_ERROR on failure +*/ +sock_t sock_get_server_socket(int port, const char *sinterface) +{ + struct sockaddr_in sa; + int error, opt; + sock_t sock; + char ip[MAX_ADDR_LEN]; + + if (port < 0) + return SOCK_ERROR; + + /* defaults */ + memset(&sa, 0, sizeof(sa)); + + /* set the interface to bind to if specified */ + if (sinterface != NULL) { + if (!resolver_getip(sinterface, ip, sizeof (ip))) + return SOCK_ERROR; + + if (!inet_aton(ip, &sa.sin_addr)) { + return SOCK_ERROR; + } else { + sa.sin_family = AF_INET; + sa.sin_port = htons((short)port); + } + } else { + sa.sin_addr.s_addr = INADDR_ANY; + sa.sin_family = AF_INET; + sa.sin_port = htons((short)port); + } + + /* get a socket */ + sock = socket (AF_INET, SOCK_STREAM, 0); + if (sock == -1) + return SOCK_ERROR; + + /* reuse it if we can */ + opt = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(int)); + + /* bind socket to port */ + error = bind(sock, (struct sockaddr *)&sa, sizeof (struct sockaddr_in)); + if (error == -1) + return SOCK_ERROR; + + return sock; +} + +#endif + +void sock_set_send_buffer (sock_t sock, int win_size) +{ + setsockopt (sock, SOL_SOCKET, SO_SNDBUF, (char *) &win_size, sizeof(win_size)); +} + +int sock_listen(sock_t serversock, int backlog) +{ + if (!sock_valid_socket(serversock)) + return 0; + + if (backlog <= 0) + backlog = 10; + + return (listen(serversock, backlog) == 0); +} + +sock_t sock_accept(sock_t serversock, char *ip, size_t len) +{ +#ifdef HAVE_GETNAMEINFO + struct sockaddr_storage sa; +#else + struct sockaddr_in sa; +#endif + sock_t ret; + socklen_t slen; + + if (ip == NULL || len == 0 || !sock_valid_socket(serversock)) + return SOCK_ERROR; + + slen = sizeof(sa); + ret = accept(serversock, (struct sockaddr *)&sa, &slen); + + if (ret != SOCK_ERROR) + { +#ifdef HAVE_GETNAMEINFO + if (getnameinfo ((struct sockaddr *)&sa, slen, ip, len, NULL, 0, NI_NUMERICHOST)) + snprintf (ip, len, "unknown"); +#else + /* inet_ntoa is not reentrant, we should protect this */ + strncpy(ip, inet_ntoa(sa.sin_addr), len); +#endif + sock_set_nolinger(ret); + sock_set_keepalive(ret); + } + + return ret; +} + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/sock.h mixxx-2.2.4~dfsg/lib/libshout/src/common/net/sock.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/sock.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/sock.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,151 @@ +/* sock.h + * - General Socket Function Headers + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt , + * Ed "oddsock" Zaleski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __SOCK_H +#define __SOCK_H + +#include + +#ifdef HAVE_WINSOCK2_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#elif _WIN32 +#include +#endif + +#ifdef HAVE_SYS_UIO_H +#include +#else +#ifndef _SYS_UIO_H +struct iovec +{ + void *iov_base; + size_t iov_len; +}; +#endif +#endif + +#if !defined(HAVE_INET_ATON) && defined(HAVE_INET_PTON) +#define inet_aton(a,b) inet_pton(AF_INET, (a), (b)) +#endif + +#ifdef INET6_ADDRSTRLEN +#define MAX_ADDR_LEN INET6_ADDRSTRLEN +#else +#define MAX_ADDR_LEN 46 +#endif + +#ifndef sock_t +#define sock_t int +#endif + +/* The following values are based on unix avoiding errno value clashes */ +#define SOCK_SUCCESS 0 +#define SOCK_ERROR (sock_t)-1 +#define SOCK_TIMEOUT -2 + +/* sock connect macro */ +#define sock_connect(h, p) sock_connect_wto(h, p, 0) + +#ifdef _mangle +# define sock_initialize _mangle(sock_initialize) +# define sock_shutdown _mangle(sock_shutdown) +# define sock_get_localip _mangle(sock_get_localip) +# define sock_error _mangle(sock_error) +# define sock_set_error _mangle(sock_set_error) +# define sock_recoverable _mangle(sock_recoverable) +# define sock_stalled _mangle(sock_stalled) +# define sock_valid_socket _mangle(sock_valid_socket) +# define sock_set_blocking _mangle(sock_set_blocking) +# define sock_set_nolinger _mangle(sock_set_nolinger) +# define sock_set_nodelay _mangle(sock_set_nodelay) +# define sock_set_keepalive _mangle(sock_set_keepalive) +# define sock_close _mangle(sock_close) +# define sock_connect_wto _mangle(sock_connect_wto) +# define sock_connect_wto_bind _mangle(sock_connect_wto_bind) +# define sock_connect_non_blocking _mangle(sock_connect_non_blocking) +# define sock_connected _mangle(sock_connected) +# define sock_write_bytes _mangle(sock_write_bytes) +# define sock_write _mangle(sock_write) +# define sock_write_fmt _mangle(sock_write_fmt) +# define sock_write_string _mangle(sock_write_string) +# define sock_writev _mangle(sock_writev) +# define sock_read_bytes _mangle(sock_read_bytes) +# define sock_read_line _mangle(sock_read_line) +# define sock_get_server_socket _mangle(sock_get_server_socket) +# define sock_listen _mangle(sock_listen) +# define sock_set_send_buffer _mangle(sock_set_send_buffer) +# define sock_accept _mangle(sock_accept) +#endif + +/* Misc socket functions */ +void sock_initialize(void); +void sock_shutdown(void); +char *sock_get_localip(char *buff, int len); +int sock_error(void); +int sock_recoverable(int error); +int sock_stalled(int error); +int sock_valid_socket(sock_t sock); +int sock_active (sock_t sock); +int sock_set_blocking(sock_t sock, int block); +int sock_set_nolinger(sock_t sock); +int sock_set_keepalive(sock_t sock); +int sock_set_nodelay(sock_t sock); +void sock_set_send_buffer (sock_t sock, int win_size); +void sock_set_error(int val); +int sock_close(sock_t sock); + +/* Connection related socket functions */ +sock_t sock_connect_wto(const char *hostname, int port, int timeout); +sock_t sock_connect_wto_bind(const char *hostname, int port, const char *bnd, int timeout); +sock_t sock_connect_non_blocking(const char *host, unsigned port); +int sock_connected(sock_t sock, int timeout); + +/* Socket write functions */ +int sock_write_bytes(sock_t sock, const void *buff, size_t len); +int sock_write(sock_t sock, const char *fmt, ...); +int sock_write_fmt(sock_t sock, const char *fmt, va_list ap); +int sock_write_string(sock_t sock, const char *buff); +ssize_t sock_writev (sock_t sock, const struct iovec *iov, size_t count); + + +/* Socket read functions */ +int sock_read_bytes(sock_t sock, char *buff, size_t len); +int sock_read_line(sock_t sock, char *string, const int len); + +/* server socket functions */ +sock_t sock_get_server_socket(int port, const char *sinterface); +int sock_listen(sock_t serversock, int backlog); +sock_t sock_accept(sock_t serversock, char *ip, size_t len); + +#ifdef _WIN32 +int inet_aton(const char *s, struct in_addr *a); +#endif + +#endif /* __SOCK_H */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/test_resolver.c mixxx-2.2.4~dfsg/lib/libshout/src/common/net/test_resolver.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/test_resolver.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/test_resolver.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,17 @@ +#include +#include + +#include "resolver.h" + +int main() +{ + char buff[1024]; + + resolver_initialize(); + + printf("I got %s, when looking up %s.\n", resolver_getip("bach.greenwitch.com", buff, 1024), "bach.greenwitch.com"); + printf("I got %s, when looking up %s.\n", resolver_getname("207.181.249.14", buff, 1024), "207.181.249.14"); + + return 0; +} + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/net/TODO mixxx-2.2.4~dfsg/lib/libshout/src/common/net/TODO --- mixxx-2.2.3~dfsg/lib/libshout/src/common/net/TODO 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/net/TODO 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1 @@ +- add getXbyY_r function support diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/BUILDING mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/BUILDING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/BUILDING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/BUILDING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ +defines that affect compilation + +_WIN32 + this should be defined for Win32 platforms + +DEBUG_MUTEXES + define this to turn on mutex debugging. this will log locks/unlocks. + +CHECK_MUTEXES (DEBUG_MUTEXES must also be defined) + checks to make sure mutex operations make sense. ie, multi_mutex is locked + when locking multiple mutexes, etc. + +THREAD_DEBUG (define to 1-4) + turns on the thread.log logging + + + + + + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/COPYING mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = BUILDING COPYING README TODO + +noinst_LTLIBRARIES = libicethread.la +noinst_HEADERS = thread.h + +libicethread_la_SOURCES = thread.c +libicethread_la_CFLAGS = @XIPH_CFLAGS@ + +INCLUDES = -I$(srcdir)/.. + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/README mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/README --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,9 @@ +This is the cross platform thread and syncronization library. + +It depends on the avl library. + +This is a massively cleaned and picked through version of the code from +the icecast 1.3.x base. It has not been heavily tested *YET*. But since +it's just cleanups, it really shouldn't have that many problems. + +jack. diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/thread.c mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/thread.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/thread.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/thread.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,846 @@ +/* threads.c: Thread Abstraction Functions + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt , + * Ed "oddsock" Zaleski + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#ifndef _WIN32 +#include +#include +#else +#include +#include +#endif + +#include + +#include +#include +#ifdef THREAD_DEBUG +#include +#endif + +#ifdef _WIN32 +#define __FUNCTION__ __FILE__ +#endif + +#ifdef THREAD_DEBUG +#define CATMODULE "thread" +#define LOG_ERROR(y) log_write(_logid, 1, CATMODULE "/", __FUNCTION__, y) +#define LOG_ERROR3(y, z1, z2, z3) log_write(_logid, 1, CATMODULE "/", __FUNCTION__, y, z1, z2, z3) +#define LOG_ERROR7(y, z1, z2, z3, z4, z5, z6, z7) log_write(_logid, 1, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4, z5, z6, z7) + +#define LOG_WARN(y) log_write(_logid, 2, CATMODULE "/", __FUNCTION__, y) +#define LOG_WARN3(y, z1, z2, z3) log_write(_logid, 2, CATMODULE "/", __FUNCTION__, y, z1, z2, z3) +#define LOG_WARN5(y, z1, z2, z3, z4, z5) log_write(_logid, 2, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4, z5) +#define LOG_WARN7(y, z1, z2, z3, z4, z5, z6, z7) log_write(_logid, 2, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4, z5, z6, z7) + +#define LOG_INFO(y) log_write(_logid, 3, CATMODULE "/", __FUNCTION__, y) +#define LOG_INFO4(y, z1, z2, z3, z4) log_write(_logid, 3, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4) +#define LOG_INFO5(y, z1, z2, z3, z4, z5) log_write(_logid, 3, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4, z5) + +#define LOG_DEBUG(y) log_write(_logid, 4, CATMODULE "/", __FUNCTION__, y) +#define LOG_DEBUG2(y, z1, z2) log_write(_logid, 4, CATMODULE "/", __FUNCTION__, y, z1, z2) +#define LOG_DEBUG5(y, z1, z2, z3, z4, z5) log_write(_logid, 4, CATMODULE "/", __FUNCTION__, y, z1, z2, z3, z4, z5) +#endif + +/* thread starting structure */ +typedef struct thread_start_tag { + /* the real start routine and arg */ + void *(*start_routine)(void *); + void *arg; + + /* the other stuff we need to make sure this thread is inserted into + ** the thread tree + */ + thread_type *thread; + pthread_t sys_thread; +} thread_start_t; + +static long _next_thread_id = 0; +static int _initialized = 0; +static avl_tree *_threadtree = NULL; + +#ifdef DEBUG_MUTEXES +static mutex_t _threadtree_mutex = { -1, NULL, MUTEX_STATE_UNINIT, NULL, -1, + PTHREAD_MUTEX_INITIALIZER}; +#else +static mutex_t _threadtree_mutex = { PTHREAD_MUTEX_INITIALIZER }; +#endif + + + +#ifdef DEBUG_MUTEXES +static int _logid = -1; +static long _next_mutex_id = 0; + +static avl_tree *_mutextree = NULL; +static mutex_t _mutextree_mutex = { -1, NULL, MUTEX_STATE_UNINIT, NULL, -1, + PTHREAD_MUTEX_INITIALIZER}; +#endif + +#ifdef DEBUG_MUTEXES +static mutex_t _library_mutex = { -1, NULL, MUTEX_STATE_UNINIT, NULL, -1, + PTHREAD_MUTEX_INITIALIZER}; +#else +static mutex_t _library_mutex = { PTHREAD_MUTEX_INITIALIZER }; +#endif + +/* INTERNAL FUNCTIONS */ + +/* avl tree functions */ +#ifdef DEBUG_MUTEXES +static int _compare_mutexes(void *compare_arg, void *a, void *b); +static int _free_mutex(void *key); +#endif + +static int _compare_threads(void *compare_arg, void *a, void *b); +static int _free_thread(void *key); + +/* mutex fuctions */ +static void _mutex_create(mutex_t *mutex); +static void _mutex_lock(mutex_t *mutex); +static void _mutex_unlock(mutex_t *mutex); + +/* misc thread stuff */ +static void *_start_routine(void *arg); +static void _catch_signals(void); +static void _block_signals(void); + +/* LIBRARY INITIALIZATION */ + +void thread_initialize(void) +{ + thread_type *thread; + + /* set up logging */ + +#ifdef THREAD_DEBUG + log_initialize(); + _logid = log_open("thread.log"); + log_set_level(_logid, THREAD_DEBUG); +#endif + +#ifdef DEBUG_MUTEXES + /* create all the internal mutexes, and initialize the mutex tree */ + + _mutextree = avl_tree_new(_compare_mutexes, NULL); + + /* we have to create this one by hand, because there's no + ** mutextree_mutex to lock yet! + */ + _mutex_create(&_mutextree_mutex); + + _mutextree_mutex.mutex_id = _next_mutex_id++; + avl_insert(_mutextree, (void *)&_mutextree_mutex); +#endif + + thread_mutex_create(&_threadtree_mutex); + thread_mutex_create(&_library_mutex); + + /* initialize the thread tree and insert the main thread */ + + _threadtree = avl_tree_new(_compare_threads, NULL); + + thread = (thread_type *)malloc(sizeof(thread_type)); + + thread->thread_id = _next_thread_id++; + thread->line = 0; + thread->file = strdup("main.c"); + thread->sys_thread = pthread_self(); + thread->create_time = time(NULL); + thread->name = strdup("Main Thread"); + + avl_insert(_threadtree, (void *)thread); + + _catch_signals(); + + _initialized = 1; +} + +void thread_shutdown(void) +{ + if (_initialized == 1) { + thread_mutex_destroy(&_library_mutex); + thread_mutex_destroy(&_threadtree_mutex); +#ifdef THREAD_DEBUG + thread_mutex_destroy(&_mutextree_mutex); + + avl_tree_free(_mutextree, _free_mutex); +#endif + avl_tree_free(_threadtree, _free_thread); + _threadtree = NULL; + } + +#ifdef THREAD_DEBUG + log_close(_logid); + log_shutdown(); +#endif + +} + +/* + * Signals should be handled by the main thread, nowhere else. + * I'm using POSIX signal interface here, until someone tells me + * that I should use signal/sigset instead + * + * This function only valid for non-Win32 + */ +static void _block_signals(void) +{ +#ifndef _WIN32 + sigset_t ss; + + sigfillset(&ss); + + /* These ones we want */ + sigdelset(&ss, SIGKILL); + sigdelset(&ss, SIGSTOP); + sigdelset(&ss, SIGSEGV); + sigdelset(&ss, SIGCHLD); + sigdelset(&ss, SIGBUS); + if (pthread_sigmask(SIG_BLOCK, &ss, NULL) != 0) { +#ifdef THREAD_DEBUG + LOG_ERROR("Pthread_sigmask() failed for blocking signals"); +#endif + } +#endif +} + +/* + * Let the calling thread catch all the relevant signals + * + * This function only valid for non-Win32 + */ +static void _catch_signals(void) +{ +#ifndef _WIN32 + sigset_t ss; + + sigemptyset(&ss); + + /* These ones should only be accepted by the signal handling thread (main thread) */ + sigaddset(&ss, SIGHUP); + sigaddset(&ss, SIGCHLD); + sigaddset(&ss, SIGINT); + sigaddset(&ss, SIGPIPE); + sigaddset(&ss, SIGTERM); + + if (pthread_sigmask(SIG_UNBLOCK, &ss, NULL) != 0) { +#ifdef THREAD_DEBUG + LOG_ERROR("pthread_sigmask() failed for catching signals!"); +#endif + } +#endif +} + + +thread_type *thread_create_c(char *name, void *(*start_routine)(void *), + void *arg, int detached, int line, char *file) +{ + thread_type *thread = NULL; + thread_start_t *start = NULL; + pthread_attr_t attr; + + thread = (thread_type *)calloc(1, sizeof(thread_type)); + do { + if (thread == NULL) + break; + start = (thread_start_t *)calloc(1, sizeof(thread_start_t)); + if (start == NULL) + break; + if (pthread_attr_init (&attr) < 0) + break; + + thread->line = line; + thread->file = strdup(file); + + _mutex_lock (&_threadtree_mutex); + thread->thread_id = _next_thread_id++; + _mutex_unlock (&_threadtree_mutex); + + thread->name = strdup(name); + thread->create_time = time(NULL); + + start->start_routine = start_routine; + start->arg = arg; + start->thread = thread; + + pthread_attr_setstacksize (&attr, 512*1024); + pthread_attr_setinheritsched (&attr, PTHREAD_INHERIT_SCHED); + if (detached) + { + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + thread->detached = 1; + } + + if (pthread_create (&thread->sys_thread, &attr, _start_routine, start) == 0) + { + pthread_attr_destroy (&attr); + return thread; + } + else + pthread_attr_destroy (&attr); + } + while (0); + +#ifdef THREAD_DEBUG + LOG_ERROR("Could not create new thread %s", name); +#endif + if (start) free (start); + if (thread) free (thread); + return NULL; +} + +/* _mutex_create +** +** creates a mutex +*/ +static void _mutex_create(mutex_t *mutex) +{ +#ifdef DEBUG_MUTEXES + mutex->thread_id = MUTEX_STATE_NEVERLOCKED; + mutex->line = -1; +#endif + + pthread_mutex_init(&mutex->sys_mutex, NULL); +} + +void thread_mutex_create_c(mutex_t *mutex, int line, char *file) +{ + _mutex_create(mutex); + +#ifdef DEBUG_MUTEXES + _mutex_lock(&_mutextree_mutex); + mutex->mutex_id = _next_mutex_id++; + avl_insert(_mutextree, (void *)mutex); + _mutex_unlock(&_mutextree_mutex); +#endif +} + +void thread_mutex_destroy (mutex_t *mutex) +{ + pthread_mutex_destroy(&mutex->sys_mutex); + +#ifdef DEBUG_MUTEXES + _mutex_lock(&_mutextree_mutex); + avl_delete(_mutextree, mutex, _free_mutex); + _mutex_unlock(&_mutextree_mutex); +#endif +} + +void thread_mutex_lock_c(mutex_t *mutex, int line, char *file) +{ +#ifdef DEBUG_MUTEXES + thread_type *th = thread_self(); + + if (!th) LOG_WARN("No mt record for %u in lock [%s:%d]", thread_self(), file, line); + + LOG_DEBUG5("Locking %p (%s) on line %d in file %s by thread %d", mutex, mutex->name, line, file, th ? th->thread_id : -1); + +# ifdef CHECK_MUTEXES + /* Just a little sanity checking to make sure that we're locking + ** mutexes correctly + */ + + if (th) { + int locks = 0; + avl_node *node; + mutex_t *tmutex; + + _mutex_lock(&_mutextree_mutex); + + node = avl_get_first (_mutextree); + + while (node) { + tmutex = (mutex_t *)node->key; + + if (tmutex->mutex_id == mutex->mutex_id) { + if (tmutex->thread_id == th->thread_id) { + /* Deadlock, same thread can't lock the same mutex twice */ + LOG_ERROR7("DEADLOCK AVOIDED (%d == %d) on mutex [%s] in file %s line %d by thread %d [%s]", + tmutex->thread_id, th->thread_id, mutex->name ? mutex->name : "undefined", file, line, th->thread_id, th->name); + + _mutex_unlock(&_mutextree_mutex); + return; + } + } else if (tmutex->thread_id == th->thread_id) { + /* Mutex locked by this thread (not this mutex) */ + locks++; + } + + node = avl_get_next(node); + } + + if (locks > 0) { + /* Has already got a mutex locked */ + if (_multi_mutex.thread_id != th->thread_id) { + /* Tries to lock two mutexes, but has not got the double mutex, norty boy! */ + LOG_WARN("(%d != %d) Thread %d [%s] tries to lock a second mutex [%s] in file %s line %d, without locking double mutex!", + _multi_mutex.thread_id, th->thread_id, th->thread_id, th->name, mutex->name ? mutex->name : "undefined", file, line); + } + } + + _mutex_unlock(&_mutextree_mutex); + } +# endif /* CHECK_MUTEXES */ + + _mutex_lock(mutex); + + _mutex_lock(&_mutextree_mutex); + + LOG_DEBUG2("Locked %p by thread %d", mutex, th ? th->thread_id : -1); + mutex->line = line; + if (th) { + mutex->thread_id = th->thread_id; + } + + _mutex_unlock(&_mutextree_mutex); +#else + _mutex_lock(mutex); +#endif /* DEBUG_MUTEXES */ +} + +void thread_mutex_unlock_c(mutex_t *mutex, int line, char *file) +{ +#ifdef DEBUG_MUTEXES + thread_type *th = thread_self(); + + if (!th) { + LOG_ERROR3("No record for %u in unlock [%s:%d]", thread_self(), file, line); + } + + LOG_DEBUG5("Unlocking %p (%s) on line %d in file %s by thread %d", mutex, mutex->name, line, file, th ? th->thread_id : -1); + + mutex->line = line; + +# ifdef CHECK_MUTEXES + if (th) { + int locks = 0; + avl_node *node; + mutex_t *tmutex; + + _mutex_lock(&_mutextree_mutex); + + while (node) { + tmutex = (mutex_t *)node->key; + + if (tmutex->mutex_id == mutex->mutex_id) { + if (tmutex->thread_id != th->thread_id) { + LOG_ERROR7("ILLEGAL UNLOCK (%d != %d) on mutex [%s] in file %s line %d by thread %d [%s]", tmutex->thread_id, th->thread_id, + mutex->name ? mutex->name : "undefined", file, line, th->thread_id, th->name); + _mutex_unlock(&_mutextree_mutex); + return; + } + } else if (tmutex->thread_id == th->thread_id) { + locks++; + } + + node = avl_get_next (node); + } + + if ((locks > 0) && (_multi_mutex.thread_id != th->thread_id)) { + /* Don't have double mutex, has more than this mutex left */ + + LOG_WARN("(%d != %d) Thread %d [%s] tries to unlock a mutex [%s] in file %s line %d, without owning double mutex!", + _multi_mutex.thread_id, th->thread_id, th->thread_id, th->name, mutex->name ? mutex->name : "undefined", file, line); + } + + _mutex_unlock(&_mutextree_mutex); + } +# endif /* CHECK_MUTEXES */ + + _mutex_unlock(mutex); + + _mutex_lock(&_mutextree_mutex); + + LOG_DEBUG2("Unlocked %p by thread %d", mutex, th ? th->thread_id : -1); + mutex->line = -1; + if (mutex->thread_id == th->thread_id) { + mutex->thread_id = MUTEX_STATE_NOTLOCKED; + } + + _mutex_unlock(&_mutextree_mutex); +#else + _mutex_unlock(mutex); +#endif /* DEBUG_MUTEXES */ +} + +void thread_cond_create_c(cond_t *cond, int line, char *file) +{ + pthread_cond_init(&cond->sys_cond, NULL); + pthread_mutex_init(&cond->cond_mutex, NULL); +} + +void thread_cond_destroy(cond_t *cond) +{ + pthread_mutex_destroy(&cond->cond_mutex); + pthread_cond_destroy(&cond->sys_cond); +} + +void thread_cond_signal_c(cond_t *cond, int line, char *file) +{ + pthread_cond_signal(&cond->sys_cond); +} + +void thread_cond_broadcast_c(cond_t *cond, int line, char *file) +{ + pthread_cond_broadcast(&cond->sys_cond); +} + +void thread_cond_timedwait_c(cond_t *cond, int millis, int line, char *file) +{ + struct timespec time; + + time.tv_sec = millis/1000; + time.tv_nsec = (millis - time.tv_sec*1000)*1000000; + + pthread_mutex_lock(&cond->cond_mutex); + pthread_cond_timedwait(&cond->sys_cond, &cond->cond_mutex, &time); + pthread_mutex_unlock(&cond->cond_mutex); +} + +void thread_cond_wait_c(cond_t *cond, int line, char *file) +{ + pthread_mutex_lock(&cond->cond_mutex); + pthread_cond_wait(&cond->sys_cond, &cond->cond_mutex); + pthread_mutex_unlock(&cond->cond_mutex); +} + +void thread_rwlock_create_c(rwlock_t *rwlock, int line, char *file) +{ + pthread_rwlock_init(&rwlock->sys_rwlock, NULL); +} + +void thread_rwlock_destroy(rwlock_t *rwlock) +{ + pthread_rwlock_destroy(&rwlock->sys_rwlock); +} + +void thread_rwlock_rlock_c(rwlock_t *rwlock, int line, char *file) +{ + pthread_rwlock_rdlock(&rwlock->sys_rwlock); +} + +void thread_rwlock_wlock_c(rwlock_t *rwlock, int line, char *file) +{ + pthread_rwlock_wrlock(&rwlock->sys_rwlock); +} + +void thread_rwlock_unlock_c(rwlock_t *rwlock, int line, char *file) +{ + pthread_rwlock_unlock(&rwlock->sys_rwlock); +} + +void thread_exit_c(long val, int line, char *file) +{ + thread_type *th = thread_self(); + +#if defined(DEBUG_MUTEXES) && defined(CHECK_MUTEXES) + if (th) { + avl_node *node; + mutex_t *tmutex; + char name[40]; + + _mutex_lock(&_mutextree_mutex); + + while (node) { + tmutex = (mutex_t *)node->key; + + if (tmutex->thread_id == th->thread_id) { + LOG_WARN("Thread %d [%s] exiting in file %s line %d, without unlocking mutex [%s]", + th->thread_id, th->name, file, line, mutex_to_string(tmutex, name)); + } + + node = avl_get_next (node); + } + + _mutex_unlock(&_mutextree_mutex); + } +#endif + + if (th && th->detached) + { +#ifdef THREAD_DEBUG + LOG_INFO4("Removing thread %d [%s] started at [%s:%d], reason: 'Thread Exited'", th->thread_id, th->name, th->file, th->line); +#endif + + _mutex_lock(&_threadtree_mutex); + avl_delete(_threadtree, th, _free_thread); + _mutex_unlock(&_threadtree_mutex); + } + + pthread_exit ((void*)val); +} + +/* sleep for a number of microseconds */ +void thread_sleep(unsigned long len) +{ +#ifdef _WIN32 + Sleep(len / 1000); +#else +# ifdef HAVE_NANOSLEEP + struct timespec time_sleep; + struct timespec time_remaining; + int ret; + + time_sleep.tv_sec = len / 1000000; + time_sleep.tv_nsec = (len % 1000000) * 1000; + + ret = nanosleep(&time_sleep, &time_remaining); + while (ret != 0 && errno == EINTR) { + time_sleep.tv_sec = time_remaining.tv_sec; + time_sleep.tv_nsec = time_remaining.tv_nsec; + + ret = nanosleep(&time_sleep, &time_remaining); + } +# else + struct timeval tv; + + tv.tv_sec = len / 1000000; + tv.tv_usec = (len % 1000000); + + select(0, NULL, NULL, NULL, &tv); +# endif +#endif +} + +static void *_start_routine(void *arg) +{ + thread_start_t *start = (thread_start_t *)arg; + void *(*start_routine)(void *) = start->start_routine; + void *real_arg = start->arg; + thread_type *thread = start->thread; + + _block_signals(); + + /* insert thread into thread tree here */ + _mutex_lock(&_threadtree_mutex); + thread->sys_thread = pthread_self(); + avl_insert(_threadtree, (void *)thread); + _mutex_unlock(&_threadtree_mutex); + +#ifdef THREAD_DEBUG + LOG_INFO4("Added thread %d [%s] started at [%s:%d]", thread->thread_id, thread->name, thread->file, thread->line); +#endif + + pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); + free (start); + + (start_routine)(real_arg); + + if (thread->detached) + { + _mutex_lock (&_threadtree_mutex); + avl_delete (_threadtree, thread, _free_thread); + _mutex_unlock (&_threadtree_mutex); + } + + return NULL; +} + +thread_type *thread_self(void) +{ + avl_node *node; + thread_type *th; + pthread_t sys_thread = pthread_self(); + + _mutex_lock(&_threadtree_mutex); + + if (_threadtree == NULL) { +#ifdef THREAD_DEBUG + LOG_WARN("Thread tree is empty, this must be wrong!"); +#endif + _mutex_unlock(&_threadtree_mutex); + return NULL; + } + + node = avl_get_first(_threadtree); + + while (node) { + th = (thread_type *)node->key; + + if (th && pthread_equal(sys_thread, th->sys_thread)) { + _mutex_unlock(&_threadtree_mutex); + return th; + } + + node = avl_get_next(node); + } + _mutex_unlock(&_threadtree_mutex); + + +#ifdef THREAD_DEBUG + LOG_ERROR("Nonexistant thread alive..."); +#endif + + return NULL; +} + +void thread_rename(const char *name) +{ + thread_type *th; + + th = thread_self(); + if (th->name) free(th->name); + + th->name = strdup(name); +} + +static void _mutex_lock(mutex_t *mutex) +{ + pthread_mutex_lock(&mutex->sys_mutex); +} + +static void _mutex_unlock(mutex_t *mutex) +{ + pthread_mutex_unlock(&mutex->sys_mutex); +} + + +void thread_library_lock(void) +{ + _mutex_lock(&_library_mutex); +} + +void thread_library_unlock(void) +{ + _mutex_unlock(&_library_mutex); +} + +void thread_join(thread_type *thread) +{ + void *ret; + int i; + + i = pthread_join(thread->sys_thread, &ret); + _mutex_lock(&_threadtree_mutex); + avl_delete(_threadtree, thread, _free_thread); + _mutex_unlock(&_threadtree_mutex); +} + +/* AVL tree functions */ + +#ifdef DEBUG_MUTEXES +static int _compare_mutexes(void *compare_arg, void *a, void *b) +{ + mutex_t *m1, *m2; + + m1 = (mutex_t *)a; + m2 = (mutex_t *)b; + + if (m1->mutex_id > m2->mutex_id) + return 1; + if (m1->mutex_id < m2->mutex_id) + return -1; + return 0; +} +#endif + +static int _compare_threads(void *compare_arg, void *a, void *b) +{ + thread_type *t1, *t2; + + t1 = (thread_type *)a; + t2 = (thread_type *)b; + + if (t1->thread_id > t2->thread_id) + return 1; + if (t1->thread_id < t2->thread_id) + return -1; + return 0; +} + +#ifdef DEBUG_MUTEXES +static int _free_mutex(void *key) +{ + mutex_t *m; + + m = (mutex_t *)key; + + if (m && m->file) { + free(m->file); + m->file = NULL; + } + + /* all mutexes are static. don't need to free them */ + + return 1; +} +#endif + +static int _free_thread(void *key) +{ + thread_type *t; + + t = (thread_type *)key; + + if (t->file) + free(t->file); + if (t->name) + free(t->name); + + free(t); + + return 1; +} + + +#ifdef HAVE_PTHREAD_SPIN_LOCK +void thread_spin_create (spin_t *spin) +{ + int x = pthread_spin_init (&spin->lock, PTHREAD_PROCESS_PRIVATE); + if (x) + abort(); +} + +void thread_spin_destroy (spin_t *spin) +{ + pthread_spin_destroy (&spin->lock); +} + +void thread_spin_lock (spin_t *spin) +{ + int x = pthread_spin_lock (&spin->lock); + if (x != 0) + abort(); +} + +void thread_spin_unlock (spin_t *spin) +{ + pthread_spin_unlock (&spin->lock); +} +#endif + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/thread.h mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/thread.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/thread.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/thread.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,207 @@ +/* thread.h + * - Thread Abstraction Function Headers + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __THREAD_H__ +#define __THREAD_H__ + +#include + +/* renamed from thread_t due to conflict on OS X */ + +typedef struct { + /* the local id for the thread, and it's name */ + long thread_id; + char *name; + + /* the time the thread was created */ + time_t create_time; + + /* the file and line which created this thread */ + char *file; + int line; + + /* is the thread running detached? */ + int detached; + + /* the system specific thread */ + pthread_t sys_thread; +} thread_type; + +typedef struct { +#ifdef DEBUG_MUTEXES + /* the local id and name of the mutex */ + long mutex_id; + char *name; + + /* the thread which is currently locking this mutex */ + long thread_id; + + /* the file and line where the mutex was locked */ + char *file; + int line; + +#endif + + /* the system specific mutex */ + pthread_mutex_t sys_mutex; +} mutex_t; + +typedef struct { +#ifdef THREAD_DEBUG + long cond_id; + char *name; +#endif + + pthread_mutex_t cond_mutex; + pthread_cond_t sys_cond; +} cond_t; + +typedef struct { +#ifdef THREAD_DEBUG + long rwlock_id; + char *name; + + /* information on which thread and where in the code + ** this rwlock was write locked + */ + long thread_id; + char *file; + int line; +#endif + + pthread_rwlock_t sys_rwlock; +} rwlock_t; + +#ifdef HAVE_PTHREAD_SPIN_LOCK +typedef struct +{ + pthread_spinlock_t lock; +} spin_t; + +void thread_spin_create (spin_t *spin); +void thread_spin_destroy (spin_t *spin); +void thread_spin_lock (spin_t *spin); +void thread_spin_unlock (spin_t *spin); +#else +typedef mutex_t spin_t; +#define thread_spin_create(x) thread_mutex_create(x) +#define thread_spin_destroy(x) thread_mutex_destroy(x) +#define thread_spin_lock(x) thread_mutex_lock(x) +#define thread_spin_unlock(x) thread_mutex_unlock(x) +#endif + +#define thread_create(n,x,y,z) thread_create_c(n,x,y,z,__LINE__,__FILE__) +#define thread_mutex_create(x) thread_mutex_create_c(x,__LINE__,__FILE__) +#define thread_mutex_lock(x) thread_mutex_lock_c(x,__LINE__,__FILE__) +#define thread_mutex_unlock(x) thread_mutex_unlock_c(x,__LINE__,__FILE__) +#define thread_cond_create(x) thread_cond_create_c(x,__LINE__,__FILE__) +#define thread_cond_signal(x) thread_cond_signal_c(x,__LINE__,__FILE__) +#define thread_cond_broadcast(x) thread_cond_broadcast_c(x,__LINE__,__FILE__) +#define thread_cond_wait(x) thread_cond_wait_c(x,__LINE__,__FILE__) +#define thread_cond_timedwait(x,t) thread_cond_wait_c(x,t,__LINE__,__FILE__) +#define thread_rwlock_create(x) thread_rwlock_create_c(x,__LINE__,__FILE__) +#define thread_rwlock_rlock(x) thread_rwlock_rlock_c(x,__LINE__,__FILE__) +#define thread_rwlock_wlock(x) thread_rwlock_wlock_c(x,__LINE__,__FILE__) +#define thread_rwlock_unlock(x) thread_rwlock_unlock_c(x,__LINE__,__FILE__) +#define thread_exit(x) thread_exit_c(x,__LINE__,__FILE__) + +#define MUTEX_STATE_NOTLOCKED -1 +#define MUTEX_STATE_NEVERLOCKED -2 +#define MUTEX_STATE_UNINIT -3 +#define THREAD_DETACHED 1 +#define THREAD_ATTACHED 0 + +#ifdef _mangle +# define thread_initialize _mangle(thread_initialize) +# define thread_initialize_with_log_id _mangle(thread_initialize_with_log_id) +# define thread_shutdown _mangle(thread_shutdown) +# define thread_create_c _mangle(thread_create_c) +# define thread_mutex_create_c _mangle(thread_mutex_create) +# define thread_mutex_lock_c _mangle(thread_mutex_lock_c) +# define thread_mutex_unlock_c _mangle(thread_mutex_unlock_c) +# define thread_mutex_destroy _mangle(thread_mutex_destroy) +# define thread_cond_create_c _mangle(thread_cond_create_c) +# define thread_cond_signal_c _mangle(thread_cond_signal_c) +# define thread_cond_broadcast_c _mangle(thread_cond_broadcast_c) +# define thread_cond_wait_c _mangle(thread_cond_wait_c) +# define thread_cond_timedwait_c _mangle(thread_cond_timedwait_c) +# define thread_cond_destroy _mangle(thread_cond_destroy) +# define thread_rwlock_create_c _mangle(thread_rwlock_create_c) +# define thread_rwlock_rlock_c _mangle(thread_rwlock_rlock_c) +# define thread_rwlock_wlock_c _mangle(thread_rwlock_wlock_c) +# define thread_rwlock_unlock_c _mangle(thread_rwlock_unlock_c) +# define thread_rwlock_destroy _mangle(thread_rwlock_destroy) +# define thread_exit_c _mangle(thread_exit_c) +# define thread_sleep _mangle(thread_sleep) +# define thread_library_lock _mangle(thread_library_lock) +# define thread_library_unlock _mangle(thread_library_unlock) +# define thread_self _mangle(thread_self) +# define thread_rename _mangle(thread_rename) +# define thread_join _mangle(thread_join) +#endif + +/* init/shutdown of the library */ +void thread_initialize(void); +void thread_initialize_with_log_id(int log_id); +void thread_shutdown(void); + +/* creation, destruction, locking, unlocking, signalling and waiting */ +thread_type *thread_create_c(char *name, void *(*start_routine)(void *), + void *arg, int detached, int line, char *file); +void thread_mutex_create_c(mutex_t *mutex, int line, char *file); +void thread_mutex_lock_c(mutex_t *mutex, int line, char *file); +void thread_mutex_unlock_c(mutex_t *mutex, int line, char *file); +void thread_mutex_destroy(mutex_t *mutex); +void thread_cond_create_c(cond_t *cond, int line, char *file); +void thread_cond_signal_c(cond_t *cond, int line, char *file); +void thread_cond_broadcast_c(cond_t *cond, int line, char *file); +void thread_cond_wait_c(cond_t *cond, int line, char *file); +void thread_cond_timedwait_c(cond_t *cond, int millis, int line, char *file); +void thread_cond_destroy(cond_t *cond); +void thread_rwlock_create_c(rwlock_t *rwlock, int line, char *file); +void thread_rwlock_rlock_c(rwlock_t *rwlock, int line, char *file); +void thread_rwlock_wlock_c(rwlock_t *rwlock, int line, char *file); +void thread_rwlock_unlock_c(rwlock_t *rwlock, int line, char *file); +void thread_rwlock_destroy(rwlock_t *rwlock); +void thread_exit_c(long val, int line, char *file); + +/* sleeping */ +void thread_sleep(unsigned long len); + +/* for using library functions which aren't threadsafe */ +void thread_library_lock(void); +void thread_library_unlock(void); +#define PROTECT_CODE(code) { thread_library_lock(); code; thread_library_unlock(); } + +/* thread information functions */ +thread_type *thread_self(void); + +/* renames current thread */ +void thread_rename(const char *name); + +/* waits until thread_exit is called for another thread */ +void thread_join(thread_type *thread); + +#endif /* __THREAD_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/TODO mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/TODO --- mixxx-2.2.3~dfsg/lib/libshout/src/common/thread/TODO 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/thread/TODO 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,5 @@ +- make DEBUG_MUTEXES and CHECK_MUTEXES work + +- recursive locking/unlocking (easy) +- reader/writer locking (easy) +- make a mode were _log is disabled (normal mode) (easy) diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/BUILDING mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/BUILDING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/BUILDING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/BUILDING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7 @@ +defines that affect compilation + +none + +library dependencies + +none diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/COPYING mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/COPYING --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/COPYING 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/COPYING 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,18 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = BUILDING COPYING README TODO + +noinst_LTLIBRARIES = libicetiming.la +noinst_HEADERS = timing.h + +libicetiming_la_SOURCES = timing.c +libicetiming_la_CFLAGS = @XIPH_CFLAGS@ + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/README mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/README --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/README 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/README 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,5 @@ +this is the timing library. + +lgpl + +by jack moffitt diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/timing.c mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/timing.c --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/timing.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/timing.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,104 @@ +/* timing.c + * - Timing functions + * + * Copyright (C) 2014 Michael Smith , + * Brendan Cully , + * Karl Heyes , + * Jack Moffitt , + * Ed "oddsock" Zaleski , + * Ralph Giles + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#ifdef _WIN32 +#include +#include +#else +#ifdef TIME_WITH_SYS_TIME +# include +# include +#else +# ifdef HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifdef HAVE_SYS_TIMEB_H +#include +#endif + +#include "timing.h" + +/* see timing.h for an explanation of _mangle() */ + +/* + * Returns milliseconds no matter what. + */ +uint64_t timing_get_time(void) +{ +#ifdef HAVE_GETTIMEOFDAY + struct timeval mtv; + + gettimeofday(&mtv, NULL); + + return (uint64_t)(mtv.tv_sec) * 1000 + (uint64_t)(mtv.tv_usec) / 1000; +#elif HAVE_FTIME + struct timeb t; + + ftime(&t); + return t.time * 1000 + t.millitm; +#else +#error need time query handler +#endif +} + + +void timing_sleep(uint64_t sleeptime) +{ + struct timeval sleeper; + + sleeper.tv_sec = sleeptime / 1000; + sleeper.tv_usec = (sleeptime % 1000) * 1000; + + /* NOTE: + * This should be 0 for the first argument. The linux manpage + * says so. The solaris manpage also says this is a legal + * value. If you think differerntly, please provide references. + */ +#ifdef WIN32 + Sleep(sleeptime); +#else + select(1, NULL, NULL, NULL, &sleeper); +#endif +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/timing.h mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/timing.h --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/timing.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/timing.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Timing functions. + * + * Copyright (C) 2014 Michael Smith , + * Karl Heyes , + * Jack Moffitt , + * Moritz Grimm , + * Ralph Giles + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef __TIMING_H__ +#define __TIMING_H__ + +#include +#ifdef HAVE_INTTYPES_H +#include +#elif defined(HAVE_STDINT_H) +#include +#endif + +#if defined(_WIN32) && !defined(int64_t) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#endif + +/* config.h should be included before we are to define _mangle */ +#ifdef _mangle +# define timing_get_time _mangle(timing_get_time) +# define timing_sleep _mangle(timing_sleep) +#endif + +uint64_t timing_get_time(void); +void timing_sleep(uint64_t sleeptime); + +#endif /* __TIMING_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/TODO mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/TODO --- mixxx-2.2.3~dfsg/lib/libshout/src/common/timing/TODO 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/common/timing/TODO 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,2 @@ + +nothing diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/format_mp3.c mixxx-2.2.4~dfsg/lib/libshout/src/format_mp3.c --- mixxx-2.2.3~dfsg/lib/libshout/src/format_mp3.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/format_mp3.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,319 @@ +/* -*- c-basic-offset: 8; -*- */ +/* mp3.c: libshout MP3 format handler + * $Id$ + * + * Copyright (C) 2002-2003 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include + +#include +#include "shout_private.h" + +/* + * MP3 frame handling courtesy of Scott Manley - may he always be Manley. + */ + +#define MPEG_MODE_MONO 3 + +/* -- local datatypes -- */ +typedef struct { + unsigned int frames; + /* the number of samples for the current frame */ + int frame_samples; + /* the samplerate of the current frame */ + int frame_samplerate; + /* how many bytes for the rest of this frame */ + unsigned int frame_left; + /* is the header bridged?? */ + int header_bridges; + /* put part of header here if it spans a boundary */ + unsigned char header_bridge[3]; +} mp3_data_t; + +typedef struct { + int syncword; + int layer; + int version; + int error_protection; + int bitrate_index; + int samplerate_index; + int padding; + int extension; + int mode; + int mode_ext; + int copyright; + int original; + int emphasis; + int stereo; + int bitrate; + unsigned int samplerate; + unsigned int samples; + unsigned int framesize; +} mp3_header_t; + +/* -- const data -- */ +static const unsigned int bitrate[3][3][16] = +{ + { + { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, + { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 } + }, { + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } + }, { + { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, + { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } + } +}; + +static const unsigned int samplerate[3][4] = +{ + { 44100, 48000, 32000, 0 }, + { 22050, 24000, 16000, 0 }, + { 11025, 8000, 8000, 0 } +}; + +/* -- static prototypes -- */ +static int send_mp3(shout_t *self, const unsigned char *data, size_t len); +static void close_mp3(shout_t *self); + +static void parse_header(mp3_header_t *mh, uint32_t header); +static int mp3_header(uint32_t head, mp3_header_t *mh); + +int shout_open_mp3(shout_t *self) +{ + mp3_data_t *mp3_data; + + if (!(mp3_data = (mp3_data_t *)calloc(1, sizeof(mp3_data_t)))) + return SHOUTERR_MALLOC; + self->format_data = mp3_data; + + self->send = send_mp3; + self->close = close_mp3; + + return SHOUTERR_SUCCESS; +} + +static int send_mp3(shout_t* self, const unsigned char* buff, size_t len) +{ + mp3_data_t* mp3_data = (mp3_data_t*) self->format_data; + unsigned long pos; + uint32_t head; + int ret, count; + int start, end, error, i; + unsigned char *bridge_buff; + mp3_header_t mh; + + bridge_buff = NULL; + pos = 0; + start = 0; + error = 0; + end = len - 1; + memset(&mh, 0, sizeof(mh)); + + /* finish the previous frame */ + if (mp3_data->frame_left > 0) { + /* is the rest of the frame here? */ + if (mp3_data->frame_left <= len) { + self->senttime += (int64_t)((double)mp3_data->frame_samples / (double)mp3_data->frame_samplerate * 1000000); + mp3_data->frames++; + pos += mp3_data->frame_left; + mp3_data->frame_left = 0; + } else { + mp3_data->frame_left -= len; + pos = len; + } + } + + /* header was over the boundary, so build a new build a new buffer */ + if (mp3_data->header_bridges) { + bridge_buff = (unsigned char *)malloc(len + mp3_data->header_bridges); + if (bridge_buff == NULL) { + return self->error = SHOUTERR_MALLOC; + } + + bridge_buff[0] = mp3_data->header_bridge[0]; + bridge_buff[1] = mp3_data->header_bridge[1]; + bridge_buff[2] = mp3_data->header_bridge[2]; + + memcpy(&bridge_buff[mp3_data->header_bridges], buff, len); + + buff = bridge_buff; + len += mp3_data->header_bridges; + end = len - 1; + + mp3_data->header_bridges = 0; + } + + /** this is the main loop + *** we handle everything but the last 4 bytes... + **/ + while ((pos + 4) <= len) { + /* find mp3 header */ + head = (buff[pos] << 24) | + (buff[pos + 1] << 16) | + (buff[pos + 2] << 8) | + (buff[pos + 3]); + + /* is this a valid header? */ + if (mp3_header(head, &mh)) { + if (error) { + start = pos; + end = len - 1; + error = 0; + } + + mp3_data->frame_samples = mh.samples; + mp3_data->frame_samplerate = mh.samplerate; + + /* do we have a complete frame in this buffer? */ + if (len - pos >= mh.framesize) { + self->senttime += (int64_t)((double)mp3_data->frame_samples / (double)mp3_data->frame_samplerate * 1000000); + mp3_data->frames++; + pos += mh.framesize; + } else { + mp3_data->frame_left = mh.framesize - (len - pos); + pos = len; + } + } else { + /* there was an error + ** so we send all the valid data up to this point + */ + if (!error) { + error = 1; + end = pos - 1; + count = end - start + 1; + if (count > 0) + ret = shout_send_raw(self, &buff[start], count); + else + ret = 0; + + if (ret != count) { + if (bridge_buff != NULL) + free(bridge_buff); + return self->error = SHOUTERR_SOCKET; + } + } + pos++; + } + } + + /* catch the tail if there is one */ + if ((pos > (len - 4)) && (pos < len)) { + end = pos - 1; + + i = 0; + while (pos < len) { + mp3_data->header_bridge[i] = buff[pos]; + pos++; + i++; + } + mp3_data->header_bridges = i; + } + + if (!error) { + /* if there's no errors, lets send the frames */ + count = end - start + 1; + if (count > 0) + ret = shout_send_raw(self, &buff[start], count); + else + ret = 0; + + if (bridge_buff != NULL) + free(bridge_buff); + + if (ret == count) { + return self->error = SHOUTERR_SUCCESS; + } else { + return self->error = SHOUTERR_SOCKET; + } + } + + if (bridge_buff != NULL) + free(bridge_buff); + + return self->error = SHOUTERR_SUCCESS; +} + +static void parse_header(mp3_header_t *mh, uint32_t header) +{ + mh->syncword = (header >> 20) & 0x0fff; + mh->version = ((header >> 19) & 0x01) ? 0 : 1; + if ((mh->syncword & 0x01) == 0) + mh->version = 2; + mh->layer = 3 - ((header >> 17) & 0x03); + mh->error_protection = ((header >> 16) & 0x01) ? 0 : 1; + mh->bitrate_index = (header >> 12) & 0x0F; + mh->samplerate_index = (header >> 10) & 0x03; + mh->padding = (header >> 9) & 0x01; + mh->extension = (header >> 8) & 0x01; + mh->mode = (header >> 6) & 0x03; + mh->mode_ext = (header >> 4) & 0x03; + mh->copyright = (header >> 3) & 0x01; + mh->original = (header >> 2) & 0x01; + mh->emphasis = header & 0x03; + + mh->stereo = (mh->mode == MPEG_MODE_MONO) ? 1 : 2; + mh->bitrate = bitrate[mh->version][mh->layer][mh->bitrate_index]; + mh->samplerate = samplerate[mh->version][mh->samplerate_index]; + + if (mh->version == 0) + mh->samples = 1152; + else + mh->samples = 576; + + if(mh->samplerate) + mh->framesize = (mh->samples * mh->bitrate * 1000 / mh->samplerate) / 8 + mh->padding; +} + +/* mp3 frame parsing stuff */ +static int mp3_header(uint32_t head, mp3_header_t *mh) +{ + /* fill out the header struct */ + parse_header(mh, head); + + /* check for syncword */ + if ((mh->syncword & 0x0ffe) != 0x0ffe) + return 0; + + /* check that layer is valid */ + if (mh->layer == 0) + return 0; + + /* make sure bitrate is sane */ + if (mh->bitrate == 0) + return 0; + + /* make sure samplerate is sane */ + if (mh->samplerate == 0) + return 0; + + return 1; +} + +static void close_mp3(shout_t *self) +{ + mp3_data_t *mp3_data = (mp3_data_t *)self->format_data; + + free(mp3_data); +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/format_ogg.c mixxx-2.2.4~dfsg/lib/libshout/src/format_ogg.c --- mixxx-2.2.3~dfsg/lib/libshout/src/format_ogg.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/format_ogg.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,205 @@ +/* -*- c-basic-offset: 8; -*- */ +/* ogg.c: Generic ogg data handler + * $Id$ + * + * Copyright (C) 2002-2004 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#ifdef HAVE_INTTYPES_H +#include +#endif + +#include + +#include +#include "shout_private.h" +#include "format_ogg.h" + +/* -- local datatypes -- */ +typedef struct { + ogg_sync_state oy; + ogg_codec_t *codecs; + char bos; +} ogg_data_t; + +/* -- static prototypes -- */ +static int send_ogg(shout_t *self, const unsigned char *data, size_t len); +static void close_ogg(shout_t *self); +static int open_codec(ogg_codec_t *codec, ogg_page *page); +static void free_codec(ogg_codec_t *codec); +static void free_codecs(ogg_data_t *ogg_data); +static int send_page(shout_t *self, ogg_page *page); + +typedef int (*codec_open_t)(ogg_codec_t *codec, ogg_page *page); +static codec_open_t codecs[] = { + _shout_open_vorbis, +#ifdef HAVE_THEORA + _shout_open_theora, +#endif + _shout_open_opus, +#ifdef HAVE_SPEEX + _shout_open_speex, +#endif + NULL +}; + +int shout_open_ogg(shout_t *self) +{ + ogg_data_t *ogg_data; + + if (!(ogg_data = (ogg_data_t *)calloc(1, sizeof(ogg_data_t)))) + return self->error = SHOUTERR_MALLOC; + self->format_data = ogg_data; + + ogg_sync_init(&ogg_data->oy); + ogg_data->bos = 1; + + self->send = send_ogg; + self->close = close_ogg; + + return SHOUTERR_SUCCESS; +} + +static int send_ogg(shout_t *self, const unsigned char *data, size_t len) +{ + ogg_data_t *ogg_data = (ogg_data_t *)self->format_data; + ogg_codec_t *codec; + char *buffer; + ogg_page page; + + buffer = ogg_sync_buffer(&ogg_data->oy, len); + memcpy(buffer, data, len); + ogg_sync_wrote(&ogg_data->oy, len); + + while (ogg_sync_pageout(&ogg_data->oy, &page) == 1) { + if (ogg_page_bos (&page)) { + if (! ogg_data->bos) { + free_codecs(ogg_data); + ogg_data->bos = 1; + } + + codec = calloc(1, sizeof(ogg_codec_t)); + if (! codec) + return self->error = SHOUTERR_MALLOC; + + if ((self->error = open_codec(codec, &page)) != SHOUTERR_SUCCESS) + return self->error; + + codec->headers = 1; + codec->senttime = self->senttime; + codec->next = ogg_data->codecs; + ogg_data->codecs = codec; + } else { + ogg_data->bos = 0; + + codec = ogg_data->codecs; + while (codec) { + if (ogg_page_serialno(&page) == codec->os.serialno) { + if (codec->read_page) { + ogg_stream_pagein(&codec->os, &page); + codec->read_page(codec, &page); + + if (self->senttime < codec->senttime) + self->senttime = codec->senttime; + } + + break; + } + + codec = codec->next; + } + } + + if ((self->error = send_page(self, &page)) != SHOUTERR_SUCCESS) + return self->error; + } + + return self->error = SHOUTERR_SUCCESS; +} + +static void close_ogg(shout_t *self) +{ + ogg_data_t *ogg_data = (ogg_data_t *)self->format_data; + free_codecs(ogg_data); + ogg_sync_clear(&ogg_data->oy); + free(ogg_data); +} + +static int open_codec(ogg_codec_t *codec, ogg_page *page) +{ + codec_open_t this_codec; + int i = 0; + + while ((this_codec = codecs[i])) { + ogg_stream_init(&codec->os, ogg_page_serialno(page)); + ogg_stream_pagein(&codec->os, page); + + if (this_codec(codec, page) == SHOUTERR_SUCCESS) + return SHOUTERR_SUCCESS; + + ogg_stream_clear(&codec->os); + i++; + } + + /* if no handler is found, we currently just fall back to untimed send_raw */ + return SHOUTERR_SUCCESS; +} + +static void free_codecs(ogg_data_t *ogg_data) +{ + ogg_codec_t *codec, *next; + + if (ogg_data == NULL) + return; + + codec = ogg_data->codecs; + while (codec) { + next = codec->next; + free_codec(codec); + codec = next; + } + ogg_data->codecs = NULL; +} + +static void free_codec(ogg_codec_t *codec) +{ + if (codec->free_data) + codec->free_data(codec->codec_data); + ogg_stream_clear(&codec->os); + free(codec); +} + +static int send_page(shout_t *self, ogg_page *page) +{ + int ret; + + ret = shout_send_raw(self, page->header, page->header_len); + if (ret != page->header_len) + return self->error = SHOUTERR_SOCKET; + ret = shout_send_raw(self, page->body, page->body_len); + if (ret != page->body_len) + return self->error = SHOUTERR_SOCKET; + + return SHOUTERR_SUCCESS; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/format_ogg.h mixxx-2.2.4~dfsg/lib/libshout/src/format_ogg.h --- mixxx-2.2.3~dfsg/lib/libshout/src/format_ogg.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/format_ogg.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,56 @@ +/* -*- c-basic-offset: 8; -*- */ +/* format_ogg.h: Internal shout interface to Ogg codec handlers + * $Id$ + * + * Copyright (C) 2004 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __LIBSHOUT_FORMAT_OGG_H__ +#define __LIBSHOUT_FORMAT_OGG_H__ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include + +typedef struct _ogg_codec_tag { + ogg_stream_state os; + + unsigned int headers; + uint64_t senttime; + + void *codec_data; + int (*read_page)(struct _ogg_codec_tag *codec, ogg_page *page); + void (*free_data)(void *codec_data); + + struct _ogg_codec_tag *next; +} ogg_codec_t; + +/* codec hooks */ +int _shout_open_vorbis(ogg_codec_t *codec, ogg_page *page); +#ifdef HAVE_THEORA +int _shout_open_theora(ogg_codec_t *codec, ogg_page *page); +#endif +#ifdef HAVE_SPEEX +int _shout_open_speex(ogg_codec_t *codec, ogg_page *page); +#endif +int _shout_open_opus(ogg_codec_t *codec, ogg_page *page); + +#endif diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/format_webm.c mixxx-2.2.4~dfsg/lib/libshout/src/format_webm.c --- mixxx-2.2.3~dfsg/lib/libshout/src/format_webm.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/format_webm.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,68 @@ +/* -*- c-basic-offset: 8; -*- */ +/* webm.c: WebM data handler + * $Id$ + * + * Copyright (C) 2002-2012 the Icecast team + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#ifdef HAVE_INTTYPES_H +#include +#endif + +#include +#include "shout_private.h" + +/* -- local datatypes -- */ + +/* no local state */ + +/* -- static prototypes -- */ +static int send_webm(shout_t *self, const unsigned char *data, size_t len); +static void close_webm(shout_t *self); + +int shout_open_webm(shout_t *self) +{ + self->format_data = NULL; + self->send = send_webm; + self->close = close_webm; + + return SHOUTERR_SUCCESS; +} + +static int send_webm(shout_t *self, const unsigned char *data, size_t len) +{ + /* IMPORTANT TODO: we just send the raw data. We need throttling. */ + + ssize_t ret = shout_send_raw(self, data, len); + if (ret != (ssize_t)len) + return self->error = SHOUTERR_SOCKET; + + return self->error = SHOUTERR_SUCCESS; +} + +static void close_webm(shout_t *self) +{ + /* no local state */ + (void)self; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/src/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,44 @@ +## Process this with automake to create Makefile.in + +AUTOMAKE_OPTIONS = foreign 1.6 + +if HAVE_THREAD + MAYBE_THREAD = common/thread + MAYBE_THREAD_LIB = common/thread/libicethread.la +endif + +if HAVE_THEORA + MAYBE_THEORA = codec_theora.c +endif + +if HAVE_SPEEX + MAYBE_SPEEX = codec_speex.c +endif + +if HAVE_TLS + MAYBE_TLS = tls.c +endif + +SUBDIRS = common/avl common/net common/timing common/httpp $(MAYBE_THREAD) + +lib_LTLIBRARIES = libshout.la +libshout_la_LDFLAGS = -version-info 5:0:2 + +EXTRA_DIST = codec_theora.c codec_speex.c tls.c +noinst_HEADERS = format_ogg.h shout_private.h util.h +PROTOCOLS=proto_http.c proto_xaudiocast.c proto_icy.c proto_roaraudio.c +FORMATS=format_ogg.c format_webm.c format_mp3.c +CODECS=codec_vorbis.c codec_opus.c $(MAYBE_THEORA) $(MAYBE_SPEEX) +libshout_la_SOURCES = shout.c util.c queue.c $(PROTOCOLS) $(FORMATS) $(CODECS) $(MAYBE_TLS) +AM_CFLAGS = @XIPH_CFLAGS@ + +libshout_la_LIBADD = common/net/libicenet.la common/timing/libicetiming.la common/avl/libiceavl.la\ + common/httpp/libicehttpp.la $(MAYBE_THREAD_LIB) $(THEORA_LIBS) $(VORBIS_LIBS) $(SPEEX_LIBS) @XIPH_LIBS@ + +INCLUDES = -I$(top_builddir)/include -I./common/ + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/proto_http.c mixxx-2.2.4~dfsg/lib/libshout/src/proto_http.c --- mixxx-2.2.3~dfsg/lib/libshout/src/proto_http.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/proto_http.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,340 @@ +/* -*- c-basic-offset: 8; -*- */ +/* proto_http.c: Implementation of protocol HTTP. + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include + +#include +#include "shout_private.h" +#include "common/httpp/httpp.h" + +char *shout_http_basic_authorization(shout_t *self) +{ + char *out, *in; + int len; + + if (!self || !self->user || !self->password) + return NULL; + + len = strlen(self->user) + strlen(self->password) + 2; + if (!(in = malloc(len))) + return NULL; + snprintf(in, len, "%s:%s", self->user, self->password); + out = _shout_util_base64_encode(in); + free(in); + + len = strlen(out) + 24; + if (!(in = malloc(len))) { + free(out); + return NULL; + } + snprintf(in, len, "Authorization: Basic %s\r\n", out); + free(out); + + return in; +} + +int shout_create_http_request(shout_t *self) +{ + char *auth; + char *ai; + int ret = SHOUTERR_MALLOC; + util_dict *dict; + const char *key, *val; + const char *mimetype; + + switch (self->format) { + case SHOUT_FORMAT_OGG: + mimetype = "application/ogg"; + break; + case SHOUT_FORMAT_MP3: + mimetype = "audio/mpeg"; + break; + case SHOUT_FORMAT_WEBM: + mimetype = "video/webm"; + break; + case SHOUT_FORMAT_WEBMAUDIO: + mimetype = "audio/webm"; + break; + default: + return SHOUTERR_INSANE; + break; + } + + /* this is lazy code that relies on the only error from queue_* being + * SHOUTERR_MALLOC */ + do { + if (shout_queue_printf(self, "SOURCE %s HTTP/1.0\r\n", self->mount)) + break; + if (self->password && (self->server_caps & LIBSHOUT_CAP_GOTCAPS)) { + if (! (auth = shout_http_basic_authorization(self))) + break; + if (shout_queue_str(self, auth)) { + free(auth); + break; + } + free(auth); + } + if (self->useragent && shout_queue_printf(self, "Host: %s:%i\r\n", self->host, self->port)) + break; + if (self->useragent && shout_queue_printf(self, "User-Agent: %s\r\n", self->useragent)) + break; + if (shout_queue_printf(self, "Content-Type: %s\r\n", mimetype)) + break; + if (shout_queue_printf(self, "ice-public: %d\r\n", self->public)) + break; + + _SHOUT_DICT_FOREACH(self->meta, dict, key, val) { + if (val && shout_queue_printf(self, "ice-%s: %s\r\n", key, val)) + break; + } + + if ((ai = _shout_util_dict_urlencode(self->audio_info, ';'))) { + if (shout_queue_printf(self, "ice-audio-info: %s\r\n", ai)) { + free(ai); + break; + } + free(ai); + } + if (shout_queue_str(self, "\r\n")) + break; + + ret = SHOUTERR_SUCCESS; + } while (0); + + return ret; +} + +int shout_create_http_request_upgrade(shout_t *self, const char *proto) +{ + do { + if (shout_queue_str(self, "GET / HTTP/1.1\r\nConnection: Upgrade\r\n")) + break; + if (shout_queue_printf(self, "Upgrade: %s\r\n", proto)) + break; + /* Send Host:-header as this one may be used to select cert! */ + if (shout_queue_printf(self, "Host: %s:%i\r\n", self->host, self->port)) + break; + if (shout_queue_str(self, "\r\n")) + break; + return SHOUTERR_SUCCESS; + } while (0); + + return SHOUTERR_MALLOC; +} + +int shout_get_http_response(shout_t *self) +{ + int blen; + char *pc; + shout_buf_t *queue; + int newlines = 0; + + /* work from the back looking for \r?\n\r?\n. Anything else means more + * is coming. */ + for (queue = self->rqueue.head; queue->next; queue = queue->next); + pc = (char*)queue->data + queue->len - 1; + blen = queue->len; + while (blen) { + if (*pc == '\n') + newlines++; + /* we may have to scan the entire queue if we got a response with + * data after the head line (this can happen with eg 401) */ + else if (*pc != '\r') + newlines = 0; + + if (newlines == 2) + return SHOUTERR_SUCCESS; + + blen--; + pc--; + + if (!blen && queue->prev) { + queue = queue->prev; + pc = (char*)queue->data + queue->len - 1; + blen = queue->len; + } + } + + return SHOUTERR_BUSY; +} + +static inline void parse_http_response_caps(shout_t *self, const char *header, const char *str) { + const char * end; + size_t len; + char buf[64]; + + if (!self || !header || !str) + return; + + do { + for (; *str == ' '; str++); + end = strstr(str, ","); + if (end) { + len = end - str; + } else { + len = strlen(str); + } + + if (len > (sizeof(buf) - 1)) + return; + memcpy(buf, str, len); + buf[len] = 0; + + if (strcmp(header, "Allow") == 0){ + if (strcasecmp(buf, "SOURCE") == 0) { + self->server_caps |= LIBSHOUT_CAP_SOURCE; + } else if (strcasecmp(buf, "PUT") == 0) { + self->server_caps |= LIBSHOUT_CAP_PUT; + } else if (strcasecmp(buf, "POST") == 0) { + self->server_caps |= LIBSHOUT_CAP_POST; + } else if (strcasecmp(buf, "GET") == 0) { + self->server_caps |= LIBSHOUT_CAP_GET; + } + } else if (strcmp(header, "Accept-Encoding") == 0){ + if (strcasecmp(buf, "chunked") == 0) { + self->server_caps |= LIBSHOUT_CAP_CHUNKED; + } + } else if (strcmp(header, "Upgrade") == 0){ + if (strcasecmp(buf, "TLS/1.0") == 0) { + self->server_caps |= LIBSHOUT_CAP_UPGRADETLS; + } + } else { + return; /* unknown header */ + } + + str += len + 1; + } while (end); + + return; +} + +static inline int eat_body(shout_t *self, size_t len, const char *buf, size_t buflen) +{ + const char *p; + size_t header_len = 0; + char buffer[256]; + ssize_t got; + + if (!len) + return 0; + + for (p = buf; p < (buf+buflen-3); p++) { + if (p[0] == '\r' && p[1] == '\n' && p[2] == '\r' && p[3] == '\n') { + header_len = p - buf + 4; + break; + } else if (p[0] == '\n' && p[1] == '\n') { + header_len = p - buf + 2; + break; + } + } + if (!header_len && buflen >= 3 && buf[buflen-2] == '\n' && buf[buflen-3] == '\n') { + header_len = buflen - 1; + } else if (!header_len && buflen >= 2 && buf[buflen-1] == '\n' && buf[buflen-2] == '\n') { + header_len = buflen; + } + + if ( (buflen - header_len) > len) + return -1; + + len -= buflen - header_len; + + while (len) { + got = shout_conn_read(self, buffer, len > sizeof(buffer) ? sizeof(buffer) : len); + if (got == -1 && shout_conn_recoverable(self)) { + continue; + } else if (got == -1) { + return -1; + } + + len -= got; + } + + return 0; +} + +int shout_parse_http_response(shout_t *self) +{ + http_parser_t *parser; + char *header = NULL; + ssize_t hlen; + int code; + const char *retcode; + + /* all this copying! */ + hlen = shout_queue_collect(self->rqueue.head, &header); + if (hlen <= 0) + return SHOUTERR_MALLOC; + shout_queue_free(&self->rqueue); + + parser = httpp_create_parser(); + httpp_initialize(parser, NULL); + if (httpp_parse_response(parser, header, hlen, self->mount)) { + /* TODO: Headers to Handle: + * Allow:, Accept-Encoding:, Warning:, Upgrade: + */ + parse_http_response_caps(self, "Allow", httpp_getvar(parser, "allow")); + parse_http_response_caps(self, "Accept-Encoding", httpp_getvar(parser, "accept-encoding")); + parse_http_response_caps(self, "Upgrade", httpp_getvar(parser, "upgrade")); + self->server_caps |= LIBSHOUT_CAP_GOTCAPS; + retcode = httpp_getvar(parser, HTTPP_VAR_ERROR_CODE); + code = atoi(retcode); + if(code >= 200 && code < 300) { + httpp_destroy(parser); + free (header); + return SHOUTERR_SUCCESS; + } else if (code == 401 || code == 405 || code == 426 || code == 101) { + const char *content_length = httpp_getvar(parser, "content-length"); + if (content_length) { + if (eat_body(self, atoi(content_length), header, hlen) == -1) + goto failure; + } +#ifdef HAVE_OPENSSL + switch (code) { + case 426: self->tls_mode = SHOUT_TLS_RFC2817; break; + case 101: self->upgrade_to_tls = 1; break; + } +#endif + self->retry++; + if (self->retry > LIBSHOUT_MAX_RETRY) + self->retry = 0; + + goto retry; + } else { + self->retry = 0; + } + } + +failure: + self->retry = 0; +retry: + free(header); + httpp_destroy(parser); + return self->error = SHOUTERR_NOLOGIN; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/proto_icy.c mixxx-2.2.4~dfsg/lib/libshout/src/proto_icy.c --- mixxx-2.2.3~dfsg/lib/libshout/src/proto_icy.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/proto_icy.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,71 @@ +/* -*- c-basic-offset: 8; -*- */ +/* proto_icy.c: Implementation of protocol ICY. + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include "shout_private.h" + +int shout_create_icy_request(shout_t *self) +{ + const char *bitrate; + const char *val; + int ret; + + bitrate = shout_get_audio_info(self, SHOUT_AI_BITRATE); + if (!bitrate) + bitrate = "0"; + + ret = SHOUTERR_MALLOC; + do { + if (shout_queue_printf(self, "%s\n", self->password)) + break; + if (shout_queue_printf(self, "icy-name:%s\n", shout_get_meta(self, "name"))) + break; + val = shout_get_meta(self, "url"); + if (shout_queue_printf(self, "icy-url:%s\n", val ? val : "http://www.icecast.org/")) + break; + val = shout_get_meta(self, "irc"); + if (shout_queue_printf(self, "icy-irc:%s\n", val ? val : "")) + break; + val = shout_get_meta(self, "aim"); + if (shout_queue_printf(self, "icy-aim:%s\n", val ? val : "")) + break; + val = shout_get_meta(self, "icq"); + if (shout_queue_printf(self, "icy-icq:%s\n", val ? val : "")) + break; + if (shout_queue_printf(self, "icy-pub:%i\n", self->public)) + break; + val = shout_get_meta(self, "genre"); + if (shout_queue_printf(self, "icy-genre:%s\n", val ? val : "icecast")) + break; + if (shout_queue_printf(self, "icy-br:%s\n\n", bitrate)) + break; + + ret = SHOUTERR_SUCCESS; + } while (0); + + return ret; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/proto_roaraudio.c mixxx-2.2.4~dfsg/lib/libshout/src/proto_roaraudio.c --- mixxx-2.2.3~dfsg/lib/libshout/src/proto_roaraudio.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/proto_roaraudio.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,297 @@ +/* -*- c-basic-offset: 8; -*- */ +/* proto_roaraudio.c: RoarAudio protocol support. + * $Id$ + * + * Copyright (C) 2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* for htonl(). */ +#include + +#include +#include +#include + +#include +#include "shout_private.h" + +typedef enum { + STATE_IDENT = 0, + STATE_AUTH, + STATE_NEW_STREAM, + STATE_EXEC +} shout_roar_protocol_state_t; + +typedef enum { + CMD_IDENTIFY = 1, + CMD_AUTH = 2, + CMD_NEW_STREAM = 3, + CMD_EXEC_STREAM = 5, + CMD_OK = 254 +} shout_roar_command_t; + +#define STREAM_NONE ((uint16_t)0xFFFF) +#define HEADER_SIZE 10 + +static int command_send(shout_t *self, shout_roar_command_t command, uint16_t stream, const void *data, size_t datalen) +{ + uint8_t header[HEADER_SIZE]; + + if (!self) + return SHOUTERR_INSANE; + + if (datalen > 65535) + return SHOUTERR_INSANE; + + if (datalen && !data) + return SHOUTERR_INSANE; + + /* version. + * While version 2 is already on it's way we still go for version 0 + * as it will work well for us and is defined as part of the core + * every RoarAudio server MUST implement. + */ + header[0] = 0; + /* command ID. */ + header[1] = command; + /* stream ID. First upper then lower byte. */ + header[2] = (stream & 0xFF00) >> 8; + header[3] = (stream & 0x00FF); + /* now 4 bytes of stream position. + * This implementation doesn't need this so we + * set it to all zeros. + */ + header[4] = 0; + header[5] = 0; + header[6] = 0; + header[7] = 0; + /* Now body ("data") size. First upper then lower byte. */ + header[8] = (datalen & 0xFF00) >> 8; + header[9] = (datalen & 0x00FF); + + shout_queue_data(&self->wqueue, header, HEADER_SIZE); + if (datalen) + shout_queue_data(&self->wqueue, data, datalen); + + return SHOUTERR_SUCCESS; +} + +static int shout_create_roaraudio_request_ident(shout_t *self) +{ + int ret; + size_t datalen; + uint8_t *data; + const char *agent; + uint32_t pid = getpid(); + + /* We implement version 1 IDENTIFY header. + * It has the following structure: + * byte 0: version (1). + * byte 1-4: PID in big endian. + * byte 5-end: client name. + */ + + agent = shout_get_agent(self); + if (!agent) + return SHOUTERR_INSANE; + + datalen = 5 + strlen(agent); + data = malloc(datalen); + if (!data) + return SHOUTERR_MALLOC; + + /* version number (1). */ + data[0] = 1; + /* PID */ + data[1] = (pid & 0xFF000000UL) >> 24; + data[2] = (pid & 0x00FF0000UL) >> 16; + data[3] = (pid & 0x0000FF00UL) >> 8; + data[4] = (pid & 0x000000FFUL) >> 0; + /* agent name */ + memcpy(data+5, agent, datalen-5); + + ret = command_send(self, CMD_IDENTIFY, STREAM_NONE, data, datalen); + + free(data); + + return ret; +} + +static int shout_create_roaraudio_request_auth(shout_t *self) +{ + /* Now we send an AUTH command to the server. + * We currently only implement the NONE type. + * NONE type is assumed by the server if + * we send an empty body. + */ + return command_send(self, CMD_AUTH, STREAM_NONE, NULL, 0); +} + +static int shout_create_roaraudio_request_new_stream(shout_t *self) +{ + uint32_t data[6]; + + /* We implement 24 byte NEW_STREAM structure (version 0). + * It has the following structure: + * byte 0- 3: stream direction [0]. + * byte 4- 7: Rel Pos ID (here: -1=NONE) + * byte 8-11: Sample Rate[1]. + * byte 12-15: Bits per Sample[1]. + * byte 16-19: Number of Channels[1]. + * byte 20-23: Codec ID[2]. + * + * The following asumptions are based on us only supporting + * Ogg-based for now. + * [0] = We currently only suport playback of waveform signals (1). + * See https://bts.keep-cool.org/wiki/Specs/DirValues + * [1] = Server should detect automagically. defaulting to: 44100/16/2. + * [2] = Ogg/Vorbis = 0x0010, Ogg/Speex = 0x0012, Ogg/FLAC = 0x0014, + * Ogg/CELT = 0x0016, Ogg/GENERAL (unknown logical streams) = 0x0015. + * See https://bts.keep-cool.org/wiki/Specs/CodecsValues + */ + + data[0] = htonl(1); + data[1] = htonl((uint32_t)-1); + data[2] = htonl(44100); + data[3] = htonl(32); + data[4] = htonl(2); + data[5] = htonl(0x0010); /* we assume Ogg/Vorbis for now. */ + + return command_send(self, CMD_NEW_STREAM, STREAM_NONE, data, 24); +} + +static int shout_create_roaraudio_request_exec(shout_t *self) +{ + /* Last an EXEC_STREAM command should be sent to open + * an IO channel for the new stream. + * If successful the control socket will be used for data + * after that. This very much like with SOURCE requests. + * so no hard deal to intigrate. + */ + return command_send(self, CMD_EXEC_STREAM, self->protocol_extra, NULL, 0); +} + +int shout_create_roaraudio_request(shout_t *self) +{ + switch ((shout_roar_protocol_state_t)self->protocol_state) { + case STATE_IDENT: + return shout_create_roaraudio_request_ident(self); + break; + case STATE_AUTH: + return shout_create_roaraudio_request_auth(self); + break; + case STATE_NEW_STREAM: + return shout_create_roaraudio_request_new_stream(self); + break; + case STATE_EXEC: + return shout_create_roaraudio_request_exec(self); + break; + } + + return SHOUTERR_INSANE; +} + +int shout_get_roaraudio_response(shout_t *self) +{ + shout_buf_t *queue; + size_t total_len = 0; + uint8_t header[HEADER_SIZE]; + + for (queue = self->rqueue.head; queue; queue = queue->next) { + if (total_len < 10) + memcpy(header+total_len, queue->data, queue->len > (HEADER_SIZE - total_len) ? (HEADER_SIZE - total_len) : queue->len); + total_len += queue->len; + } + + /* the header alone has 10 bytes. */ + if (total_len < HEADER_SIZE) + return SHOUTERR_BUSY; + + /* ok. we got a header. + * Now find the body length ("data length") bytes + * and see if they are both zero. + * If not the server sent us extra infos we currently + * not support. + */ + + if (header[8] || header[9]) + return SHOUTERR_UNSUPPORTED; + + /* Hey, we got a response. */ + return SHOUTERR_SUCCESS; +} + +int shout_parse_roaraudio_response(shout_t *self) +{ + char *data = NULL; + uint8_t header[HEADER_SIZE]; + + /* ok, this is the most hacky function in here as we do not + * use a well designed and universal parser for the responses. + * Yet there is little need for it. + * We just need to check if we got an CMD_OK and + * pull out the stream ID in case of STATE_NEW_STREAM. + * "data length" is already checked by shout_get_roaraudio_response(). + */ + + if (shout_queue_collect(self->rqueue.head, &data) != HEADER_SIZE) { + free(data); + return SHOUTERR_INSANE; + } + shout_queue_free(&self->rqueue); + memcpy(header, data, HEADER_SIZE); + free(data); + + /* check version */ + if (header[0] != 0) + return SHOUTERR_UNSUPPORTED; + + /* have we got a positive response? */ + if (header[1] != CMD_OK) + return SHOUTERR_NOLOGIN; + + switch ((shout_roar_protocol_state_t)self->protocol_state) { + case STATE_IDENT: + self->protocol_state = STATE_AUTH; + break; + case STATE_AUTH: + self->protocol_state = STATE_NEW_STREAM; + break; + case STATE_NEW_STREAM: + self->protocol_extra = (((unsigned int)header[2]) << 8) | (unsigned int)header[3]; + self->protocol_state = STATE_EXEC; + break; + case STATE_EXEC: + /* ok. everything worked. Continue normally! */ + return SHOUTERR_SUCCESS; + break; + default: + return SHOUTERR_INSANE; + break; + } + + self->state = SHOUT_STATE_REQ_CREATION; + return SHOUTERR_RETRY; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/proto_xaudiocast.c mixxx-2.2.4~dfsg/lib/libshout/src/proto_xaudiocast.c --- mixxx-2.2.3~dfsg/lib/libshout/src/proto_xaudiocast.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/proto_xaudiocast.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,89 @@ +/* -*- c-basic-offset: 8; -*- */ +/* proto_xaudiocast.c: Implementation of protocol xaudiocast. + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#include +#include "shout_private.h" + +int shout_create_xaudiocast_request(shout_t *self) +{ + const char *bitrate; + const char *val; + int ret; + + bitrate = shout_get_audio_info(self, SHOUT_AI_BITRATE); + if (!bitrate) + bitrate = "0"; + + ret = SHOUTERR_MALLOC; + do { + if (shout_queue_printf(self, "SOURCE %s %s\n", self->password, self->mount)) + break; + if (shout_queue_printf(self, "x-audiocast-name: %s\n", shout_get_meta(self, "name"))) + break; + val = shout_get_meta(self, "url"); + if (shout_queue_printf(self, "x-audiocast-url: %s\n", val ? val : "http://www.icecast.org/")) + break; + val = shout_get_meta(self, "genre"); + if (shout_queue_printf(self, "x-audiocast-genre: %s\n", val ? val : "icecast")) + break; + if (shout_queue_printf(self, "x-audiocast-bitrate: %s\n", bitrate)) + break; + if (shout_queue_printf(self, "x-audiocast-public: %i\n", self->public)) + break; + val = shout_get_meta(self, "description"); + if (shout_queue_printf(self, "x-audiocast-description: %s\n", val ? val : "Broadcasting with the icecast streaming media server!")) + break; + if (self->dumpfile && shout_queue_printf(self, "x-audiocast-dumpfile: %s\n", self->dumpfile)) + break; + if (shout_queue_str(self, "\n")) + break; + + ret = SHOUTERR_SUCCESS; + } while (0); + + return ret; +} + +int shout_parse_xaudiocast_response(shout_t *self) +{ + char *response; + + if (shout_queue_collect(self->rqueue.head, &response) <= 0) + return SHOUTERR_MALLOC; + shout_queue_free(&self->rqueue); + + if (!strstr(response, "OK")) { + free(response); + return SHOUTERR_NOLOGIN; + } + free(response); + + return SHOUTERR_SUCCESS; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/queue.c mixxx-2.2.4~dfsg/lib/libshout/src/queue.c --- mixxx-2.2.3~dfsg/lib/libshout/src/queue.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/queue.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,147 @@ +/* -*- c-basic-offset: 8; -*- */ +/* queue.c: Implementation data queue logic. + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#include +#include "shout_private.h" + +/* queue data in pages of SHOUT_BUFSIZE bytes */ +int shout_queue_data(shout_queue_t *queue, const unsigned char *data, size_t len) +{ + shout_buf_t *buf; + size_t plen; + + if (!len) + return SHOUTERR_SUCCESS; + + if (!queue->len) { + queue->head = calloc(1, sizeof (shout_buf_t)); + if (!queue->head) + return SHOUTERR_MALLOC; + } + + for (buf = queue->head; buf->next; buf = buf->next); + + /* Maybe any added data should be freed if we hit a malloc error? + * Otherwise it'd be impossible to tell where to start requeueing. + * (As if anyone ever tried to recover from a malloc error.) */ + while (len > 0) { + if (buf->len == SHOUT_BUFSIZE) { + buf->next = calloc(1, sizeof (shout_buf_t)); + if (!buf->next) + return SHOUTERR_MALLOC; + buf->next->prev = buf; + buf = buf->next; + } + + plen = len > SHOUT_BUFSIZE - buf->len ? SHOUT_BUFSIZE - buf->len : len; + memcpy(buf->data + buf->len, data, plen); + buf->len += plen; + data += plen; + len -= plen; + queue->len += plen; + } + + return SHOUTERR_SUCCESS; +} + +int shout_queue_str(shout_t *self, const char *str) +{ + return shout_queue_data(&self->wqueue, (const unsigned char*)str, strlen(str)); +} + +/* this should be shared with sock_write. Create libicecommon. */ +int shout_queue_printf(shout_t *self, const char *fmt, ...) +{ + char buffer[1024]; + char *buf; + va_list ap, ap_retry; + int len; + + buf = buffer; + + va_start(ap, fmt); + va_copy(ap_retry, ap); + + len = vsnprintf(buf, sizeof(buffer), fmt, ap); + + self->error = SHOUTERR_SUCCESS; + if (len > 0) { + if ((size_t)len < sizeof(buffer)) + shout_queue_data(&self->wqueue, (unsigned char*)buf, len); + else { + buf = malloc(++len); + if (buf) { + len = vsnprintf(buf, len, fmt, ap_retry); + shout_queue_data(&self->wqueue, (unsigned char*)buf, len); + free(buf); + } else + self->error = SHOUTERR_MALLOC; + } + } + + va_end(ap_retry); + va_end(ap); + + return self->error; +} + +void shout_queue_free(shout_queue_t *queue) +{ + shout_buf_t *prev; + + while (queue->head) { + prev = queue->head; + queue->head = queue->head->next; + free(prev); + } + queue->len = 0; +} + +/* collect nodes of a queue into a single buffer */ +ssize_t shout_queue_collect(shout_buf_t *queue, char **buf) +{ + shout_buf_t *node; + size_t pos = 0; + size_t len = 0; + + for (node = queue; node; node = node->next) + len += node->len; + + if (!(*buf = malloc(len))) + return SHOUTERR_MALLOC; + + for (node = queue; node; node = node->next) { + memcpy(*buf + pos, node->data, node->len); + pos += node->len; + } + + return len; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/shout.c mixxx-2.2.4~dfsg/lib/libshout/src/shout.c --- mixxx-2.2.3~dfsg/lib/libshout/src/shout.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/shout.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,1398 @@ +/* -*- c-basic-offset: 8; -*- */ +/* shout.c: Implementation of public libshout interface shout.h + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include "common/timing/timing.h" +#include "common/httpp/httpp.h" + +#include "shout_private.h" +#include "util.h" + +#ifdef _MSC_VER +# ifndef va_copy +# define va_copy(ap1, ap2) memcpy(&ap1, &ap2, sizeof(va_list)) +# endif +# define vsnprintf _vsnprintf +# define inline _inline +#endif + +/* -- local prototypes -- */ +static int send_queue(shout_t *self); +static int get_response(shout_t *self); +static int try_connect (shout_t *self); +static int try_write (shout_t *self, const void *data, size_t len); + +static int create_request(shout_t *self); +static int parse_response(shout_t *self); + +/* -- static data -- */ +static int _initialized = 0; + +/* -- public functions -- */ + +void shout_init(void) +{ + if (_initialized) + return; + + sock_initialize(); + _initialized = 1; +} + +void shout_shutdown(void) +{ + if (!_initialized) + return; + + sock_shutdown(); + _initialized = 0; +} + +shout_t *shout_new(void) +{ + shout_t *self; + + /* in case users haven't done this explicitly. Should we error + * if not initialized instead? */ + shout_init(); + + if (!(self = (shout_t *)calloc(1, sizeof(shout_t)))) { + return NULL; + } + + if (shout_set_host(self, LIBSHOUT_DEFAULT_HOST) != SHOUTERR_SUCCESS) { + shout_free(self); + + return NULL; + } + if (shout_set_user(self, LIBSHOUT_DEFAULT_USER) != SHOUTERR_SUCCESS) { + shout_free(self); + + return NULL; + } + if (shout_set_agent(self, LIBSHOUT_DEFAULT_USERAGENT) != SHOUTERR_SUCCESS) { + shout_free(self); + + return NULL; + } + if (!(self->audio_info = _shout_util_dict_new())) { + shout_free(self); + + return NULL; + } + if (!(self->meta = _shout_util_dict_new())) { + shout_free(self); + + return NULL; + } + if (shout_set_meta(self, "name", "no name") != SHOUTERR_SUCCESS) { + shout_free(self); + + return NULL; + } + +#ifdef HAVE_OPENSSL + if (shout_set_allowed_ciphers(self, LIBSHOUT_DEFAULT_ALLOWED_CIPHERS) != SHOUTERR_SUCCESS) { + shout_free(self); + + return NULL; + } + self->tls_mode = SHOUT_TLS_AUTO; +#endif + + self->port = LIBSHOUT_DEFAULT_PORT; + self->format = LIBSHOUT_DEFAULT_FORMAT; + self->protocol = LIBSHOUT_DEFAULT_PROTOCOL; + + return self; +} + +void shout_free(shout_t *self) +{ + if (!self) return; + + if (self->state != SHOUT_STATE_UNCONNECTED) return; + + if (self->host) free(self->host); + if (self->password) free(self->password); + if (self->mount) free(self->mount); + if (self->user) free(self->user); + if (self->useragent) free(self->useragent); + if (self->audio_info) _shout_util_dict_free (self->audio_info); + if (self->meta) _shout_util_dict_free (self->meta); + +#ifdef HAVE_OPENSSL + if (self->ca_directory) free(self->ca_directory); + if (self->ca_file) free(self->ca_file); + if (self->allowed_ciphers) free(self->allowed_ciphers); + if (self->client_certificate) free(self->client_certificate); +#endif + + free(self); +} + +int shout_open(shout_t *self) +{ + /* sanity check */ + if (!self) + return SHOUTERR_INSANE; + if (self->state != SHOUT_STATE_UNCONNECTED) + return SHOUTERR_CONNECTED; + if (!self->host || !self->password || !self->port) + return self->error = SHOUTERR_INSANE; + if (self->format == SHOUT_FORMAT_OGG && (self->protocol != SHOUT_PROTOCOL_HTTP && self->protocol != SHOUT_PROTOCOL_ROARAUDIO)) + return self->error = SHOUTERR_UNSUPPORTED; + + return self->error = try_connect(self); +} + + +int shout_close(shout_t *self) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state == SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_UNCONNECTED; + + if (self->state == SHOUT_STATE_CONNECTED && self->close) + self->close(self); + +#ifdef HAVE_OPENSSL + if (self->tls) + shout_tls_close(self->tls); + self->tls = NULL; +#endif + + sock_close(self->socket); + self->state = SHOUT_STATE_UNCONNECTED; + self->starttime = 0; + self->senttime = 0; + shout_queue_free(&self->rqueue); + shout_queue_free(&self->wqueue); + + return self->error = SHOUTERR_SUCCESS; +} + +int shout_send(shout_t *self, const unsigned char *data, size_t len) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_CONNECTED) + return self->error = SHOUTERR_UNCONNECTED; + + if (self->starttime <= 0) + self->starttime = timing_get_time(); + + if (!len) + return send_queue(self); + + return self->send(self, data, len); +} + +ssize_t shout_send_raw(shout_t *self, const unsigned char *data, size_t len) +{ + ssize_t ret; + + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_CONNECTED) + return SHOUTERR_UNCONNECTED; + + self->error = SHOUTERR_SUCCESS; + + /* send immediately if possible (should be the common case) */ + if (len && ! self->wqueue.len) { + if ((ret = try_write(self, data, len)) < 0) + return self->error; + if (ret < (ssize_t)len) { + self->error = shout_queue_data(&self->wqueue, data + ret, len - ret); + if (self->error != SHOUTERR_SUCCESS) + return self->error; + } + + return len; + } + + self->error = shout_queue_data(&self->wqueue, data, len); + if (self->error != SHOUTERR_SUCCESS) + return self->error; + + ret = send_queue(self); + if (ret == SHOUTERR_SUCCESS || (len && ret == SHOUTERR_BUSY)) + return len; + + return ret; +} + +ssize_t shout_queuelen(shout_t *self) +{ + if (!self) + return SHOUTERR_INSANE; + + return (ssize_t)self->wqueue.len; +} + + +void shout_sync(shout_t *self) +{ + int64_t sleep; + + if (!self) + return; + + if (self->senttime == 0) + return; + + sleep = self->senttime / 1000 - (timing_get_time() - self->starttime); + if (sleep > 0) + timing_sleep((uint64_t)sleep); + +} + +int shout_delay(shout_t *self) +{ + + if (!self) + return 0; + + if (self->senttime == 0) + return 0; + + return self->senttime / 1000 - (timing_get_time() - self->starttime); +} + +shout_metadata_t *shout_metadata_new(void) +{ + return _shout_util_dict_new(); +} + +void shout_metadata_free(shout_metadata_t *self) +{ + if (!self) + return; + + _shout_util_dict_free(self); +} + +int shout_metadata_add(shout_metadata_t *self, const char *name, const char *value) +{ + if (!self || !name) + return SHOUTERR_INSANE; + + return _shout_util_dict_set(self, name, value); +} + +/* open second socket to server, send HTTP request to change metadata. + * TODO: prettier error-handling. */ +int shout_set_metadata(shout_t *self, shout_metadata_t *metadata) +{ + int error; + sock_t socket = -1; + int rv; + char *encvalue = NULL; + const char *request_template; + char *request = NULL; + size_t request_len; + char *auth = NULL; +#ifdef HAVE_OPENSSL + shout_tls_t *tls = NULL; +#endif + + if (!self || !metadata) + return SHOUTERR_INSANE; + + if (!(encvalue = _shout_util_dict_urlencode(metadata, '&'))) + goto error_malloc; + + switch (self->protocol) { + case SHOUT_PROTOCOL_ICY: + request_template = "GET /admin.cgi?mode=updinfo&pass=%s&%s HTTP/1.0\r\nUser-Agent: %s (Mozilla compatible)\r\n\r\n"; + request_len = strlen(request_template) + strlen(self->password) + strlen(encvalue) + strlen(shout_get_agent(self)) + 1; + if (!(request = malloc(request_len))) + goto error_malloc; + snprintf(request, request_len, request_template, self->password, encvalue, shout_get_agent(self)); + break; + case SHOUT_PROTOCOL_HTTP: + auth = shout_http_basic_authorization(self); + + request_template = "GET /admin/metadata?mode=updinfo&mount=%s&%s HTTP/1.0\r\nUser-Agent: %s\r\n%s\r\n"; + request_len = strlen(request_template) + strlen(self->mount) + strlen(encvalue) + strlen(shout_get_agent(self)) + 1; + if (auth) + request_len += strlen(auth); + if (!(request = malloc(request_len))) + goto error_malloc; + snprintf(request, request_len, request_template, self->mount, encvalue, shout_get_agent(self), auth ? auth : ""); + break; + default: + request_template = "GET /admin.cgi?mode=updinfo&pass=%s&mount=%s&%s HTTP/1.0\r\nUser-Agent: %s\r\n\r\n"; + request_len = strlen(request_template) + strlen(self->password) + strlen(self->mount) + strlen(encvalue) + strlen(shout_get_agent(self)) + 1; + if (!(request = malloc(request_len))) + goto error_malloc; + snprintf(request, request_len, request_template, self->password, self->mount, encvalue, shout_get_agent(self)); + break; + } + + free(encvalue); + encvalue = NULL; + + if (auth) + free(auth); + auth = NULL; + + if ((socket = sock_connect(self->host, self->port)) <= 0) + return SHOUTERR_NOCONNECT; + +#ifdef HAVE_OPENSSL + switch (self->tls_mode) { + case SHOUT_TLS_DISABLED: + /* nothing to do */ + break; + case SHOUT_TLS_RFC2817: /* Use TLS via HTTP Upgrade:-header [RFC2817]. */ + do { /* use a subscope to avoid more function level variables */ + char upgrade[512]; + size_t len; + + /* send upgrade request */ + snprintf(upgrade, sizeof(upgrade), + "GET / HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: TLS/1.0\r\nHost: %s:%i\r\n\r\n", + self->host, self->port); + upgrade[sizeof(upgrade)-1] = 0; + len = strlen(upgrade); + if (len == (sizeof(upgrade) - 1)) + goto error_malloc; + rv = sock_write_bytes(socket, upgrade, len); + if (len != (size_t)rv) + goto error_socket; + + /* read status line */ + if (!sock_read_line(socket, upgrade, sizeof(upgrade))) + goto error_socket; + if (strncmp(upgrade, "HTTP/1.1 101 ", 13) != 0) + goto error_socket; + + /* read headers */ + len = 0; + do { + if (!sock_read_line(socket, upgrade, sizeof(upgrade))) + goto error_socket; + if (upgrade[0] == 0) + break; + if (!strncasecmp(upgrade, "Content-Length: ", 16) == 0) + len = atoi(upgrade + 16); + } while (1); + + /* read body */ + while (len) { + rv = sock_read_bytes(socket, upgrade, len > sizeof(upgrade) ? sizeof(upgrade) : len); + if (rv < 1) + goto error_socket; + len -= rv; + } + } while (0); + /* fall thru */ + case SHOUT_TLS_RFC2818: /* Use TLS for transport layer like HTTPS [RFC2818] does. */ + tls = shout_tls_new(self, socket); + if (!tls) + goto error_malloc; + error = shout_tls_try_connect(tls); + if (error != SHOUTERR_SUCCESS) + goto error; + break; + default: + /* Bad mode or auto detection not completed. */ + error = SHOUTERR_INSANE; + goto error; + break; + } +#endif + +#ifdef HAVE_OPENSSL + if (tls) { + rv = shout_tls_write(tls, request, strlen(request)); + } else { + rv = sock_write(socket, "%s", request); + } +#else + rv = sock_write(socket, "%s", request); +#endif + + if (!rv) + goto error_socket; + + error = SHOUTERR_SUCCESS; + goto error; + +error_socket: + error = SHOUTERR_SOCKET; + goto error; +error_malloc: + error = SHOUTERR_MALLOC; + goto error; +error: +#ifdef HAVE_OPENSSL + if (tls) + shout_tls_close(tls); +#endif + if (socket != -1) + sock_close(socket); + if (encvalue) + free(encvalue); + if (request) + free(request); + if (auth) + free(auth); + return error; +} + +/* getters/setters */ +const char *shout_version(int *major, int *minor, int *patch) +{ + if (major) + *major = LIBSHOUT_MAJOR; + if (minor) + *minor = LIBSHOUT_MINOR; + if (patch) + *patch = LIBSHOUT_MICRO; + + return VERSION; +} + +int shout_get_errno(shout_t *self) +{ + return self->error; +} + +const char *shout_get_error(shout_t *self) +{ + if (!self) + return "Invalid shout_t"; + + switch (self->error) { + case SHOUTERR_SUCCESS: + return "No error"; + case SHOUTERR_INSANE: + return "Nonsensical arguments"; + case SHOUTERR_NOCONNECT: + return "Couldn't connect"; + case SHOUTERR_NOLOGIN: + return "Login failed"; + case SHOUTERR_SOCKET: + return "Socket error"; + case SHOUTERR_MALLOC: + return "Out of memory"; + case SHOUTERR_CONNECTED: + return "Cannot set parameter while connected"; + case SHOUTERR_UNCONNECTED: + return "Not connected"; + case SHOUTERR_BUSY: + return "Socket is busy"; + case SHOUTERR_UNSUPPORTED: + return "This libshout doesn't support the requested option"; + case SHOUTERR_NOTLS: + return "TLS requested but not supported by peer"; + case SHOUTERR_TLSBADCERT: + return "TLS connection can not be established because of bad certificate"; + case SHOUTERR_RETRY: + return "Please retry current operation."; + default: + return "Unknown error"; + } +} + +/* Returns: + * SHOUTERR_CONNECTED if the connection is open, + * SHOUTERR_UNCONNECTED if it has not yet been opened, + * or an error from try_connect, including SHOUTERR_BUSY + */ +int shout_get_connected(shout_t *self) +{ + int rc; + + if (!self) + return SHOUTERR_INSANE; + + if (self->state == SHOUT_STATE_CONNECTED) + return SHOUTERR_CONNECTED; + if (self->state != SHOUT_STATE_UNCONNECTED) { + if ((rc = try_connect(self)) == SHOUTERR_SUCCESS) + return SHOUTERR_CONNECTED; + return rc; + } + + return SHOUTERR_UNCONNECTED; +} + +int shout_set_host(shout_t *self, const char *host) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->host) + free(self->host); + + if (!(self->host = _shout_util_strdup(host))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_host(shout_t *self) +{ + if (!self) + return NULL; + + return self->host; +} + +int shout_set_port(shout_t *self, unsigned short port) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + self->port = port; + + return self->error = SHOUTERR_SUCCESS; +} + +unsigned short shout_get_port(shout_t *self) +{ + if (!self) + return 0; + + return self->port; +} + +int shout_set_password(shout_t *self, const char *password) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->password) + free (self->password); + + if (!(self->password = _shout_util_strdup(password))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char* shout_get_password(shout_t *self) +{ + if (!self) + return NULL; + + return self->password; +} + +int shout_set_mount(shout_t *self, const char *mount) +{ + size_t len; + + if (!self || !mount) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->mount) + free(self->mount); + + len = strlen (mount) + 1; + if (mount[0] != '/') + len++; + + if (!(self->mount = malloc(len))) + return self->error = SHOUTERR_MALLOC; + + snprintf (self->mount, len, "%s%s", mount[0] == '/' ? "" : "/", mount); + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_mount(shout_t *self) +{ + if (!self) + return NULL; + + return self->mount; +} + +int shout_set_name(shout_t *self, const char *name) +{ + return shout_set_meta(self, "name", name); +} + +const char *shout_get_name(shout_t *self) +{ + return shout_get_meta(self, "name"); +} + +int shout_set_url(shout_t *self, const char *url) +{ + return shout_set_meta(self, "url", url); +} + +const char *shout_get_url(shout_t *self) +{ + return shout_get_meta(self, "url"); +} + +int shout_set_genre(shout_t *self, const char *genre) +{ + return shout_set_meta(self, "genre", genre); +} + +const char *shout_get_genre(shout_t *self) +{ + return shout_get_meta(self, "genre"); +} + +int shout_set_agent(shout_t *self, const char *agent) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->useragent) + free(self->useragent); + + if (! (self->useragent = _shout_util_strdup (agent))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_agent(shout_t *self) +{ + if (!self) + return NULL; + + return self->useragent; +} + + +int shout_set_user(shout_t *self, const char *username) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->user) + free(self->user); + + if (! (self->user = _shout_util_strdup (username))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_user(shout_t *self) +{ + if (!self) + return NULL; + + return self->user; +} + +int shout_set_description(shout_t *self, const char *description) +{ + return shout_set_meta(self, "description", description); +} + +const char *shout_get_description(shout_t *self) +{ + return shout_get_meta(self, "description"); +} + +int shout_set_dumpfile(shout_t *self, const char *dumpfile) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return SHOUTERR_CONNECTED; + + if (self->dumpfile) + free(self->dumpfile); + + if (! (self->dumpfile = _shout_util_strdup (dumpfile))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_dumpfile(shout_t *self) +{ + if (!self) + return NULL; + + return self->dumpfile; +} + +int shout_set_audio_info(shout_t *self, const char *name, const char *value) +{ + if (!self) + return SHOUTERR_INSANE; + + return self->error = _shout_util_dict_set(self->audio_info, name, value); +} + +const char *shout_get_audio_info(shout_t *self, const char *name) +{ + if (!self) + return NULL; + + return _shout_util_dict_get(self->audio_info, name); +} + +int shout_set_meta(shout_t *self, const char *name, const char *value) +{ + size_t i; + + if (!self || !name) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + for (i = 0; name[i]; i++) + if ((name[i] < 'a' || name[i] > 'z') && (name[i] < '0' || name[i] > '9')) + return self->error = SHOUTERR_INSANE; + + return self->error = _shout_util_dict_set(self->meta, name, value); +} + +const char *shout_get_meta(shout_t *self, const char *name) +{ + if (!self) + return NULL; + + return _shout_util_dict_get(self->meta, name); +} + +int shout_set_public(shout_t *self, unsigned int public) +{ + if (!self || (public != 0 && public != 1)) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + self->public = public; + + return self->error = SHOUTERR_SUCCESS; +} + +unsigned int shout_get_public(shout_t *self) +{ + if (!self) + return 0; + + return self->public; +} + +int shout_set_format(shout_t *self, unsigned int format) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (format != SHOUT_FORMAT_OGG + && format != SHOUT_FORMAT_MP3 + && format != SHOUT_FORMAT_WEBM + && format != SHOUT_FORMAT_WEBMAUDIO) + return self->error = SHOUTERR_UNSUPPORTED; + + self->format = format; + + return self->error = SHOUTERR_SUCCESS; +} + +unsigned int shout_get_format(shout_t* self) +{ + if (!self) + return 0; + + return self->format; +} + +int shout_set_protocol(shout_t *self, unsigned int protocol) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (protocol != SHOUT_PROTOCOL_HTTP && + protocol != SHOUT_PROTOCOL_XAUDIOCAST && + protocol != SHOUT_PROTOCOL_ICY && + protocol != SHOUT_PROTOCOL_ROARAUDIO) + return self->error = SHOUTERR_UNSUPPORTED; + + self->protocol = protocol; + + return self->error = SHOUTERR_SUCCESS; +} + +unsigned int shout_get_protocol(shout_t *self) +{ + if (!self) + return 0; + + return self->protocol; +} + +int shout_set_nonblocking(shout_t *self, unsigned int nonblocking) +{ + if (!self || (nonblocking != 0 && nonblocking != 1)) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + self->nonblocking = nonblocking; + + return SHOUTERR_SUCCESS; +} + +unsigned int shout_get_nonblocking(shout_t *self) +{ + if (!self) + return 0; + + return self->nonblocking; +} + +/* TLS functions */ +#ifdef HAVE_OPENSSL +int shout_set_tls(shout_t *self, int mode) +{ + if (!self) + return SHOUTERR_INSANE; + + if (mode != SHOUT_TLS_DISABLED && + mode != SHOUT_TLS_AUTO && + mode != SHOUT_TLS_AUTO_NO_PLAIN && + mode != SHOUT_TLS_RFC2818 && + mode != SHOUT_TLS_RFC2817) + return self->error = SHOUTERR_UNSUPPORTED; + + self->tls_mode = mode; + return SHOUTERR_SUCCESS; +} +int shout_get_tls(shout_t *self) +{ + if (!self) + return SHOUTERR_INSANE; + + return self->tls_mode; +} + +int shout_set_ca_directory(shout_t *self, const char *directory) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->ca_directory) + free (self->ca_directory); + + if (!(self->ca_directory = _shout_util_strdup(directory))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_ca_directory(shout_t *self) +{ + if (!self) + return NULL; + + return self->ca_directory; +} + +int shout_set_ca_file(shout_t *self, const char *file) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->ca_file) + free (self->ca_file); + + if (!(self->ca_file = _shout_util_strdup(file))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_ca_file(shout_t *self) +{ + if (!self) + return NULL; + + return self->ca_file; +} + +int shout_set_allowed_ciphers(shout_t *self, const char *ciphers) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->allowed_ciphers) + free (self->allowed_ciphers); + + if (!(self->allowed_ciphers = _shout_util_strdup(ciphers))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_allowed_ciphers(shout_t *self) +{ + if (!self) + return NULL; + + return self->allowed_ciphers; +} + +int shout_set_client_certificate(shout_t *self, const char *certificate) +{ + if (!self) + return SHOUTERR_INSANE; + + if (self->state != SHOUT_STATE_UNCONNECTED) + return self->error = SHOUTERR_CONNECTED; + + if (self->client_certificate) + free (self->client_certificate); + + if (!(self->client_certificate = _shout_util_strdup(certificate))) + return self->error = SHOUTERR_MALLOC; + + return self->error = SHOUTERR_SUCCESS; +} + +const char *shout_get_client_certificate(shout_t *self) +{ + if (!self) + return NULL; + + return self->client_certificate; +} +#else +int shout_set_tls(shout_t *self, int mode) +{ + if (!self) + return SHOUTERR_INSANE; + + if (mode == SHOUT_TLS_DISABLED) + return SHOUTERR_SUCCESS; + + return self->error = SHOUTERR_UNSUPPORTED; +} +int shout_get_tls(shout_t *self) +{ + return SHOUT_TLS_DISABLED; +} +int shout_set_ca_directory(shout_t *self, const char *directory) +{ + if (!self) + return SHOUTERR_INSANE; + return self->error = SHOUTERR_UNSUPPORTED; +} +const char *shout_get_ca_directory(shout_t *self) +{ + return NULL; +} + +int shout_set_ca_file(shout_t *self, const char *file) +{ + if (!self) + return SHOUTERR_INSANE; + return self->error = SHOUTERR_UNSUPPORTED; +} +const char *shout_get_ca_file(shout_t *self) +{ + return NULL; +} + +int shout_set_allowed_ciphers(shout_t *self, const char *ciphers) +{ + if (!self) + return SHOUTERR_INSANE; + return self->error = SHOUTERR_UNSUPPORTED; +} +const char *shout_get_allowed_ciphers(shout_t *self) +{ + return NULL; +} + +int shout_set_client_certificate(shout_t *self, const char *certificate) +{ + if (!self) + return SHOUTERR_INSANE; + return self->error = SHOUTERR_UNSUPPORTED; +} +const char *shout_get_client_certificate(shout_t *self) +{ + return NULL; +} +#endif + +/* -- static function definitions -- */ +static int get_response(shout_t *self) +{ + char buf[1024]; + int rc; + + rc = shout_conn_read(self, buf, sizeof(buf)); + + if (rc < 0 && shout_conn_recoverable(self)) + return SHOUTERR_BUSY; + if (rc <= 0) + return SHOUTERR_SOCKET; + + if ((rc = shout_queue_data(&self->rqueue, (unsigned char*)buf, rc))) + return rc; + + if (self->protocol == SHOUT_PROTOCOL_ROARAUDIO) + return shout_get_roaraudio_response(self); + + return shout_get_http_response(self); +} + +static int try_connect (shout_t *self) +{ + int rc; + int port; + + /* the breaks between cases are omitted intentionally */ +retry: + switch (self->state) { + case SHOUT_STATE_UNCONNECTED: + port = self->port; + if (shout_get_protocol(self) == SHOUT_PROTOCOL_ICY) + port++; + + if (shout_get_nonblocking(self)) { + if ((self->socket = sock_connect_non_blocking(self->host, port)) < 0) + return self->error = SHOUTERR_NOCONNECT; + self->state = SHOUT_STATE_CONNECT_PENDING; + } else { + if ((self->socket = sock_connect(self->host, port)) < 0) + return self->error = SHOUTERR_NOCONNECT; + self->state = SHOUT_STATE_CONNECT_PENDING; + } + + case SHOUT_STATE_CONNECT_PENDING: + if (shout_get_nonblocking(self)) { + if ((rc = sock_connected(self->socket, 0)) < 1) { + if (rc == SOCK_ERROR) { + rc = SHOUTERR_SOCKET; + goto failure; + } else + return SHOUTERR_BUSY; + } + } + self->state = SHOUT_STATE_TLS_PENDING; + + case SHOUT_STATE_TLS_PENDING: +#ifdef HAVE_OPENSSL + if (self->tls_mode == SHOUT_TLS_DISABLED) { + /* nothing to be done */ + } else if (self->tls_mode == SHOUT_TLS_AUTO || self->tls_mode == SHOUT_TLS_AUTO_NO_PLAIN) { + if (self->server_caps & LIBSHOUT_CAP_GOTCAPS) { + /* We had a probe allready, otherwise just do nothing to poke the server. */ + if (self->server_caps & LIBSHOUT_CAP_UPGRADETLS) { + self->tls_mode = SHOUT_TLS_RFC2817; + } else { + if (self->tls_mode == SHOUT_TLS_AUTO_NO_PLAIN) + return SHOUTERR_NOTLS; + self->tls_mode = SHOUT_TLS_DISABLED; + } + self->state = SHOUT_STATE_TLS_PENDING; + goto retry; + } + } else if (self->tls_mode == SHOUT_TLS_RFC2818 || self->upgrade_to_tls) { + if (!self->tls) { + self->tls = shout_tls_new(self, self->socket); + if (!self->tls) /* just guessing that it's a malloc error */ + return SHOUTERR_MALLOC; + } + if ((rc = shout_tls_try_connect(self->tls)) != SHOUTERR_SUCCESS) { + if (rc == SHOUTERR_BUSY) + return SHOUTERR_BUSY; + goto failure; + } + } else if (self->tls_mode == SHOUT_TLS_RFC2817) { + if ((rc = shout_create_http_request_upgrade(self, "TLS/1.0")) != SHOUTERR_SUCCESS) { + if (rc == SHOUTERR_BUSY) + return SHOUTERR_BUSY; + goto failure; + } + self->state = SHOUT_STATE_REQ_PENDING; + goto retry; + } else { + rc = SHOUTERR_INSANE; + goto failure; + } +#endif + self->state = SHOUT_STATE_REQ_CREATION; + + case SHOUT_STATE_REQ_CREATION: + if ((rc = create_request(self)) != SHOUTERR_SUCCESS) + goto failure; + self->state = SHOUT_STATE_REQ_PENDING; + + case SHOUT_STATE_REQ_PENDING: + do + rc = send_queue(self); + while (!shout_get_nonblocking(self) && rc == SHOUTERR_BUSY); + if (rc == SHOUTERR_BUSY) + return rc; + + if (rc == SHOUTERR_SOCKET && self->retry) { + self->state = SHOUT_STATE_RECONNECT; + goto retry; + } + + if (rc != SHOUTERR_SUCCESS) + goto failure; + self->state = SHOUT_STATE_RESP_PENDING; + + case SHOUT_STATE_RESP_PENDING: + do + rc = get_response(self); + while (!shout_get_nonblocking(self) && rc == SHOUTERR_BUSY); + if (rc == SHOUTERR_BUSY) + return rc; + + if (rc == SHOUTERR_SOCKET && self->retry) { + self->state = SHOUT_STATE_RECONNECT; + goto retry; +#ifdef HAVE_OPENSSL + } else if (rc == SHOUTERR_SOCKET && !(self->server_caps & LIBSHOUT_CAP_GOTCAPS) && + (self->tls_mode == SHOUT_TLS_AUTO || self->tls_mode == SHOUT_TLS_AUTO_NO_PLAIN)) { + self->state = SHOUT_STATE_RECONNECT; + self->tls_mode = SHOUT_TLS_RFC2818; + goto retry; +#endif + } + + if (rc != SHOUTERR_SUCCESS) + goto failure; + + if ((rc = parse_response(self)) != SHOUTERR_SUCCESS) { + if (rc == SHOUTERR_RETRY) + goto retry; + if (self->retry) { + self->state = SHOUT_STATE_TLS_PENDING; + goto retry; + } + goto failure; + } + + switch (self->format) { + case SHOUT_FORMAT_OGG: + if ((rc = self->error = shout_open_ogg(self)) != SHOUTERR_SUCCESS) + goto failure; + break; + case SHOUT_FORMAT_MP3: + if ((rc = self->error = shout_open_mp3(self)) != SHOUTERR_SUCCESS) + goto failure; + break; + case SHOUT_FORMAT_WEBM: + case SHOUT_FORMAT_WEBMAUDIO: + if ((rc = self->error = shout_open_webm(self)) != SHOUTERR_SUCCESS) + goto failure; + break; + default: + rc = SHOUTERR_INSANE; + goto failure; + } + + case SHOUT_STATE_CONNECTED: + self->state = SHOUT_STATE_CONNECTED; + break; + + /* special case, no fallthru to this */ + case SHOUT_STATE_RECONNECT: + sock_close(self->socket); + self->state = SHOUT_STATE_UNCONNECTED; + goto retry; + break; + } + + return SHOUTERR_SUCCESS; + +failure: + shout_close(self); + return rc; +} + +static int try_write (shout_t *self, const void *data_p, size_t len) +{ + int ret; + size_t pos = 0; + unsigned char *data = (unsigned char *)data_p; + + /* loop until whole buffer is written (unless it would block) */ + do { + ret = shout_conn_write(self, data + pos, len - pos); + if (ret > 0) + pos += ret; + } while (pos < len && ret >= 0); + + if (ret < 0) + { + if (shout_conn_recoverable(self)) + { + self->error = SHOUTERR_BUSY; + return pos; + } + self->error = SHOUTERR_SOCKET; + return ret; + } + + return pos; +} + +ssize_t shout_conn_read(shout_t *self, void *buf, size_t len) +{ +#ifdef HAVE_OPENSSL + if (self->tls) + return shout_tls_read(self->tls, buf, len); +#endif + return sock_read_bytes(self->socket, buf, len); +} +ssize_t shout_conn_write(shout_t *self, const void *buf, size_t len) +{ +#ifdef HAVE_OPENSSL + if (self->tls) + return shout_tls_write(self->tls, buf, len); +#endif + return sock_write_bytes(self->socket, buf, len); +} +int shout_conn_recoverable(shout_t *self) +{ +#ifdef HAVE_OPENSSL + if (self->tls) + return shout_tls_recoverable(self->tls); +#endif + return sock_recoverable(sock_error()); +} + +static int send_queue(shout_t *self) +{ + shout_buf_t *buf; + int ret; + + if (!self->wqueue.len) + return SHOUTERR_SUCCESS; + + buf = self->wqueue.head; + while (buf) { + ret = try_write (self, buf->data + buf->pos, buf->len - buf->pos); + if (ret < 0) + return self->error; + + buf->pos += ret; + self->wqueue.len -= ret; + if (buf->pos == buf->len) { + self->wqueue.head = buf->next; + free(buf); + buf = self->wqueue.head; + if (buf) + buf->prev = NULL; + } else /* incomplete write */ + return SHOUTERR_BUSY; + } + + return self->error = SHOUTERR_SUCCESS; +} + +static int create_request(shout_t *self) +{ + if (self->protocol == SHOUT_PROTOCOL_HTTP) + return shout_create_http_request(self); + else if (self->protocol == SHOUT_PROTOCOL_XAUDIOCAST) + return shout_create_xaudiocast_request(self); + else if (self->protocol == SHOUT_PROTOCOL_ICY) + return shout_create_icy_request(self); + else if (self->protocol == SHOUT_PROTOCOL_ROARAUDIO) + return shout_create_roaraudio_request(self); + + return self->error = SHOUTERR_UNSUPPORTED; +} + +static int parse_response(shout_t *self) +{ + if (self->protocol == SHOUT_PROTOCOL_HTTP) + return shout_parse_http_response(self); + else if (self->protocol == SHOUT_PROTOCOL_XAUDIOCAST || + self->protocol == SHOUT_PROTOCOL_ICY) + return shout_parse_xaudiocast_response(self); + else if (self->protocol == SHOUT_PROTOCOL_ROARAUDIO) + return shout_parse_roaraudio_response(self); + + return self->error = SHOUTERR_UNSUPPORTED; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/shout_private.h mixxx-2.2.4~dfsg/lib/libshout/src/shout_private.h --- mixxx-2.2.3~dfsg/lib/libshout/src/shout_private.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/shout_private.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,210 @@ +/* -*- c-basic-offset: 8; -*- */ +/* shout.h: Private libshout data structures and declarations + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012-2015 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef __LIBSHOUT_SHOUT_PRIVATE_H__ +#define __LIBSHOUT_SHOUT_PRIVATE_H__ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include "util.h" + +#include +#ifdef HAVE_STDINT_H +# include +#elif defined (HAVE_INTTYPES_H) +# include +#endif + +#ifdef HAVE_OPENSSL +#include +#endif + +#define LIBSHOUT_DEFAULT_HOST "localhost" +#define LIBSHOUT_DEFAULT_PORT 8000 +#define LIBSHOUT_DEFAULT_FORMAT SHOUT_FORMAT_OGG +#define LIBSHOUT_DEFAULT_PROTOCOL SHOUT_PROTOCOL_HTTP +#define LIBSHOUT_DEFAULT_USER "source" +#define LIBSHOUT_DEFAULT_USERAGENT "libshout/" VERSION +#define LIBSHOUT_DEFAULT_ALLOWED_CIPHERS "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA" /* Mozilla's 'Intermediate' list as of 2015-04-19 */ + +/* server capabilities. + 0x000000XXUL -> Methods. + 0x0000XX00UL -> HTTP Options + 0x000X0000UL -> TLS Related + 0xX0000000UL -> State related + 0x0XX00000UL -> Reserved + */ +#define LIBSHOUT_CAP_SOURCE 0x00000001UL +#define LIBSHOUT_CAP_PUT 0x00000002UL +#define LIBSHOUT_CAP_GET 0x00000004UL +#define LIBSHOUT_CAP_POST 0x00000008UL +#define LIBSHOUT_CAP_CHUNKED 0x00000100UL +#define LIBSHOUT_CAP_100CONTINUE 0x00000200UL +#define LIBSHOUT_CAP_UPGRADETLS 0x00010000UL +#define LIBSHOUT_CAP_GOTCAPS 0x80000000UL + +#define LIBSHOUT_MAX_RETRY 2 + +#define SHOUT_BUFSIZE 4096 + +typedef struct _shout_tls shout_tls_t; + +typedef struct _shout_buf { + unsigned char data[SHOUT_BUFSIZE]; + unsigned int len; + unsigned int pos; + + struct _shout_buf *prev; + struct _shout_buf *next; +} shout_buf_t; + +typedef struct { + shout_buf_t *head; + size_t len; +} shout_queue_t; + +typedef enum { + SHOUT_STATE_UNCONNECTED = 0, + SHOUT_STATE_CONNECT_PENDING, + SHOUT_STATE_TLS_PENDING, + SHOUT_STATE_REQ_CREATION, + SHOUT_STATE_REQ_PENDING, + SHOUT_STATE_RESP_PENDING, + SHOUT_STATE_CONNECTED, + SHOUT_STATE_RECONNECT +} shout_state_e; + +struct shout { + /* hostname or IP of icecast server */ + char *host; + /* port of the icecast server */ + int port; + /* login password for the server */ + char *password; + /* server protocol to use */ + unsigned int protocol; + /* type of data being sent */ + unsigned int format; + /* audio encoding parameters */ + util_dict *audio_info; + + /* user-agent to use when doing HTTP login */ + char *useragent; + /* mountpoint for this stream */ + char *mount; + /* all the meta data about the stream */ + util_dict *meta; + /* icecast 1.x dumpfile */ + char *dumpfile; + /* username to use for HTTP auth. */ + char *user; + /* is this stream private? */ + int public; + + /* TLS options */ +#ifdef HAVE_OPENSSL + int upgrade_to_tls; + int tls_mode; + char *ca_directory; + char *ca_file; + char *allowed_ciphers; + char *client_certificate; + shout_tls_t *tls; +#endif + + /* server capabilities (LIBSHOUT_CAP_*) */ + uint32_t server_caps; + + /* Should we retry on error? */ + int retry; + + /* socket the connection is on */ + sock_t socket; + shout_state_e state; + int protocol_state; /* extra state information from the protocol */ + int protocol_extra; /* extra data from the protocol */ + int nonblocking; + + void *format_data; + int (*send)(shout_t* self, const unsigned char* buff, size_t len); + void (*close)(shout_t* self); + + shout_queue_t rqueue; + shout_queue_t wqueue; + + /* start of this period's timeclock */ + uint64_t starttime; + /* amout of data we've sent (in milliseconds) */ + uint64_t senttime; + + int error; +}; + +/* helper functions */ +int shout_queue_data(shout_queue_t *queue, const unsigned char *data, size_t len); +int shout_queue_str(shout_t *self, const char *str); +int shout_queue_printf(shout_t *self, const char *fmt, ...); +void shout_queue_free(shout_queue_t *queue); +ssize_t shout_queue_collect(shout_buf_t *queue, char **buf); + +/* transports */ +ssize_t shout_conn_read(shout_t *self, void *buf, size_t len); +ssize_t shout_conn_write(shout_t *self, const void *buf, size_t len); +int shout_conn_recoverable(shout_t *self); + +#ifdef HAVE_OPENSSL +shout_tls_t *shout_tls_new(shout_t *self, sock_t socket); +int shout_tls_try_connect(shout_tls_t *tls); +int shout_tls_close(shout_tls_t *tls); +ssize_t shout_tls_read(shout_tls_t *tls, void *buf, size_t len); +ssize_t shout_tls_write(shout_tls_t *tls, const void *buf, size_t len); +int shout_tls_recoverable(shout_tls_t *tls); +#endif + +/* protocols */ +char *shout_http_basic_authorization(shout_t *self); +int shout_create_http_request(shout_t *self); +int shout_create_http_request_upgrade(shout_t *self, const char *proto); +int shout_get_http_response(shout_t *self); +int shout_parse_http_response(shout_t *self); + +int shout_create_xaudiocast_request(shout_t *self); +int shout_parse_xaudiocast_response(shout_t *self); + +int shout_create_icy_request(shout_t *self); + +int shout_create_roaraudio_request(shout_t *self); +int shout_get_roaraudio_response(shout_t *self); +int shout_parse_roaraudio_response(shout_t *self); + +/* containsers */ +int shout_open_ogg(shout_t *self); +int shout_open_mp3(shout_t *self); +int shout_open_webm(shout_t *self); + +#endif /* __LIBSHOUT_SHOUT_PRIVATE_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/tls.c mixxx-2.2.4~dfsg/lib/libshout/src/tls.c --- mixxx-2.2.3~dfsg/lib/libshout/src/tls.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/tls.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,247 @@ +/* -*- c-basic-offset: 8; -*- */ +/* tls.c: TLS support functions + * $Id$ + * + * Copyright (C) 2015 Philipp Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include "shout_private.h" + +#ifndef XXX_HAVE_X509_check_host +#include +#endif + +struct _shout_tls { + SSL_CTX *ssl_ctx; + SSL *ssl; + int ssl_ret; + /* only pointers into self, don't need to free them */ + sock_t socket; + const char *host; + const char *ca_directory; + const char *ca_file; + const char *allowed_ciphers; + const char *client_certificate; +}; + +shout_tls_t *shout_tls_new(shout_t *self, sock_t socket) +{ + shout_tls_t *tls = calloc(1, sizeof(shout_tls_t)); + if (!tls) + return NULL; + + tls->socket = socket; + tls->host = self->host; + tls->ca_directory = self->ca_directory; + tls->ca_file = self->ca_file; + tls->allowed_ciphers = self->allowed_ciphers; + tls->client_certificate = self->client_certificate; + + return tls; +} + +static inline int tls_setup(shout_tls_t *tls) +{ + const SSL_METHOD *meth; +#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER) + SSL_library_init(); + SSL_load_error_strings(); + SSLeay_add_all_algorithms(); + SSLeay_add_ssl_algorithms(); + + meth = SSLv23_client_method(); +#else + meth = TLS_client_method(); +#endif + if (!meth) + goto error; + + tls->ssl_ctx = SSL_CTX_new(meth); + if (!tls->ssl_ctx) + goto error; + + SSL_CTX_set_default_verify_paths(tls->ssl_ctx); + SSL_CTX_load_verify_locations(tls->ssl_ctx, tls->ca_file, tls->ca_directory); + + SSL_CTX_set_verify(tls->ssl_ctx, SSL_VERIFY_NONE, NULL); + + if (tls->client_certificate) { + if (SSL_CTX_use_certificate_file(tls->ssl_ctx, tls->client_certificate, SSL_FILETYPE_PEM) != 1) + goto error; + if (SSL_CTX_use_PrivateKey_file(tls->ssl_ctx, tls->client_certificate, SSL_FILETYPE_PEM) != 1) + goto error; + } + + if (SSL_CTX_set_cipher_list(tls->ssl_ctx, tls->allowed_ciphers) <= 0) + goto error; + + SSL_CTX_set_mode(tls->ssl_ctx, SSL_MODE_ENABLE_PARTIAL_WRITE); + SSL_CTX_set_mode(tls->ssl_ctx, SSL_MODE_AUTO_RETRY); + + tls->ssl = SSL_new(tls->ssl_ctx); + if (!tls->ssl) + goto error; + + if (!SSL_set_fd(tls->ssl, tls->socket)) + goto error; + + SSL_set_tlsext_host_name(tls->ssl, tls->host); + SSL_set_connect_state(tls->ssl); + tls->ssl_ret = SSL_connect(tls->ssl); + + return SHOUTERR_SUCCESS; + + error: + if (tls->ssl) + SSL_free(tls->ssl); + if (tls->ssl_ctx) + SSL_CTX_free(tls->ssl_ctx); + return SHOUTERR_UNSUPPORTED; +} + +#ifndef XXX_HAVE_X509_check_host +static inline int tls_check_pattern(const char *key, const char *pattern) +{ + for (; *key && *pattern; key++) { + if (*pattern == '*') { + for (; *pattern == '*'; pattern++); + for (; *key && *key != '.'; key++); + if (!*pattern && !*key) + return 1; + if (!*pattern || !*key) + return 0; + } + + if (tolower(*key) != tolower(*pattern)) + return 0; + pattern++; + } + + return *key == 0 && *pattern == 0; +} +static inline int tls_check_host(X509 *cert, const char *hostname) +{ + char common_name[256] = ""; + X509_NAME *xname = X509_get_subject_name(cert); + X509_NAME_ENTRY *xentry; + ASN1_STRING *sdata; + int i, j; + int ret; + + ret = X509_NAME_get_text_by_NID(xname, NID_commonName, common_name, sizeof(common_name)); + if (ret < 1 || (size_t)ret >= (sizeof(common_name)-1)) + return SHOUTERR_TLSBADCERT; + + if (!tls_check_pattern(hostname, common_name)) + return SHOUTERR_TLSBADCERT; + + /* check for inlined \0, see https://www.blackhat.com/html/bh-usa-09/bh-usa-09-archives.html#Marlinspike */ + for (i = -1; ; i = j) { + j = X509_NAME_get_index_by_NID(xname, NID_commonName, i); + if (j == -1) + break; + } + + xentry = X509_NAME_get_entry(xname, i); + sdata = X509_NAME_ENTRY_get_data(xentry); + + if ((size_t)ASN1_STRING_length(sdata) != strlen(common_name)) + return SHOUTERR_TLSBADCERT; + + return SHOUTERR_SUCCESS; +} +#endif + +static inline int tls_check_cert(shout_tls_t *tls) +{ + X509 *cert = SSL_get_peer_certificate(tls->ssl); + int cert_ok = 0; + if (!cert) + return SHOUTERR_TLSBADCERT; + + do { + if (SSL_get_verify_result(tls->ssl) != X509_V_OK) + break; + +#ifdef XXX_HAVE_X509_check_host + if (X509_check_host(cert, tls->host, 0, 0, NULL) != 1) + break; +#else + if (tls_check_host(cert, tls->host) != SHOUTERR_SUCCESS) + break; +#endif + + /* ok, all test passed... */ + cert_ok = 1; + } while (0); + + X509_free(cert); + return cert_ok ? SHOUTERR_SUCCESS : SHOUTERR_TLSBADCERT; +} + +static inline int tls_setup_process(shout_tls_t *tls) +{ + if (SSL_is_init_finished(tls->ssl)) + return tls_check_cert(tls); + tls->ssl_ret = SSL_connect(tls->ssl); + if (SSL_is_init_finished(tls->ssl)) + return tls_check_cert(tls); + return SHOUTERR_BUSY; +} + +int shout_tls_try_connect(shout_tls_t *tls) +{ + if (!tls->ssl) + tls_setup(tls); + if (tls->ssl) + return tls_setup_process(tls); + return SHOUTERR_UNSUPPORTED; +} +int shout_tls_close(shout_tls_t *tls) { + if (tls->ssl) { + SSL_shutdown(tls->ssl); + SSL_free(tls->ssl); + } + if (tls->ssl_ctx) + SSL_CTX_free(tls->ssl_ctx); + free(tls); + return SHOUTERR_SUCCESS; +} + +ssize_t shout_tls_read(shout_tls_t *tls, void *buf, size_t len) +{ + return tls->ssl_ret = SSL_read(tls->ssl, buf, len); +} + +ssize_t shout_tls_write(shout_tls_t *tls, const void *buf, size_t len) +{ + return tls->ssl_ret = SSL_write(tls->ssl, buf, len); +} + +int shout_tls_recoverable(shout_tls_t *tls) +{ + int error = SSL_get_error(tls->ssl, tls->ssl_ret); + if (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE) + return 1; + return 0; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/util.c mixxx-2.2.4~dfsg/lib/libshout/src/util.c --- mixxx-2.2.3~dfsg/lib/libshout/src/util.c 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/util.c 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,328 @@ +/* util.c: libshout utility/portability functions + * + * Copyright (C) 2002-2003 the Icecast team , + * Copyright (C) 2012 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#endif + +#include +#include "util.h" + +char *_shout_util_strdup(const char *s) +{ + if (!s) + return NULL; + + return strdup(s); +} + +int _shout_util_read_header(int sock, char *buff, unsigned long len) +{ + int read_bytes, ret; + unsigned long pos; + char c; + + read_bytes = 1; + pos = 0; + ret = 0; + + while ((read_bytes == 1) && (pos < (len - 1))) { + read_bytes = 0; + + if ((read_bytes = recv(sock, &c, 1, 0))) { + if (c != '\r') + buff[pos++] = c; + if ((pos > 1) && (buff[pos - 1] == '\n' && buff[pos - 2] == '\n')) { + ret = 1; + break; + } + } else { + break; + } + } + + if (ret) buff[pos] = '\0'; + + return ret; +} + +static char base64table[65] = { + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', + 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', + 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', + 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/', +}; + +/* This isn't efficient, but it doesn't need to be */ +char *_shout_util_base64_encode(char *data) +{ + int len = strlen(data); + char *out = malloc(len*4/3 + 4); + char *result = out; + int chunk; + + while(len > 0) { + chunk = (len >3)?3:len; + *out++ = base64table[(*data & 0xFC)>>2]; + *out++ = base64table[((*data & 0x03)<<4) | ((*(data+1) & 0xF0) >> 4)]; + + switch(chunk) { + case 3: + *out++ = base64table[((*(data+1) & 0x0F)<<2) | ((*(data+2) & 0xC0)>>6)]; + *out++ = base64table[(*(data+2)) & 0x3F]; + break; + case 2: + *out++ = base64table[((*(data+1) & 0x0F)<<2)]; + *out++ = '='; + break; + case 1: + *out++ = '='; + *out++ = '='; + break; + } + data += chunk; + len -= chunk; + } + *out = 0; + + return result; +} + +static char urltable[16] = { + '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' +}; + +static char safechars[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +/* modified from libshout1, which credits Rick Franchuk . + * Caller must free result. */ +char *_shout_util_url_encode(const char *data) { + const char *p; + char *q, *dest; + int digit; + size_t n; + + for (p = data, n = 0; *p; p++) { + n++; + if (!safechars[(unsigned char)(*p)]) + n += 2; + } + if (!(dest = malloc(n+1))) + return NULL; + + for (p = data, q = dest; *p; p++, q++) { + if (safechars[(unsigned char)(*p)]) { + *q = *p; + } else { + *q++ = '%'; + digit = (*p >> 4) & 0xF; + *q++ = urltable[digit]; + digit = *p & 0xf; + *q = urltable[digit]; + n += 2; + } + } + *q = '\0'; + + return dest; +} + +util_dict *_shout_util_dict_new(void) +{ + return (util_dict *)calloc(1, sizeof(util_dict)); +} + +void _shout_util_dict_free(util_dict *dict) +{ + util_dict *next; + + while (dict) { + next = dict->next; + + if (dict->key) + free (dict->key); + if (dict->val) + free (dict->val); + free (dict); + + dict = next; + } +} + +const char *_shout_util_dict_get(util_dict *dict, const char *key) +{ + while (dict) { + if (dict->key && !strcmp(key, dict->key)) + return dict->val; + dict = dict->next; + } + + return NULL; +} + +int _shout_util_dict_set(util_dict *dict, const char *key, const char *val) +{ + util_dict *prev; + + if (!dict || !key) + return SHOUTERR_INSANE; + + prev = NULL; + while (dict) { + if (!dict->key || !strcmp(dict->key, key)) + break; + prev = dict; + dict = dict->next; + } + + if (!dict) { + dict = _shout_util_dict_new(); + if (!dict) + return SHOUTERR_MALLOC; + if (prev) + prev->next = dict; + } + + if (dict->key) + free (dict->val); + else if (!(dict->key = strdup(key))) { + if (prev) + prev->next = NULL; + _shout_util_dict_free (dict); + + return SHOUTERR_MALLOC; + } + + dict->val = strdup(val); + if (!dict->val) { + return SHOUTERR_MALLOC; + } + + return SHOUTERR_SUCCESS; +} + +/* given a dictionary, URL-encode each key and val and stringify them in order as + key=val&key=val... if val is set, or just key&key if val is NULL. + TODO: Memory management needs overhaul. */ +char *_shout_util_dict_urlencode(util_dict *dict, char delim) +{ + size_t reslen, resoffset; + char *res, *tmp; + char *enc; + int start = 1; + + for (res = NULL; dict; dict = dict->next) { + /* encode key */ + if (!dict->key) + continue; + if (!(enc = _shout_util_url_encode(dict->key))) { + if (res) + free(res); + return NULL; + } + if (start) { + reslen = strlen(enc) + 1; + if (!(res = malloc(reslen))) { + free(enc); + return NULL; + } + snprintf(res, reslen, "%s", enc); + free(enc); + start = 0; + } else { + resoffset = strlen(res); + reslen = resoffset + strlen(enc) + 2; + if (!(tmp = realloc(res, reslen))) { + free(enc); + free(res); + return NULL; + } else + res = tmp; + snprintf(res + resoffset, reslen - resoffset, "%c%s", delim, enc); + free(enc); + } + + /* encode value */ + if (!dict->val) + continue; + if (!(enc = _shout_util_url_encode(dict->val))) { + free(res); + return NULL; + } + + resoffset = strlen(res); + reslen = resoffset + strlen(enc) + 2; + if (!(tmp = realloc(res, reslen))) { + free(enc); + free(res); + return NULL; + } else + res = tmp; + snprintf(res + resoffset, reslen - resoffset, "=%s", enc); + free(enc); + } + + return res; +} + +const char *_shout_util_dict_next(util_dict **dict, const char **key, const char **val) { + *key = NULL; + *val = NULL; + + if (!dict) + return NULL; + *dict = (*dict)->next; + while (*dict && !(*dict)->key) + *dict = (*dict)->next; + if (!*dict) + return NULL; + *key = (*dict)->key; + *val = (*dict)->val; + return *key; +} diff -Nru mixxx-2.2.3~dfsg/lib/libshout/src/util.h mixxx-2.2.4~dfsg/lib/libshout/src/util.h --- mixxx-2.2.3~dfsg/lib/libshout/src/util.h 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/src/util.h 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,50 @@ +/* util.h: libshout utility/portability functions + * + * Copyright (C) 2002-2004 the Icecast team , + * Copyright (C) 2012 Philipp "ph3-der-loewe" Schafft + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef __LIBSHOUT_UTIL_H__ +#define __LIBSHOUT_UTIL_H__ + +/* String dictionary type, without support for NULL keys, or multiple + * instances of the same key */ +typedef struct _util_dict { + char *key; + char *val; + struct _util_dict *next; +} util_dict; + +char *_shout_util_strdup(const char *s); + +util_dict *_shout_util_dict_new(void); +void _shout_util_dict_free(util_dict *dict); +/* dict, key must not be NULL. */ +int _shout_util_dict_set(util_dict *dict, const char *key, const char *val); +const char *_shout_util_dict_get(util_dict *dict, const char *key); +char *_shout_util_dict_urlencode(util_dict *dict, char delim); + +const char *_shout_util_dict_next(util_dict **dict, const char **key, const char **val); +#define _SHOUT_DICT_FOREACH(init,var,keyvar,valvar) for ((var) = (init), (keyvar) = (var)->key ? (var)->key : _shout_util_dict_next(&(var), &(keyvar), &(valvar)), (valvar) = (var)->val; (var); _shout_util_dict_next(&(var), &(keyvar), &(valvar))) + +char *_shout_util_base64_encode(char *data); +char *_shout_util_url_encode(const char *data); +int _shout_util_read_header(int sock, char *buff, unsigned long len); + +#endif /* __LIBSHOUT_UTIL_H__ */ diff -Nru mixxx-2.2.3~dfsg/lib/libshout/win32/libshout.dsp mixxx-2.2.4~dfsg/lib/libshout/win32/libshout.dsp --- mixxx-2.2.3~dfsg/lib/libshout/win32/libshout.dsp 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/win32/libshout.dsp 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,172 @@ +# Microsoft Developer Studio Project File - Name="libshout" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libshout - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libshout.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libshout.mak" CFG="libshout - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libshout - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libshout - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libshout - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /I "../include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /D VERSION=\"2.4.1\" /D LIBSHOUT_MAJOR=2 /D LIBSHOUT_MINOR=0 /D LIBSHOUT_MICRO=0 /D "HAVE_WINSOCK2_H" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "libshout - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\src" /I "..\src/httpp" /I "..\src/thread" /I "..\src/log" /I "..\src/avl" /I "..\src/net" /I "..\src/timings" /I "../" /I "../../pthreads" /I "../../oggvorbis-win32sdk-1.0.1/include" /I "../include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "_WIN32" /D VERSION=\"2.0.0\" /D LIBSHOUT_MAJOR=2 /D LIBSHOUT_MINOR=0 /D LIBSHOUT_MICRO=0 /D "HAVE_WINSOCK2_H" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "libshout - Win32 Release" +# Name "libshout - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\src\avl\avl.c +# End Source File +# Begin Source File + +SOURCE=..\src\avl\avl.h +# End Source File +# Begin Source File + +SOURCE=..\src\httpp\httpp.c +# End Source File +# Begin Source File + +SOURCE=..\src\httpp\httpp.h +# End Source File +# Begin Source File + +SOURCE=..\src\mp3.c +# End Source File +# Begin Source File + +SOURCE=..\src\ogg.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\resolver.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\resolver.h +# End Source File +# Begin Source File + +SOURCE=..\src\shout.c +# End Source File +# Begin Source File + +SOURCE=..\src\shout_private.h +# End Source File +# Begin Source File + +SOURCE=..\src\net\sock.c +# End Source File +# Begin Source File + +SOURCE=..\src\net\sock.h +# End Source File +# Begin Source File + +SOURCE=..\src\thread\thread.c +# End Source File +# Begin Source File + +SOURCE=..\src\thread\thread.h +# End Source File +# Begin Source File + +SOURCE=..\src\timing\timing.c +# End Source File +# Begin Source File + +SOURCE=..\src\timing\timing.h +# End Source File +# Begin Source File + +SOURCE=..\src\util.c +# End Source File +# Begin Source File + +SOURCE=..\src\util.h +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\include\os.h +# End Source File +# Begin Source File + +SOURCE=..\include\shout\shout.h +# End Source File +# End Group +# End Target +# End Project diff -Nru mixxx-2.2.3~dfsg/lib/libshout/win32/libshout.dsw mixxx-2.2.4~dfsg/lib/libshout/win32/libshout.dsw --- mixxx-2.2.3~dfsg/lib/libshout/win32/libshout.dsw 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/win32/libshout.dsw 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "libshout"=.\libshout.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -Nru mixxx-2.2.3~dfsg/lib/libshout/win32/Makefile.am mixxx-2.2.4~dfsg/lib/libshout/win32/Makefile.am --- mixxx-2.2.3~dfsg/lib/libshout/win32/Makefile.am 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/lib/libshout/win32/Makefile.am 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,6 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign + +EXTRA_DIST = libshout.dsp libshout.dsw + diff -Nru mixxx-2.2.3~dfsg/res/controllers/common-controller-scripts.js mixxx-2.2.4~dfsg/res/controllers/common-controller-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/common-controller-scripts.js 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/common-controller-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -268,13 +268,13 @@ if (!max) { max = 127 } - var center = (max - min) / 2 - var result + var center = (max - min) / 2; + var result; - if (value == mid) { - return center + if (value === mid) { + return center; } else if (value < mid) { - result = (center / (mid - low)) * (value - low) + result = (center / (mid - low)) * (value - low); } else { result = center + (center / (high - mid)) * (value - mid) } @@ -405,8 +405,9 @@ bpm = function() { } -bpm.tapTime = 0.0 -bpm.tap = [] // Tap sample values +bpm.tapTime = 0.0; +bpm.previousTapDelta = 0.0; +bpm.tap = []; // Tap sample values /* -------- ------------------------------------------------------ bpm.tapButton @@ -418,29 +419,51 @@ Output: - -------- ------------------------------------------------------ */ bpm.tapButton = function(deck) { - var now = new Date() / 1000 // Current time in seconds - var tapDelta = now - bpm.tapTime - bpm.tapTime = now - if (tapDelta > 2.0) { // reset if longer than two seconds between taps - bpm.tap = [] - return - } - bpm.tap.push(60 / tapDelta) - if (bpm.tap.length > 8) bpm.tap.shift() // Keep the last 8 samples for averaging - var sum = 0 - for (i = 0; i < bpm.tap.length; i++) { - sum += bpm.tap[i] + var now = new Date() / 1000; // Current time in seconds + var tapDelta = now - bpm.tapTime; + bpm.tapTime = now; + + // assign tapDelta in cases where the button has not been pressed previously + if (bpm.tap.length < 1) { + bpm.previousTapDelta = tapDelta; + } + // reset if longer than two seconds between taps + if (tapDelta > 2.0) { + bpm.tap = []; + return; + } + // reject occurences of accidental double or missed taps + // a tap is considered missed when the delta of this press is 80% longer than the previous one + // and a tap is considered double when the delta is shorter than 40% of the previous one. + // these numbers are just guesses that produced good results in practice + if ((tapDelta > bpm.previousTapDelta * 1.8)||(tapDelta < bpm.previousTapDelta * 0.6)) { + return; + } + bpm.previousTapDelta = tapDelta; + bpm.tap.push(60 / tapDelta); + // Keep the last 8 samples for averaging + if (bpm.tap.length > 8) bpm.tap.shift(); + var sum = 0; + for (i=0; i //////////////////////////////////////////////////////////////////////// - var DenonMC6000MK2 = {}; //////////////////////////////////////////////////////////////////////// @@ -109,21 +97,21 @@ // Logging functions // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.logDebug = function (msg) { +DenonMC6000MK2.logDebug = function(msg) { if (DenonMC6000MK2.debug) { print("[" + DenonMC6000MK2.id + " DEBUG] " + msg); } }; -DenonMC6000MK2.logInfo = function (msg) { +DenonMC6000MK2.logInfo = function(msg) { print("[" + DenonMC6000MK2.id + " INFO] " + msg); }; -DenonMC6000MK2.logWarning = function (msg) { +DenonMC6000MK2.logWarning = function(msg) { print("[" + DenonMC6000MK2.id + " WARNING] " + msg); }; -DenonMC6000MK2.logError = function (msg) { +DenonMC6000MK2.logError = function(msg) { print("[" + DenonMC6000MK2.id + " ERROR] " + msg); }; @@ -135,15 +123,15 @@ DenonMC6000MK2.MIDI_BUTTON_ON = 0x40; DenonMC6000MK2.MIDI_BUTTON_OFF = 0x00; -DenonMC6000MK2.isButtonPressed = function (midiValue) { +DenonMC6000MK2.isButtonPressed = function(midiValue) { switch (midiValue) { - case DenonMC6000MK2.MIDI_BUTTON_ON: - return true; - case DenonMC6000MK2.MIDI_BUTTON_OFF: - return false; - default: - DenonMC6000MK2.logError("Unexpected MIDI button value: " + midiValue); - return undefined; + case DenonMC6000MK2.MIDI_BUTTON_ON: + return true; + case DenonMC6000MK2.MIDI_BUTTON_OFF: + return false; + default: + DenonMC6000MK2.logError("Unexpected MIDI button value: " + midiValue); + return undefined; } }; @@ -155,15 +143,15 @@ DenonMC6000MK2.MIDI_KNOB_INC = 0x00; DenonMC6000MK2.MIDI_KNOB_DEC = 0x7F; -DenonMC6000MK2.getKnobDelta = function (midiValue) { +DenonMC6000MK2.getKnobDelta = function(midiValue) { switch (midiValue) { - case DenonMC6000MK2.MIDI_KNOB_INC: - return 1; - case DenonMC6000MK2.MIDI_KNOB_DEC: - return -1; - default: - DenonMC6000MK2.logError("Unexpected MIDI knob value: " + midiValue); - return 0; + case DenonMC6000MK2.MIDI_KNOB_INC: + return 1; + case DenonMC6000MK2.MIDI_KNOB_DEC: + return -1; + default: + DenonMC6000MK2.logError("Unexpected MIDI knob value: " + midiValue); + return 0; } }; @@ -175,25 +163,25 @@ DenonMC6000MK2.MIDI_LED_ON = 0x50; DenonMC6000MK2.MIDI_LED_OFF = 0x51; -DenonMC6000MK2.LedState = function (midiCtrl) { +DenonMC6000MK2.LedState = function(midiCtrl) { this.midiCtrl = midiCtrl; }; DenonMC6000MK2.LED_ON = new DenonMC6000MK2.LedState(DenonMC6000MK2.MIDI_LED_ON); DenonMC6000MK2.LED_OFF = new DenonMC6000MK2.LedState(DenonMC6000MK2.MIDI_LED_OFF); -DenonMC6000MK2.Led = function (midiChannel, midiValue) { +DenonMC6000MK2.Led = function(midiChannel, midiValue) { this.midiChannel = midiChannel; this.midiValue = midiValue; this.state = undefined; }; -DenonMC6000MK2.Led.prototype.setState = function (ledState) { +DenonMC6000MK2.Led.prototype.setState = function(ledState) { this.state = ledState; this.trigger(); }; -DenonMC6000MK2.Led.prototype.setStateBoolean = function (booleanValue) { +DenonMC6000MK2.Led.prototype.setStateBoolean = function(booleanValue) { if (booleanValue) { this.setState(DenonMC6000MK2.LED_ON); } else { @@ -201,11 +189,11 @@ } }; -DenonMC6000MK2.Led.prototype.trigger = function () { +DenonMC6000MK2.Led.prototype.trigger = function() { midi.sendShortMsg(0xB0 + this.midiChannel, this.state.midiCtrl, this.midiValue); }; -DenonMC6000MK2.Led.prototype.reset = function () { +DenonMC6000MK2.Led.prototype.reset = function() { this.setStateBoolean(false); }; @@ -213,7 +201,7 @@ DenonMC6000MK2.MIDI_TRI_LED_OFF = 0x4B; DenonMC6000MK2.MIDI_TRI_LED_BLINK = 0x4C; -DenonMC6000MK2.TriLedState = function (midiCtrl) { +DenonMC6000MK2.TriLedState = function(midiCtrl) { this.midiCtrl = midiCtrl; }; @@ -221,18 +209,18 @@ DenonMC6000MK2.TRI_LED_OFF = new DenonMC6000MK2.TriLedState(DenonMC6000MK2.MIDI_TRI_LED_OFF); DenonMC6000MK2.TRI_LED_BLINK = new DenonMC6000MK2.TriLedState(DenonMC6000MK2.MIDI_TRI_LED_BLINK); -DenonMC6000MK2.TriLed = function (midiChannel, midiValue) { +DenonMC6000MK2.TriLed = function(midiChannel, midiValue) { this.midiChannel = midiChannel; this.midiValue = midiValue; this.state = undefined; }; -DenonMC6000MK2.TriLed.prototype.setTriState = function (ledState) { +DenonMC6000MK2.TriLed.prototype.setTriState = function(ledState) { this.state = ledState; this.trigger(); }; -DenonMC6000MK2.TriLed.prototype.setStateBoolean = function (booleanValue) { +DenonMC6000MK2.TriLed.prototype.setStateBoolean = function(booleanValue) { if (booleanValue) { this.setTriState(DenonMC6000MK2.TRI_LED_ON); } else { @@ -240,31 +228,31 @@ } }; -DenonMC6000MK2.TriLed.prototype.trigger = function () { +DenonMC6000MK2.TriLed.prototype.trigger = function() { midi.sendShortMsg(0xB0 + this.midiChannel, this.state.midiCtrl, this.midiValue); }; -DenonMC6000MK2.TriLed.prototype.reset = function () { +DenonMC6000MK2.TriLed.prototype.reset = function() { this.setStateBoolean(false); }; DenonMC6000MK2.connectedLeds = []; -DenonMC6000MK2.connectLed = function (midiChannel, midiValue) { +DenonMC6000MK2.connectLed = function(midiChannel, midiValue) { var led = new DenonMC6000MK2.Led(midiChannel, midiValue); led.reset(); DenonMC6000MK2.connectedLeds.push(led); return led; }; -DenonMC6000MK2.connectTriLed = function (midiChannel, midiValue) { +DenonMC6000MK2.connectTriLed = function(midiChannel, midiValue) { var led = new DenonMC6000MK2.TriLed(midiChannel, midiValue); led.reset(); DenonMC6000MK2.connectedLeds.push(led); return led; }; -DenonMC6000MK2.disconnectLeds = function () { +DenonMC6000MK2.disconnectLeds = function() { for (var index in DenonMC6000MK2.connectedLeds) { DenonMC6000MK2.connectedLeds[index].reset(); } @@ -276,14 +264,14 @@ // Controls // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.Control = function (group, ctrl, func) { +DenonMC6000MK2.Control = function(group, ctrl, func) { this.group = group; this.ctrl = ctrl; this.func = func; this.isConnected = false; }; -DenonMC6000MK2.Control.prototype.connect = function () { +DenonMC6000MK2.Control.prototype.connect = function() { if (this.isConnected) { DenonMC6000MK2.logWarning("Control is already connected: group=" + this.group + ", ctrl=" + this.ctrl + ", func=" + this.func); return true; @@ -297,7 +285,7 @@ return this.isConnected; }; -DenonMC6000MK2.Control.prototype.disconnect = function () { +DenonMC6000MK2.Control.prototype.disconnect = function() { if (this.isConnected) { if (engine.connectControl(this.group, this.ctrl, this.func, true)) { this.isConnected = false; @@ -309,13 +297,13 @@ } }; -DenonMC6000MK2.Control.prototype.trigger = function () { +DenonMC6000MK2.Control.prototype.trigger = function() { engine.trigger(this.group, this.ctrl); }; DenonMC6000MK2.connectedControls = []; -DenonMC6000MK2.connectControl = function (group, ctrl, func) { +DenonMC6000MK2.connectControl = function(group, ctrl, func) { var control = new DenonMC6000MK2.Control(group, ctrl, func); if (control.connect()) { DenonMC6000MK2.connectedControls.push(control); @@ -325,7 +313,7 @@ } }; -DenonMC6000MK2.disconnectControls = function () { +DenonMC6000MK2.disconnectControls = function() { for (var index in DenonMC6000MK2.connectedControls) { DenonMC6000MK2.connectedControls[index].disconnect(); } @@ -341,7 +329,7 @@ DenonMC6000MK2.samplersByGroup = {}; -DenonMC6000MK2.getSamplerByGroup = function (group) { +DenonMC6000MK2.getSamplerByGroup = function(group) { var sampler = DenonMC6000MK2.samplersByGroup[group]; if (undefined === sampler) { DenonMC6000MK2.logError("No sampler found for " + group); @@ -349,7 +337,7 @@ return sampler; }; -DenonMC6000MK2.Sampler = function (side, midiChannel, midiLedValue, midiDimmerLedValue) { +DenonMC6000MK2.Sampler = function(side, midiChannel, midiLedValue, midiDimmerLedValue) { this.side = side; this.number = ++DenonMC6000MK2.samplerCount; this.group = "[Sampler" + this.number + "]"; @@ -359,67 +347,67 @@ DenonMC6000MK2.samplersByGroup[this.group] = this; }; -DenonMC6000MK2.Sampler.prototype.isTrackLoaded = function () { +DenonMC6000MK2.Sampler.prototype.isTrackLoaded = function() { return DenonMC6000MK2.isTrackLoaded(engine.getValue(this.group, "track_samples")); }; -DenonMC6000MK2.Sampler.prototype.loadSelectedTrack = function () { +DenonMC6000MK2.Sampler.prototype.loadSelectedTrack = function() { engine.setValue(this.group, "LoadSelectedTrack", true); }; -DenonMC6000MK2.Sampler.prototype.loadSelectedTrackAndPlay = function () { +DenonMC6000MK2.Sampler.prototype.loadSelectedTrackAndPlay = function() { engine.setValue(this.group, "LoadSelectedTrackAndPlay", true); }; -DenonMC6000MK2.Sampler.prototype.isPlaying = function () { +DenonMC6000MK2.Sampler.prototype.isPlaying = function() { return engine.getValue(this.group, "play"); }; -DenonMC6000MK2.Sampler.prototype.onButton = function (isButtonPressed) { +DenonMC6000MK2.Sampler.prototype.onButton = function(isButtonPressed) { switch (DenonMC6000MK2.DEFAULT_SAMPLER_MODE) { - case DenonMC6000MK2.SAMPLER_MODE.TRIGGER: - if (isButtonPressed) { - if (this.isTrackLoaded()) { - if (this.side.getShiftState()) { - engine.setValue(this.group, "start_stop", true); - } else { - engine.setValue(this.group, "start_play", true); - } + case DenonMC6000MK2.SAMPLER_MODE.TRIGGER: + if (isButtonPressed) { + if (this.isTrackLoaded()) { + if (this.side.getShiftState()) { + engine.setValue(this.group, "start_stop", true); } else { - this.loadSelectedTrack(); + engine.setValue(this.group, "start_play", true); } + } else { + this.loadSelectedTrack(); } - break; - case DenonMC6000MK2.SAMPLER_MODE.HOLD: - if (this.isTrackLoaded()) { - if (isButtonPressed) { - if (this.side.getShiftState()) { - engine.setValue(this.group, "eject", true); - } else { - engine.setValue(this.group, "start_play", true); - } + } + break; + case DenonMC6000MK2.SAMPLER_MODE.HOLD: + if (this.isTrackLoaded()) { + if (isButtonPressed) { + if (this.side.getShiftState()) { + engine.setValue(this.group, "eject", true); } else { - // continue playing if shift is pressed when - // releasing the pressed button - if (!this.side.getShiftState()) { - engine.setValue(this.group, "start_stop", true); - } + engine.setValue(this.group, "start_play", true); } } else { - if (isButtonPressed) { - this.loadSelectedTrack(); + // continue playing if shift is pressed when + // releasing the pressed button + if (!this.side.getShiftState()) { + engine.setValue(this.group, "start_stop", true); } } - break; + } else { + if (isButtonPressed) { + this.loadSelectedTrack(); + } + } + break; } }; -DenonMC6000MK2.Sampler.prototype.connectLeds = function () { +DenonMC6000MK2.Sampler.prototype.connectLeds = function() { this.led = DenonMC6000MK2.connectTriLed(this.midiChannel, this.midiLedValue); this.dimmerLed = DenonMC6000MK2.connectTriLed(this.midiChannel, this.midiDimmerLedValue); }; -DenonMC6000MK2.Sampler.prototype.updateLeds = function () { +DenonMC6000MK2.Sampler.prototype.updateLeds = function() { if (this.isPlaying()) { this.led.setStateBoolean(true); } else { @@ -427,7 +415,7 @@ } }; -DenonMC6000MK2.Sampler.prototype.connectControls = function () { +DenonMC6000MK2.Sampler.prototype.connectControls = function() { DenonMC6000MK2.connectControl(this.group, "play", DenonMC6000MK2.ctrlSampler); DenonMC6000MK2.connectControl(this.group, "track_samples", DenonMC6000MK2.ctrlSampler); }; @@ -441,7 +429,7 @@ DenonMC6000MK2.decksByGroup = {}; -DenonMC6000MK2.getDeckByGroup = function (group) { +DenonMC6000MK2.getDeckByGroup = function(group) { var deck = DenonMC6000MK2.decksByGroup[group]; if (undefined === deck) { DenonMC6000MK2.logError("No deck found for " + group); @@ -451,7 +439,7 @@ /* Constructor */ -DenonMC6000MK2.OldDeck = function (number, midiChannel) { +DenonMC6000MK2.OldDeck = function(number, midiChannel) { this.side = undefined; this.number = number; this.group = "[Channel" + number + "]"; @@ -467,105 +455,105 @@ /* Shift */ -DenonMC6000MK2.OldDeck.prototype.getShiftState = function (group) { +DenonMC6000MK2.OldDeck.prototype.getShiftState = function(_group) { return this.side.getShiftState(); }; /* Values & Parameters */ -DenonMC6000MK2.OldDeck.prototype.getValue = function (key) { +DenonMC6000MK2.OldDeck.prototype.getValue = function(key) { return engine.getValue(this.group, key); }; -DenonMC6000MK2.OldDeck.prototype.setValue = function (key, value) { +DenonMC6000MK2.OldDeck.prototype.setValue = function(key, value) { engine.setValue(this.group, key, value); }; -DenonMC6000MK2.OldDeck.prototype.toggleValue = function (key) { +DenonMC6000MK2.OldDeck.prototype.toggleValue = function(key) { this.setValue(key, !this.getValue(key)); }; -DenonMC6000MK2.OldDeck.prototype.setParameter = function (key, param) { +DenonMC6000MK2.OldDeck.prototype.setParameter = function(key, param) { engine.setParameter(this.group, key, param); }; -DenonMC6000MK2.OldDeck.prototype.triggerValue = function (key) { +DenonMC6000MK2.OldDeck.prototype.triggerValue = function(key) { engine.trigger(this.group, key); }; /* Xfader */ -DenonMC6000MK2.OldDeck.prototype.assignXfaderLeft = function () { +DenonMC6000MK2.OldDeck.prototype.assignXfaderLeft = function() { this.setValue("orientation", DenonMC6000MK2.MIXXX_XFADER_LEFT); }; -DenonMC6000MK2.OldDeck.prototype.assignXfaderCenter = function () { +DenonMC6000MK2.OldDeck.prototype.assignXfaderCenter = function() { this.setValue("orientation", DenonMC6000MK2.MIXXX_XFADER_CENTER); }; -DenonMC6000MK2.OldDeck.prototype.assignXfaderRight = function () { +DenonMC6000MK2.OldDeck.prototype.assignXfaderRight = function() { this.setValue("orientation", DenonMC6000MK2.MIXXX_XFADER_RIGHT); }; /* Tracks */ -DenonMC6000MK2.OldDeck.prototype.loadSelectedTrack = function () { +DenonMC6000MK2.OldDeck.prototype.loadSelectedTrack = function() { this.setValue("LoadSelectedTrack", true); if (!this.isPlaying()) { this.setCueMixSolo(); // just for convenience ;) } }; -DenonMC6000MK2.OldDeck.prototype.loadSelectedTrackAndPlay = function () { +DenonMC6000MK2.OldDeck.prototype.loadSelectedTrackAndPlay = function() { this.setValue("LoadSelectedTrackAndPlay", true); }; -DenonMC6000MK2.OldDeck.prototype.unloadTrack = function () { +DenonMC6000MK2.OldDeck.prototype.unloadTrack = function() { this.setValue("eject", true); }; /* Key Lock Mode */ -DenonMC6000MK2.OldDeck.prototype.onKeyLockButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onKeyLockButton = function(isButtonPressed) { if (isButtonPressed) { this.toggleValue("keylock"); } }; -DenonMC6000MK2.OldDeck.prototype.enableKeyLock = function () { +DenonMC6000MK2.OldDeck.prototype.enableKeyLock = function() { this.setValue("keylock", true); }; -DenonMC6000MK2.OldDeck.prototype.disableKeyLock = function () { +DenonMC6000MK2.OldDeck.prototype.disableKeyLock = function() { this.setValue("keylock", false); }; -DenonMC6000MK2.OldDeck.prototype.onKeyLockValue = function (value) { +DenonMC6000MK2.OldDeck.prototype.onKeyLockValue = function(value) { this.keyLockLed.setStateBoolean(value); }; /* Key Control */ -DenonMC6000MK2.OldDeck.prototype.resetKey = function () { +DenonMC6000MK2.OldDeck.prototype.resetKey = function() { this.setValue("reset_key", true); }; /* Sync Mode */ -DenonMC6000MK2.OldDeck.prototype.disableSyncMode = function () { +DenonMC6000MK2.OldDeck.prototype.disableSyncMode = function() { this.setValue("sync_mode", DenonMC6000MK2.MIXXX_SYNC_NONE); }; /* Cue Mix */ -DenonMC6000MK2.OldDeck.prototype.setCueMixSolo = function () { +DenonMC6000MK2.OldDeck.prototype.setCueMixSolo = function() { for (var deckGroup in DenonMC6000MK2.decksByGroup) { var deck = DenonMC6000MK2.getDeckByGroup(deckGroup); deck.setValue("pfl", this === deck); } }; -DenonMC6000MK2.OldDeck.prototype.onCueMixButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onCueMixButton = function(isButtonPressed) { if (isButtonPressed) { if (this.getShiftState()) { this.setCueMixSolo(); @@ -575,7 +563,7 @@ } }; -DenonMC6000MK2.OldDeck.prototype.updateCueMixValue = function (pflValue, isTrackLoaded) { +DenonMC6000MK2.OldDeck.prototype.updateCueMixValue = function(pflValue, isTrackLoaded) { if (pflValue) { this.cueMixLed.setStateBoolean(pflValue); } else { @@ -583,33 +571,33 @@ } }; -DenonMC6000MK2.OldDeck.prototype.onCueMixValue = function (pflValue) { +DenonMC6000MK2.OldDeck.prototype.onCueMixValue = function(pflValue) { this.updateCueMixValue(pflValue, this.isTrackLoaded()); }; /* Track Load */ -DenonMC6000MK2.isTrackLoaded = function (trackSamples) { +DenonMC6000MK2.isTrackLoaded = function(trackSamples) { return 0 < trackSamples; }; -DenonMC6000MK2.OldDeck.prototype.isTrackLoaded = function () { +DenonMC6000MK2.OldDeck.prototype.isTrackLoaded = function() { return DenonMC6000MK2.isTrackLoaded(this.getValue("track_samples")); }; -DenonMC6000MK2.OldDeck.prototype.onTrackSamplesValue = function (value) { +DenonMC6000MK2.OldDeck.prototype.onTrackSamplesValue = function(value) { this.updateCueMixValue(this.getValue("pfl"), DenonMC6000MK2.isTrackLoaded(value)); }; /* Cue & Play */ -DenonMC6000MK2.OldDeck.prototype.isPlaying = function () { +DenonMC6000MK2.OldDeck.prototype.isPlaying = function() { return this.getValue("play"); }; /* Pitch Bend / Track Search */ -DenonMC6000MK2.OldDeck.prototype.onBendPlusButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onBendPlusButton = function(isButtonPressed) { if (this.isPlaying()) { this.setValue("fwd", false); if (this.getShiftState()) { @@ -622,7 +610,7 @@ } }; -DenonMC6000MK2.OldDeck.prototype.onBendMinusButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onBendMinusButton = function(isButtonPressed) { if (this.isPlaying()) { this.setValue("back", false); if (this.getShiftState()) { @@ -638,35 +626,35 @@ /* Censor / Slip Mode */ -DenonMC6000MK2.OldDeck.prototype.onCensorButton = function (buttonPressed) { +DenonMC6000MK2.OldDeck.prototype.onCensorButton = function(buttonPressed) { if (this.getShiftState()) { // Please note that reverseroll seems to have side effects on // slip_enabled so better leave it alone while shift is pressed! if (buttonPressed) { - this.toggleValue('slip_enabled'); + this.toggleValue("slip_enabled"); } } else { - this.setValue('reverseroll', buttonPressed); + this.setValue("reverseroll", buttonPressed); } }; -DenonMC6000MK2.OldDeck.prototype.onSlipModeValue = function (value) { +DenonMC6000MK2.OldDeck.prototype.onSlipModeValue = function(value) { this.slipModeLed.setStateBoolean(value); }; /* Vinyl Mode (Scratching) */ -DenonMC6000MK2.OldDeck.prototype.onVinylModeValue = function () { +DenonMC6000MK2.OldDeck.prototype.onVinylModeValue = function() { this.vinylModeLed.setStateBoolean(this.vinylMode); }; -DenonMC6000MK2.OldDeck.prototype.enableScratching = function () { +DenonMC6000MK2.OldDeck.prototype.enableScratching = function() { }; -DenonMC6000MK2.OldDeck.prototype.disableScratching = function () { +DenonMC6000MK2.OldDeck.prototype.disableScratching = function() { }; -DenonMC6000MK2.OldDeck.prototype.updateVinylMode = function () { +DenonMC6000MK2.OldDeck.prototype.updateVinylMode = function() { if (this.vinylMode && this.jogTouchState) { engine.scratchEnable(this.number, DenonMC6000MK2.JOG_RESOLUTION, @@ -681,35 +669,35 @@ this.onVinylModeValue(); }; -DenonMC6000MK2.OldDeck.prototype.setVinylMode = function (vinylMode) { +DenonMC6000MK2.OldDeck.prototype.setVinylMode = function(vinylMode) { this.vinylMode = vinylMode; this.updateVinylMode(); }; -DenonMC6000MK2.OldDeck.prototype.toggleVinylMode = function () { +DenonMC6000MK2.OldDeck.prototype.toggleVinylMode = function() { this.setVinylMode(!this.vinylMode); }; -DenonMC6000MK2.OldDeck.prototype.enableVinylMode = function () { +DenonMC6000MK2.OldDeck.prototype.enableVinylMode = function() { this.setVinylMode(true); }; -DenonMC6000MK2.OldDeck.prototype.disableVinylMode = function () { +DenonMC6000MK2.OldDeck.prototype.disableVinylMode = function() { this.setVinylMode(false); }; -DenonMC6000MK2.OldDeck.prototype.onVinylButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onVinylButton = function(_isButtonPressed) { this.toggleVinylMode(); }; /* Jog Wheel */ -DenonMC6000MK2.OldDeck.prototype.touchJog = function (isJogTouched) { +DenonMC6000MK2.OldDeck.prototype.touchJog = function(isJogTouched) { this.jogTouchState = isJogTouched; this.updateVinylMode(); }; -DenonMC6000MK2.OldDeck.prototype.spinJog = function (jogDelta) { +DenonMC6000MK2.OldDeck.prototype.spinJog = function(jogDelta) { if (this.getShiftState() && this.jogTouchState && !this.isPlaying()) { // fast track seek (strip search) var playPos = engine.getValue(this.group, "playposition"); @@ -751,68 +739,68 @@ /* Filter */ -DenonMC6000MK2.OldDeck.prototype.applyFilter = function () { +DenonMC6000MK2.OldDeck.prototype.applyFilter = function() { engine.setValue(this.filterGroup, "enabled", this.side.filterEnabled); engine.setParameter(this.filterGroup, "meta", this.side.filterParam); }; /* Loops */ -DenonMC6000MK2.OldDeck.prototype.hasLoopStart = function () { +DenonMC6000MK2.OldDeck.prototype.hasLoopStart = function() { return DenonMC6000MK2.MIXXX_LOOP_POSITION_UNDEFINED !== this.getValue("loop_start_position"); }; -DenonMC6000MK2.OldDeck.prototype.hasLoopEnd = function () { +DenonMC6000MK2.OldDeck.prototype.hasLoopEnd = function() { return DenonMC6000MK2.MIXXX_LOOP_POSITION_UNDEFINED !== this.getValue("loop_end_position"); }; -DenonMC6000MK2.OldDeck.prototype.hasLoop = function () { +DenonMC6000MK2.OldDeck.prototype.hasLoop = function() { return this.hasLoopStart() && this.hasLoopEnd() && this.getValue("loop_start_position") < this.getValue("loop_end_position"); }; -DenonMC6000MK2.OldDeck.prototype.deleteLoopStart = function () { +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 () { +DenonMC6000MK2.OldDeck.prototype.deleteLoopEnd = function() { this.setValue("loop_out", false); this.setValue("loop_end_position", DenonMC6000MK2.MIXXX_LOOP_POSITION_UNDEFINED); }; -DenonMC6000MK2.OldDeck.prototype.deleteLoop = function () { +DenonMC6000MK2.OldDeck.prototype.deleteLoop = function() { // loop end has to be deleted before loop start this.deleteLoopEnd(); this.deleteLoopStart(); }; -DenonMC6000MK2.OldDeck.prototype.onAutoLoopButton = function (isButtonPressed) { - if (this.hasLoop() || this.getValue('loop_enabled')) { +DenonMC6000MK2.OldDeck.prototype.onAutoLoopButton = function(isButtonPressed) { + if (this.hasLoop() || this.getValue("loop_enabled")) { if (this.getShiftState()) { // Delete loop - this.setValue('reloop_toggle', false); + this.setValue("reloop_toggle", false); if (isButtonPressed) { this.deleteLoop(); } } else { // Reloop - this.setValue('reloop_toggle', isButtonPressed); + this.setValue("reloop_toggle", isButtonPressed); } } else { // Autoloop - this.setValue('reloop_toggle', false); + this.setValue("reloop_toggle", false); this.deleteLoop(); // cleanup if (isButtonPressed) { if (this.getShiftState()) { - this.setValue('beatlooproll_activate', true); + this.setValue("beatlooproll_activate", true); } else { - this.setValue('beatloop_activate', true); + this.setValue("beatloop_activate", true); } } } }; -DenonMC6000MK2.OldDeck.prototype.onLoopInButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onLoopInButton = function(isButtonPressed) { if (this.getShiftState()) { this.setValue("loop_in", false); if (isButtonPressed) { @@ -823,7 +811,7 @@ } }; -DenonMC6000MK2.OldDeck.prototype.onLoopOutButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onLoopOutButton = function(isButtonPressed) { if (this.getShiftState()) { this.setValue("loop_out", false); if (isButtonPressed) { @@ -834,35 +822,35 @@ } }; -DenonMC6000MK2.OldDeck.prototype.onLoopCutMinusButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onLoopCutMinusButton = function(isButtonPressed) { if (isButtonPressed) { if (this.getShiftState()) { - var step_size = this.getValue('beatloop_size'); - if (step_size <= 0.0) { - step_size = 1; + var stepSize = this.getValue("beatloop_size"); + if (stepSize <= 0.0) { + stepSize = 1; } - this.setValue("loop_move_" + step_size + "_backward", true); + this.setValue("loop_move_" + stepSize + "_backward", true); } else { this.setValue("loop_halve", true); } } }; -DenonMC6000MK2.OldDeck.prototype.onLoopCutPlusButton = function (isButtonPressed) { +DenonMC6000MK2.OldDeck.prototype.onLoopCutPlusButton = function(isButtonPressed) { if (isButtonPressed) { if (this.getShiftState()) { - var step_size = this.getValue('beatloop_size'); - if (step_size <= 0.0) { - step_size = 1; + var stepSize = this.getValue("beatloop_size"); + if (stepSize <= 0.0) { + stepSize = 1; } - this.setValue("loop_move_" + step_size + "_forward", true); + this.setValue("loop_move_" + stepSize + "_forward", true); } else { this.setValue("loop_double", true); } } }; -DenonMC6000MK2.OldDeck.prototype.updateLoopLeds = function (value) { +DenonMC6000MK2.OldDeck.prototype.updateLoopLeds = function(_value) { if (this.getValue("loop_enabled")) { this.loopInLed.setTriState(DenonMC6000MK2.TRI_LED_BLINK); this.loopOutLed.setTriState(DenonMC6000MK2.TRI_LED_BLINK); @@ -876,17 +864,17 @@ /* Deck LEDs */ -DenonMC6000MK2.OldDeck.prototype.connectLed = function (midiValue) { +DenonMC6000MK2.OldDeck.prototype.connectLed = function(midiValue) { return DenonMC6000MK2.connectLed(this.midiChannel, midiValue); }; -DenonMC6000MK2.OldDeck.prototype.connectTriLed = function (midiValue) { +DenonMC6000MK2.OldDeck.prototype.connectTriLed = function(midiValue) { return DenonMC6000MK2.connectTriLed(this.midiChannel, midiValue); }; /* Startup */ -DenonMC6000MK2.OldDeck.prototype.connectLeds = function () { +DenonMC6000MK2.OldDeck.prototype.connectLeds = function() { this.vinylModeLed = this.connectTriLed(0x06); this.keyLockLed = this.connectTriLed(0x08); this.loopInLed = this.connectTriLed(0x24); @@ -898,11 +886,11 @@ this.slipModeLed = this.connectTriLed(0x64); }; -DenonMC6000MK2.OldDeck.prototype.connectControl = function (ctrl, func) { +DenonMC6000MK2.OldDeck.prototype.connectControl = function(ctrl, func) { return DenonMC6000MK2.connectControl(this.group, ctrl, func); }; -DenonMC6000MK2.OldDeck.prototype.connectControls = function () { +DenonMC6000MK2.OldDeck.prototype.connectControls = function() { this.connectControl("keylock", DenonMC6000MK2.ctrlKeyLock); this.connectControl("pfl", DenonMC6000MK2.ctrlCueMix); this.connectControl("track_samples", DenonMC6000MK2.ctrlTrackSamples); @@ -920,7 +908,7 @@ /* Shutdown */ -DenonMC6000MK2.OldDeck.prototype.restoreValues = function () { +DenonMC6000MK2.OldDeck.prototype.restoreValues = function() { this.setValue("rate_dir", this.rateDirBackup); }; @@ -931,14 +919,14 @@ DenonMC6000MK2.efxParamsByGroup = {}; -DenonMC6000MK2.ctrlEfxParamEnabled = function (value, group, control) { +DenonMC6000MK2.ctrlEfxParamEnabled = function(value, group, _control) { var param = DenonMC6000MK2.efxParamsByGroup[group]; if (param !== undefined) { param.onLed.setStateBoolean(value !== 0.0); } }; -DenonMC6000MK2.EfxParam = function (group) { +DenonMC6000MK2.EfxParam = function(group) { DenonMC6000MK2.efxParamsByGroup[group] = this; DenonMC6000MK2.connectControl(group, "enabled", DenonMC6000MK2.ctrlEfxParamEnabled); }; @@ -948,7 +936,7 @@ // Efx Units // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.EfxUnit = function (side, unit) { +DenonMC6000MK2.EfxUnit = function(side, unit) { this.side = side; this.unit = DenonMC6000MK2.EFX_RACK + "_" + unit; this.group = "[" + this.unit + "]"; @@ -958,37 +946,37 @@ this.params[3] = new DenonMC6000MK2.EfxParam("[" + this.unit + "_Effect3]"); }; -DenonMC6000MK2.EfxUnit.prototype.getShiftState = function () { +DenonMC6000MK2.EfxUnit.prototype.getShiftState = function() { return this.side.getShiftState(); }; -DenonMC6000MK2.EfxUnit.prototype.isEnabled = function () { +DenonMC6000MK2.EfxUnit.prototype.isEnabled = function() { return engine.getValue(this.group, "enabled"); }; -DenonMC6000MK2.EfxUnit.prototype.onEnableButton = function (isButtonPressed) { +DenonMC6000MK2.EfxUnit.prototype.onEnableButton = function(isButtonPressed) { if (isButtonPressed) { script.toggleControl(this.group, "enabled"); } }; -DenonMC6000MK2.EfxUnit.prototype.getDeckAssignKey = function (deck) { +DenonMC6000MK2.EfxUnit.prototype.getDeckAssignKey = function(deck) { return "group_" + deck.group + "_enable"; }; -DenonMC6000MK2.EfxUnit.prototype.connectDeckControls = function (deck, assignCB) { +DenonMC6000MK2.EfxUnit.prototype.connectDeckControls = function(deck, assignCB) { DenonMC6000MK2.connectControl(this.group, this.getDeckAssignKey(deck), assignCB); }; -DenonMC6000MK2.EfxUnit.prototype.isDeckAssigned = function (deck) { +DenonMC6000MK2.EfxUnit.prototype.isDeckAssigned = function(deck) { return engine.getValue(this.group, this.getDeckAssignKey(deck)); }; -DenonMC6000MK2.EfxUnit.prototype.isActiveDeckAssigned = function () { +DenonMC6000MK2.EfxUnit.prototype.isActiveDeckAssigned = function() { return engine.getValue(this.group, this.getDeckAssignKey(this.side.activeDeck)); }; -DenonMC6000MK2.EfxUnit.prototype.isAnyDeckAssigned = function () { +DenonMC6000MK2.EfxUnit.prototype.isAnyDeckAssigned = function() { for (var deckGroup in DenonMC6000MK2.decksByGroup) { var deck = DenonMC6000MK2.getDeckByGroup(deckGroup); if (this.isDeckAssigned(deck)) { @@ -998,22 +986,22 @@ return false; }; -DenonMC6000MK2.EfxUnit.prototype.assignDeckToggle = function (deck) { +DenonMC6000MK2.EfxUnit.prototype.assignDeckToggle = function(deck) { script.toggleControl(this.group, this.getDeckAssignKey(deck)); }; -DenonMC6000MK2.EfxUnit.prototype.assignDeckExlusively = function (deck) { +DenonMC6000MK2.EfxUnit.prototype.assignDeckExlusively = function(deck) { for (var deckGroup in DenonMC6000MK2.decksByGroup) { var varDeck = DenonMC6000MK2.getDeckByGroup(deckGroup); engine.setValue(this.group, this.getDeckAssignKey(varDeck), varDeck === deck); } }; -DenonMC6000MK2.EfxUnit.prototype.onEnabled = function () { +DenonMC6000MK2.EfxUnit.prototype.onEnabled = function() { this.tapLed.setTriState(this.isEnabled() ? DenonMC6000MK2.TRI_LED_ON : DenonMC6000MK2.TRI_LED_OFF); }; -DenonMC6000MK2.EfxUnit.prototype.onDeckButton = function (deckGroup, isButtonPressed) { +DenonMC6000MK2.EfxUnit.prototype.onDeckButton = function(deckGroup, isButtonPressed) { if (isButtonPressed) { var deck = DenonMC6000MK2.getDeckByGroup(deckGroup); if (this.getShiftState()) { @@ -1032,7 +1020,7 @@ DenonMC6000MK2.sidesByGroup = {}; -DenonMC6000MK2.getSideByGroup = function (group) { +DenonMC6000MK2.getSideByGroup = function(group) { var side = DenonMC6000MK2.sidesByGroup[group]; if (undefined === side) { DenonMC6000MK2.logError("No side found for " + group); @@ -1042,7 +1030,7 @@ /* Constructor */ -DenonMC6000MK2.Side = function (decks, efxUnit, samplerMidiChannel) { +DenonMC6000MK2.Side = function(decks, efxUnit, samplerMidiChannel) { this.decksByGroup = {}; for (var deckIndex in decks) { var deck = decks[deckIndex]; @@ -1063,7 +1051,7 @@ /* Shift */ -DenonMC6000MK2.Side.prototype.getShiftState = function (group) { +DenonMC6000MK2.Side.prototype.getShiftState = function(_group) { if (DenonMC6000MK2.GLOBAL_SHIFT_STATE) { return DenonMC6000MK2.getShiftState(); } else { @@ -1073,7 +1061,7 @@ /* Decks */ -DenonMC6000MK2.Side.prototype.getDeckByGroup = function (group) { +DenonMC6000MK2.Side.prototype.getDeckByGroup = function(group) { var deck = this.decksByGroup[group]; if (undefined === deck) { DenonMC6000MK2.logError("No deck found for " + group); @@ -1081,7 +1069,7 @@ return deck; }; -DenonMC6000MK2.Side.prototype.onDeckButton = function (deckGroup, isButtonPressed) { +DenonMC6000MK2.Side.prototype.onDeckButton = function(deckGroup, isButtonPressed) { if (isButtonPressed) { this.activeDeck = this.getDeckByGroup(deckGroup); } @@ -1090,7 +1078,7 @@ /* Startup */ -DenonMC6000MK2.Side.prototype.connectLeds = function () { +DenonMC6000MK2.Side.prototype.connectLeds = function() { for (var deckGroup in this.decksByGroup) { var deck = this.decksByGroup[deckGroup]; deck.connectLeds(); @@ -1100,7 +1088,7 @@ } }; -DenonMC6000MK2.Side.prototype.connectControls = function () { +DenonMC6000MK2.Side.prototype.connectControls = function() { for (var deckGroup in this.decksByGroup) { var deck = this.decksByGroup[deckGroup]; deck.connectControls(); @@ -1112,7 +1100,7 @@ /* Shutdown */ -DenonMC6000MK2.Side.prototype.restoreValues = function () { +DenonMC6000MK2.Side.prototype.restoreValues = function() { for (var group in this.decksByGroup) { var deck = this.decksByGroup[group]; deck.restoreValues(); @@ -1120,7 +1108,7 @@ }; // Shift -DenonMC6000MK2.Side.prototype.onShiftButton = function (isButtonPressed) { +DenonMC6000MK2.Side.prototype.onShiftButton = function(isButtonPressed) { // local shift state this.shiftState = isButtonPressed; // global shift state @@ -1129,31 +1117,31 @@ // Filter -DenonMC6000MK2.Side.prototype.applyFilter = function () { +DenonMC6000MK2.Side.prototype.applyFilter = function() { for (var group in this.decksByGroup) { var deck = this.decksByGroup[group]; deck.applyFilter(); } }; -DenonMC6000MK2.Side.prototype.initFilter = function () { +DenonMC6000MK2.Side.prototype.initFilter = function() { this.filterEnabled = true; this.filterParam = 0.5; // centered this.applyFilter(); }; -DenonMC6000MK2.Side.prototype.toggleFilter = function () { +DenonMC6000MK2.Side.prototype.toggleFilter = function() { this.filterEnabled = !this.filterEnabled; this.applyFilter(); }; -DenonMC6000MK2.Side.prototype.onFilterButton = function (isButtonPressed) { +DenonMC6000MK2.Side.prototype.onFilterButton = function(isButtonPressed) { if (isButtonPressed) { this.toggleFilter(); } }; -DenonMC6000MK2.Side.prototype.onFilterMidiValue = function (value) { +DenonMC6000MK2.Side.prototype.onFilterMidiValue = function(value) { this.filterParam = script.absoluteLin(value, 0.0, 1.0); this.applyFilter(); }; @@ -1181,20 +1169,20 @@ DenonMC6000MK2.sides = [DenonMC6000MK2.leftSide, DenonMC6000MK2.rightSide]; -DenonMC6000MK2.getShiftState = function () { +DenonMC6000MK2.getShiftState = function() { return DenonMC6000MK2.leftSide.shiftState || DenonMC6000MK2.rightSide.shiftState; }; -DenonMC6000MK2.getValue = function (key) { +DenonMC6000MK2.getValue = function(key) { return engine.getValue(DenonMC6000MK2.group, key); }; -DenonMC6000MK2.setValue = function (key, value) { +DenonMC6000MK2.setValue = function(key, value) { engine.setValue(DenonMC6000MK2.group, key, value); }; -DenonMC6000MK2.getJogDeltaValue = function (value) { +DenonMC6000MK2.getJogDeltaValue = function(value) { if (0x00 === value) { return 0x00; } else { @@ -1202,7 +1190,7 @@ } }; -DenonMC6000MK2.initValues = function () { +DenonMC6000MK2.initValues = function() { DenonMC6000MK2.backupSampleRate = engine.getValue(DenonMC6000MK2.group, "samplerate"); DenonMC6000MK2.setValue("samplerate", DenonMC6000MK2.SAMPLE_RATE); DenonMC6000MK2.backupNumDecks = DenonMC6000MK2.getValue("num_decks"); @@ -1211,7 +1199,7 @@ DenonMC6000MK2.setValue("num_samplers", DenonMC6000MK2.SIDE_COUNT * DenonMC6000MK2.SAMPLER_COUNT_PER_SIDE); }; -DenonMC6000MK2.connectLeds = function () { +DenonMC6000MK2.connectLeds = function() { DenonMC6000MK2.deck1.cueMixLed = DenonMC6000MK2.connectLed(0x00, 0x45); DenonMC6000MK2.deck1.cueMixDimmerLed = DenonMC6000MK2.connectLed(0x00, 0x46); DenonMC6000MK2.deck1.leftEfxLed = DenonMC6000MK2.connectTriLed(0x00, 0x56); @@ -1244,7 +1232,7 @@ } }; -DenonMC6000MK2.connectControls = function () { +DenonMC6000MK2.connectControls = function() { for (var index in DenonMC6000MK2.sides) { var side = DenonMC6000MK2.sides[index]; side.connectControls(); @@ -1256,7 +1244,7 @@ } }; -DenonMC6000MK2.restoreValues = function () { +DenonMC6000MK2.restoreValues = function() { for (var index in DenonMC6000MK2.sides) { var side = DenonMC6000MK2.sides[index]; side.restoreValues(); @@ -1271,45 +1259,45 @@ // MIDI callback functions without a group // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.recvTrackSelectKnob = function (channel, control, value, status) { +DenonMC6000MK2.recvTrackSelectKnob = function(_channel, _control, value, _status) { var knobDelta = DenonMC6000MK2.getKnobDelta(value); - engine.setValue('[Library]', DenonMC6000MK2.getShiftState() ? 'ScrollVertical' : 'MoveVertical', knobDelta); + engine.setValue("[Library]", DenonMC6000MK2.getShiftState() ? "ScrollVertical" : "MoveVertical", knobDelta); }; -DenonMC6000MK2.recvTrackSelectButton = function (channel, control, value, status) { +DenonMC6000MK2.recvTrackSelectButton = function(_channel, _control, value, _status) { var buttonPressed = DenonMC6000MK2.isButtonPressed(value); if (buttonPressed) { if (DenonMC6000MK2.getShiftState()) { - engine.setValue('[Library]', 'MoveFocusBackward', true); + engine.setValue("[Library]", "MoveFocusBackward", true); } else { - engine.setValue('[Library]', 'GoToItem', true); + engine.setValue("[Library]", "GoToItem", true); } } }; -DenonMC6000MK2.recvBackButton = function (channel, control, value, status) { +DenonMC6000MK2.recvBackButton = function(_channel, _control, value, _status) { var buttonPressed = DenonMC6000MK2.isButtonPressed(value); if (buttonPressed) { if (DenonMC6000MK2.getShiftState()) { - engine.setValue('[Library]', 'MoveFocusBackward', true); + engine.setValue("[Library]", "MoveFocusBackward", true); } else { - engine.setValue('[Library]', 'ScrollUp', true); + engine.setValue("[Library]", "ScrollUp", true); } } }; -DenonMC6000MK2.recvFwdButton = function (channel, control, value, status) { +DenonMC6000MK2.recvFwdButton = function(_channel, _control, value, _status) { var buttonPressed = DenonMC6000MK2.isButtonPressed(value); if (buttonPressed) { if (DenonMC6000MK2.getShiftState()) { - engine.setValue('[Library]', 'MoveFocusForward', true); + engine.setValue("[Library]", "MoveFocusForward", true); } else { - engine.setValue('[Library]', 'ScrollDown', true); + engine.setValue("[Library]", "ScrollDown", true); } } }; -DenonMC6000MK2.recvXfaderContourKnob = function (channel, control, value, status) { +DenonMC6000MK2.recvXfaderContourKnob = function(_channel, _control, value, _status) { script.crossfaderCurve(value); }; @@ -1318,7 +1306,7 @@ // MIDI [Channel] callback functions // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.recvXfaderAssignLeftButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvXfaderAssignLeftButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); if (isButtonPressed) { var deck = DenonMC6000MK2.getDeckByGroup(group); @@ -1326,7 +1314,7 @@ } }; -DenonMC6000MK2.recvXfaderAssignThruButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvXfaderAssignThruButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); if (isButtonPressed) { var deck = DenonMC6000MK2.getDeckByGroup(group); @@ -1334,7 +1322,7 @@ } }; -DenonMC6000MK2.recvXfaderAssignRightButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvXfaderAssignRightButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); if (isButtonPressed) { var deck = DenonMC6000MK2.getDeckByGroup(group); @@ -1342,154 +1330,154 @@ } }; -DenonMC6000MK2.recvPanelButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvPanelButton = function(_channel, _control, _value, _status, _group) { // TODO //var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); }; -DenonMC6000MK2.recvListButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvListButton = function(_channel, _control, _value, _status, _group) { // TODO //var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); }; -DenonMC6000MK2.recvViewButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvViewButton = function(_channel, _control, _value, _status, _group) { // TODO //var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); }; -DenonMC6000MK2.recvAreaButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvAreaButton = function(_channel, _control, _value, _status, _group) { // TODO //var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); }; -DenonMC6000MK2.recvVinylButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvVinylButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onVinylButton(isButtonPressed); }; -DenonMC6000MK2.recvKeyLockButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvKeyLockButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onKeyLockButton(isButtonPressed); }; -DenonMC6000MK2.recvCueMixButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvCueMixButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onCueMixButton(isButtonPressed); }; -DenonMC6000MK2.recvBendPlusButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvBendPlusButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onBendPlusButton(isButtonPressed); }; -DenonMC6000MK2.recvBendMinusButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvBendMinusButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onBendMinusButton(isButtonPressed); }; -DenonMC6000MK2.recvJogTouch = function (channel, control, value, status, group) { +DenonMC6000MK2.recvJogTouch = function(_channel, _control, value, _status, group) { var isJogTouched = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.touchJog(isJogTouched); }; -DenonMC6000MK2.recvJogTouchVinyl = function (channel, control, value, status, group) { +DenonMC6000MK2.recvJogTouchVinyl = function(_channel, _control, value, _status, group) { var isJogTouched = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.touchJog(isJogTouched); }; -DenonMC6000MK2.recvJogSpin = function (channel, control, value, status, group) { +DenonMC6000MK2.recvJogSpin = function(_channel, _control, value, _status, group) { var deck = DenonMC6000MK2.getDeckByGroup(group); var jogDelta = DenonMC6000MK2.getJogDeltaValue(value); deck.spinJog(jogDelta); }; -DenonMC6000MK2.recvJogSpinVinyl = function (channel, control, value, status, group) { +DenonMC6000MK2.recvJogSpinVinyl = function(_channel, _control, value, _status, group) { var deck = DenonMC6000MK2.getDeckByGroup(group); var jogDelta = DenonMC6000MK2.getJogDeltaValue(value); deck.spinJog(jogDelta); }; -DenonMC6000MK2.recvAutoLoopButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvAutoLoopButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onAutoLoopButton(isButtonPressed); }; -DenonMC6000MK2.recvLoopCutMinusButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvLoopCutMinusButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onLoopCutMinusButton(isButtonPressed); }; -DenonMC6000MK2.recvLoopCutPlusButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvLoopCutPlusButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onLoopCutPlusButton(isButtonPressed); }; -DenonMC6000MK2.recvCensorButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvCensorButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onCensorButton(isButtonPressed); }; -DenonMC6000MK2.recvSamplerButton = function (channel, control, value, status, group) { +DenonMC6000MK2.recvSamplerButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var sampler = DenonMC6000MK2.getSamplerByGroup(group); sampler.onButton(isButtonPressed); }; -DenonMC6000MK2.leftSide.recvFilterButton = function (channel, control, value, status, group) { +DenonMC6000MK2.leftSide.recvFilterButton = function(_channel, _control, value, _status, _group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.leftSide.onFilterButton(isButtonPressed); }; -DenonMC6000MK2.rightSide.recvFilterButton = function (channel, control, value, status, group) { +DenonMC6000MK2.rightSide.recvFilterButton = function(_channel, _control, value, _status, _group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.rightSide.onFilterButton(isButtonPressed); }; -DenonMC6000MK2.leftSide.recvFilterKnob = function (channel, control, value, status, group) { +DenonMC6000MK2.leftSide.recvFilterKnob = function(_channel, _control, value, _status, _group) { DenonMC6000MK2.leftSide.onFilterMidiValue(value); }; -DenonMC6000MK2.rightSide.recvFilterKnob = function (channel, control, value, status, group) { +DenonMC6000MK2.rightSide.recvFilterKnob = function(_channel, _control, value, _status, _group) { DenonMC6000MK2.rightSide.onFilterMidiValue(value); }; -DenonMC6000MK2.leftSide.efxUnit.recvDeckButton = function (channel, control, value, status, group) { +DenonMC6000MK2.leftSide.efxUnit.recvDeckButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.leftSide.efxUnit.onDeckButton(group, isButtonPressed); }; -DenonMC6000MK2.rightSide.efxUnit.recvDeckButton = function (channel, control, value, status, group) { +DenonMC6000MK2.rightSide.efxUnit.recvDeckButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.rightSide.efxUnit.onDeckButton(group, isButtonPressed); }; -DenonMC6000MK2.leftSide.efxUnit.recvTapButton = function (channel, control, value, status, group) { +DenonMC6000MK2.leftSide.efxUnit.recvTapButton = function(_channel, _control, value, _status, _group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.leftSide.efxUnit.onEnableButton(isButtonPressed); }; -DenonMC6000MK2.rightSide.efxUnit.recvTapButton = function (channel, control, value, status, group) { +DenonMC6000MK2.rightSide.efxUnit.recvTapButton = function(_channel, _control, value, _status, _group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.rightSide.efxUnit.onEnableButton(isButtonPressed); }; -DenonMC6000MK2.leftSide.recvDeckButton = function (channel, control, value, status, group) { +DenonMC6000MK2.leftSide.recvDeckButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.leftSide.onDeckButton(group, isButtonPressed); }; -DenonMC6000MK2.rightSide.recvDeckButton = function (channel, control, value, status, group) { +DenonMC6000MK2.rightSide.recvDeckButton = function(_channel, _control, value, _status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); DenonMC6000MK2.rightSide.onDeckButton(group, isButtonPressed); }; @@ -1501,106 +1489,106 @@ // Deck controls -DenonMC6000MK2.ctrlKeyLock = function (value, group, control) { +DenonMC6000MK2.ctrlKeyLock = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onKeyLockValue(value); }; -DenonMC6000MK2.ctrlSlipModeValue = function (value, group, control) { +DenonMC6000MK2.ctrlSlipModeValue = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onSlipModeValue(value); }; -DenonMC6000MK2.ctrlCueMix = function (value, group, control) { +DenonMC6000MK2.ctrlCueMix = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onCueMixValue(value); }; -DenonMC6000MK2.ctrlTrackSamples = function (value, group, control) { +DenonMC6000MK2.ctrlTrackSamples = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onTrackSamplesValue(value); }; // Loop controls -DenonMC6000MK2.ctrlLoopStartPosition = function (value, group, control) { +DenonMC6000MK2.ctrlLoopStartPosition = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.updateLoopLeds(); }; -DenonMC6000MK2.ctrlLoopEndPosition = function (value, group, control) { +DenonMC6000MK2.ctrlLoopEndPosition = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.updateLoopLeds(); }; -DenonMC6000MK2.ctrlLoopEnabled = function (value, group, control) { +DenonMC6000MK2.ctrlLoopEnabled = function(value, group, _control) { var deck = DenonMC6000MK2.getDeckByGroup(group); deck.updateLoopLeds(); }; // Sampler controls -DenonMC6000MK2.ctrlSampler = function (value, group, control) { +DenonMC6000MK2.ctrlSampler = function(value, group, _control) { var sampler = DenonMC6000MK2.getSamplerByGroup(group); sampler.updateLeds(); }; // Filter controls (shared between 2 decks on each side) -DenonMC6000MK2.leftSide.ctrlFilterEnabled = function (value, group, control) { +DenonMC6000MK2.leftSide.ctrlFilterEnabled = function(value, _group, _control) { DenonMC6000MK2.leftSide.filterLed.setStateBoolean(value); }; -DenonMC6000MK2.rightSide.ctrlFilterEnabled = function (value, group, control) { +DenonMC6000MK2.rightSide.ctrlFilterEnabled = function(value, _group, _control) { DenonMC6000MK2.rightSide.filterLed.setStateBoolean(value); }; // Efx controls -DenonMC6000MK2.leftSide.efxUnit.ctrlDeck = function (value, group, control) { +DenonMC6000MK2.leftSide.efxUnit.ctrlDeck = function(value, _group, control) { var deckGroup = control.substring(6, 16); var deck = DenonMC6000MK2.getDeckByGroup(deckGroup); deck.leftEfxLed.setStateBoolean(value); }; -DenonMC6000MK2.rightSide.efxUnit.ctrlDeck = function (value, group, control) { +DenonMC6000MK2.rightSide.efxUnit.ctrlDeck = function(value, _group, control) { var deckGroup = control.substring(6, 16); var deck = DenonMC6000MK2.getDeckByGroup(deckGroup); deck.rightEfxLed.setStateBoolean(value); }; -DenonMC6000MK2.leftSide.efxUnit.ctrlEnabled = function (value, group, control) { +DenonMC6000MK2.leftSide.efxUnit.ctrlEnabled = function(_value, _group, _control) { DenonMC6000MK2.leftSide.efxUnit.onEnabled(); }; -DenonMC6000MK2.rightSide.efxUnit.ctrlEnabled = function (value, group, control) { +DenonMC6000MK2.rightSide.efxUnit.ctrlEnabled = function(_value, _group, _control) { DenonMC6000MK2.rightSide.efxUnit.onEnabled(); }; -DenonMC6000MK2.LoadButton = function (options) { +DenonMC6000MK2.LoadButton = function(options) { components.Button.call(this, options); }; DenonMC6000MK2.LoadButton.prototype = new components.Button({ type: components.Button.toggle, - unshift: function () { - this.inKey = 'LoadSelectedTrack'; + unshift: function() { + this.inKey = "LoadSelectedTrack"; }, - shift: function () { - this.inKey = 'eject'; + shift: function() { + this.inKey = "eject"; }, - input: function (channel, control, value, status, group) { + input: function(_channel, _control, value, _status, _group) { this.inSetParameter(this.inValueScale(value)); // Smart PFL control - if (this.inKey == 'LoadSelectedTrack' && !engine.getValue(this.group, "play")) { + if (this.inKey === "LoadSelectedTrack" && !engine.getValue(this.group, "play")) { for (var deckGroup in DenonMC6000MK2.decksByGroup) { - engine.setValue(deckGroup, "pfl", this.group == deckGroup); + engine.setValue(deckGroup, "pfl", this.group === deckGroup); } } }, }); -DenonMC6000MK2.Side = function (name, oldSide) { +DenonMC6000MK2.Side = function(name, oldSide) { DenonMC6000MK2.logDebug("Creating '" + name + "' side"); components.ComponentContainer.call(this); @@ -1616,7 +1604,7 @@ DenonMC6000MK2.Side.prototype = Object.create(components.ComponentContainer.prototype); -DenonMC6000MK2.Side.prototype.connectDeck = function (deck) { +DenonMC6000MK2.Side.prototype.connectDeck = function(deck) { if (deck instanceof components.Deck === false) { DenonMC6000MK2.logError("Type mismatch: " + deck); return; @@ -1627,7 +1615,7 @@ deck.side = this; }; -DenonMC6000MK2.Side.prototype.shiftButtonInput = function (channel, control, value, status) { +DenonMC6000MK2.Side.prototype.shiftButtonInput = function(channel, control, value, status) { var isButtonPressed = components.Button.prototype.isPress(channel, control, value, status); if (isButtonPressed) { this.shift(); @@ -1636,7 +1624,7 @@ } }; -DenonMC6000MK2.Side.prototype.shift = function () { +DenonMC6000MK2.Side.prototype.shift = function() { // Call super class method components.ComponentContainer.prototype.shift.call(this); // Apply to each deck @@ -1648,7 +1636,7 @@ this.oldSide.onShiftButton(true); }; -DenonMC6000MK2.Side.prototype.unshift = function () { +DenonMC6000MK2.Side.prototype.unshift = function() { // Call super class method components.ComponentContainer.prototype.unshift.call(this); // Apply to each deck @@ -1661,7 +1649,7 @@ }; -DenonMC6000MK2.Deck = function (number, channel) { +DenonMC6000MK2.Deck = function(number, channel) { DenonMC6000MK2.logDebug("Creating deck: " + number); components.Deck.call(this, number); @@ -1686,7 +1674,7 @@ // Set the group properties of the above Components and connect their output callback functions // Without this, the group property for each Component would have to be specified to its // constructor. - this.reconnectComponents(function (component) { + this.reconnectComponents(function(component) { if (component.group === undefined) { // 'this' inside a function passed to reconnectComponents refers to the ComponentContainer. component.group = this.currentDeck; @@ -1696,17 +1684,17 @@ DenonMC6000MK2.Deck.prototype = Object.create(components.Deck.prototype); -DenonMC6000MK2.Deck.prototype.shiftButtonInput = function (channel, control, value, status) { +DenonMC6000MK2.Deck.prototype.shiftButtonInput = function(channel, control, value, status) { this.side.shiftButtonInput(channel, control, value, status); }; -DenonMC6000MK2.Deck.prototype.loopInButtonInput = function (channel, control, value, status, group) { +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) { +DenonMC6000MK2.Deck.prototype.loopOutButtonInput = function(channel, control, value, status, group) { var isButtonPressed = DenonMC6000MK2.isButtonPressed(value); var deck = DenonMC6000MK2.getDeckByGroup(group); deck.onLoopOutButton(isButtonPressed); @@ -1716,26 +1704,26 @@ // Mixxx Callback Functions // //////////////////////////////////////////////////////////////////////// -DenonMC6000MK2.init = function (id, debug) { +DenonMC6000MK2.init = function(id, debug) { DenonMC6000MK2.id = id; DenonMC6000MK2.debug = debug; DenonMC6000MK2.logInfo("Initializing controller"); // Customize components - components.Button.prototype.isPress = function (channel, control, value, status) { + components.Button.prototype.isPress = function(channel, control, value, status) { return (status & 0xF0) === 0x90; }; components.Button.prototype.off = DenonMC6000MK2.MIDI_TRI_LED_OFF; components.Button.prototype.on = DenonMC6000MK2.MIDI_TRI_LED_ON; - components.Button.prototype.on_shifted = DenonMC6000MK2.MIDI_TRI_LED_BLINK; - components.Button.prototype.send = function (value) { + components.Button.prototype.onShifted = DenonMC6000MK2.MIDI_TRI_LED_BLINK; + components.Button.prototype.send = function(value) { if (this.midi === undefined || this.midi[0] === undefined || this.midi[1] === undefined) { return; } // For Denon hardware we need to swap the 2 midi bytes (= 2nd/3rd param) in sendShortMsg()! - if (value == this.on && this.sendShifted) { - midi.sendShortMsg(this.midi[0], this.on_shifted, this.midi[1]); + if (value === this.on && this.sendShifted) { + midi.sendShortMsg(this.midi[0], this.onShifted, this.midi[1]); } else { midi.sendShortMsg(this.midi[0], value, this.midi[1]); } @@ -1766,7 +1754,7 @@ // Init left side efx unit DenonMC6000MK2.newLeftSide.effectUnit = new components.EffectUnit([1]); - DenonMC6000MK2.newLeftSide.effectUnit.dryWetKnob.input = function (channel, control, value, status, group) { + DenonMC6000MK2.newLeftSide.effectUnit.dryWetKnob.input = function(channel, control, value, _status, _group) { var knobDelta = DenonMC6000MK2.getKnobDelta(value); this.inSetParameter(this.inGetParameter() + knobDelta / DenonMC6000MK2.EFX_MIX_ENCODER_STEPS); }; @@ -1774,7 +1762,7 @@ // Init right side efx unit DenonMC6000MK2.newRightSide.effectUnit = new components.EffectUnit([2]); - DenonMC6000MK2.newRightSide.effectUnit.dryWetKnob.input = function (channel, control, value, status, group) { + DenonMC6000MK2.newRightSide.effectUnit.dryWetKnob.input = function(channel, control, value, _status, _group) { var knobDelta = DenonMC6000MK2.getKnobDelta(value); this.inSetParameter(this.inGetParameter() + knobDelta / DenonMC6000MK2.EFX_MIX_ENCODER_STEPS); }; @@ -1793,7 +1781,7 @@ } }; -DenonMC6000MK2.shutdown = function () { +DenonMC6000MK2.shutdown = function() { DenonMC6000MK2.logInfo("Shutting down controller"); try { diff -Nru mixxx-2.2.3~dfsg/res/controllers/Denon-MC7000.midi.xml mixxx-2.2.4~dfsg/res/controllers/Denon-MC7000.midi.xml --- mixxx-2.2.3~dfsg/res/controllers/Denon-MC7000.midi.xml 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Denon-MC7000.midi.xml 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,4054 @@ + + + + Denon MC7000 + OsZ + Denon MC7000 mapping for testing. Check your Linux Kernel version to get the Audio Interface working - see WIKI page. + https://www.mixxx.org/forums/ + https://www.mixxx.org/wiki/doku.php/denon_mc7000 + + + + + + + + + + [Channel1] + MC7000.padModeCue + Pad Mode HotCues + 0x94 + 0x00 + + + + + + [Channel2] + MC7000.padModeCue + Pad Mode HotCues + 0x95 + 0x00 + + + + + + [Channel3] + MC7000.padModeCue + Pad Mode HotCues + 0x96 + 0x00 + + + + + + [Channel4] + MC7000.padModeCue + Pad Mode HotCues + 0x97 + 0x00 + + + + + + [Channel1] + MC7000.padModeCueLoop + Pad Mode HotCues + 0x94 + 0x03 + + + + + + [Channel2] + MC7000.padModeCueLoop + Pad Mode HotCues + 0x95 + 0x03 + + + + + + [Channel3] + MC7000.padModeCueLoop + Pad Mode HotCues + 0x96 + 0x03 + + + + + + [Channel4] + MC7000.padModeCueLoop + Pad Mode HotCues + 0x97 + 0x03 + + + + + + [Channel1] + MC7000.padModeFlip + Pad Mode HotCues + 0x94 + 0x02 + + + + + + [Channel2] + MC7000.padModeFlip + Pad Mode HotCues + 0x95 + 0x02 + + + + + + [Channel3] + MC7000.padModeFlip + Pad Mode HotCues + 0x96 + 0x02 + + + + + + [Channel4] + MC7000.padModeFlip + Pad Mode HotCues + 0x97 + 0x02 + + + + + + [Channel1] + MC7000.padModeRoll + Pad Mode HotCues + 0x94 + 0x07 + + + + + + [Channel2] + MC7000.padModeRoll + Pad Mode HotCues + 0x95 + 0x07 + + + + + + [Channel3] + MC7000.padModeRoll + Pad Mode HotCues + 0x96 + 0x07 + + + + + + [Channel4] + MC7000.padModeRoll + Pad Mode HotCues + 0x97 + 0x07 + + + + + + [Channel1] + MC7000.padModeSavedLoop + Pad Mode HotCues + 0x94 + 0x0D + + + + + + [Channel2] + MC7000.padModeSavedLoop + Pad Mode HotCues + 0x95 + 0x0D + + + + + + [Channel3] + MC7000.padModeSavedLoop + Pad Mode HotCues + 0x96 + 0x0D + + + + + + [Channel4] + MC7000.padModeSavedLoop + Pad Mode HotCues + 0x97 + 0x0D + + + + + + [Channel1] + MC7000.padModeSlicer + Pad Mode HotCues + 0x94 + 0x09 + + + + + + [Channel2] + MC7000.padModeSlicer + Pad Mode HotCues + 0x95 + 0x09 + + + + + + [Channel3] + MC7000.padModeSlicer + Pad Mode HotCues + 0x96 + 0x09 + + + + + + [Channel4] + MC7000.padModeSlicer + Pad Mode HotCues + 0x97 + 0x09 + + + + + + [Channel1] + MC7000.padModeSlicerLoop + Pad Mode HotCues + 0x94 + 0x0A + + + + + + [Channel2] + MC7000.padModeSlicerLoop + Pad Mode HotCues + 0x95 + 0x0A + + + + + + [Channel3] + MC7000.padModeSlicerLoop + Pad Mode HotCues + 0x96 + 0x0A + + + + + + [Channel4] + MC7000.padModeSlicerLoop + Pad Mode HotCues + 0x97 + 0x0A + + + + + + [Channel1] + MC7000.padModeSampler + Pad Mode HotCues + 0x94 + 0x0B + + + + + + [Channel2] + MC7000.padModeSampler + Pad Mode HotCues + 0x95 + 0x0B + + + + + + [Channel3] + MC7000.padModeSampler + Pad Mode HotCues + 0x96 + 0x0B + + + + + + [Channel4] + MC7000.padModeSampler + Pad Mode HotCues + 0x97 + 0x0B + + + + + + [Channel1] + MC7000.padModeVelSamp + Pad Mode HotCues + 0x94 + 0x0C + + + + + + [Channel2] + MC7000.padModeVelSamp + Pad Mode HotCues + 0x95 + 0x0C + + + + + + [Channel3] + MC7000.padModeVelSamp + Pad Mode HotCues + 0x96 + 0x0C + + + + + + [Channel4] + MC7000.padModeVelSamp + Pad Mode HotCues + 0x97 + 0x0C + + + + + + [Channel1] + MC7000.padModePitch + Pad Mode HotCues + 0x94 + 0x0F + + + + + + [Channel2] + MC7000.padModePitch + Pad Mode HotCues + 0x95 + 0x0F + + + + + + [Channel3] + MC7000.padModePitch + Pad Mode HotCues + 0x96 + 0x0F + + + + + + [Channel4] + MC7000.padModePitch + Pad Mode HotCues + 0x97 + 0x0F + + + + + + + [Channel1] + MC7000.pitchFaderPosition + MIDI Learned from 180 messages. + 0xB0 + 0x77 + + + + + + [Channel2] + MC7000.pitchFaderPosition + MIDI Learned from 144 messages. + 0xB1 + 0x77 + + + + + + [Channel3] + MC7000.pitchFaderPosition + MIDI Learned from 150 messages. + 0xB2 + 0x77 + + + + + + [Channel4] + MC7000.pitchFaderPosition + MIDI Learned from 128 messages. + 0xB3 + 0x77 + + + + + + [Channel1] + MC7000.pitchFaderMSB + MIDI Learned from 180 messages. + 0xB0 + 0x09 + + + + + + [Channel2] + MC7000.pitchFaderMSB + MIDI Learned from 144 messages. + 0xB1 + 0x09 + + + + + + [Channel3] + MC7000.pitchFaderMSB + MIDI Learned from 150 messages. + 0xB2 + 0x09 + + + + + + [Channel4] + MC7000.pitchFaderMSB + MIDI Learned from 128 messages. + 0xB3 + 0x09 + + + + + + + [Channel1] + MC7000.keySelect + Pitch +/- needs tuning + 0xB0 + 0x26 + + + + + + [Channel2] + MC7000.keySelect + Pitch +/- needs tuning + 0xB1 + 0x26 + + + + + + [Channel3] + MC7000.keySelect + Pitch +/- needs tuning + 0xB2 + 0x26 + + + + + + [Channel4] + MC7000.keySelect + Pitch +/- needs tuning + 0xB3 + 0x26 + + + + + + + [Channel1] + MC7000.crossfaderAssign + Ch1 THRU + 0x90 + 0x1E + + + + + + [Channel2] + MC7000.crossfaderAssign + Ch2 THRU + 0x91 + 0x1E + + + + + + [Channel3] + MC7000.crossfaderAssign + Ch3 THRU + 0x92 + 0x1E + + + + + + [Channel4] + MC7000.crossfaderAssign + Ch4 THRU + 0x93 + 0x1E + + + + + + + [Channel1] + MC7000.prevRateRange + Toggle next Rate Range + 0x90 + 0x2C + + + + + + [Channel2] + MC7000.prevRateRange + Toggle next Rate Range + 0x91 + 0x2C + + + + + + [Channel3] + MC7000.prevRateRange + Toggle next Rate Range + 0x92 + 0x2C + + + + + + [Channel4] + MC7000.prevRateRange + Toggle next Rate Range + 0x93 + 0x2C + + + + + + [Channel1] + MC7000.nextRateRange + Toggle next Rate Range + 0x90 + 0x2B + + + + + + [Channel2] + MC7000.nextRateRange + Toggle next Rate Range + 0x91 + 0x2B + + + + + + [Channel3] + MC7000.nextRateRange + Toggle next Rate Range + 0x92 + 0x2B + + + + + + [Channel4] + MC7000.nextRateRange + Toggle next Rate Range + 0x93 + 0x2B + + + + + + + [Channel1] + MC7000.needleSearchTouch + Touch detection for Needle Search + 0x90 + 0x50 + + + + + + [Channel1] + MC7000.needleSearchTouchShift + "Shift" + Touch detection for Needle Search + 0x90 + 0x51 + + + + + + [Channel1] + MC7000.needleSearchMSB + Jump to track position (Needle Search) + 0xB0 + 0x2B + + + + + + [Channel1] + MC7000.needleSearchStripPosition + Jump to track position (Needle Search) + 0xB0 + 0x78 + + + + + + [Channel2] + MC7000.needleSearchTouch + Touch detection for Needle Search + 0x91 + 0x50 + + + + + + [Channel2] + MC7000.needleSearchTouchShift + "Shift" + Touch detection for Needle Search + 0x91 + 0x51 + + + + + + [Channel2] + MC7000.needleSearchMSB + Jump to track position (Needle Search) + 0xB1 + 0x2B + + + + + + [Channel2] + MC7000.needleSearchStripPosition + Jump to track position (Needle Search) + 0xB1 + 0x78 + + + + + + [Channel3] + MC7000.needleSearchTouch + Touch detection for Needle Search + 0x92 + 0x50 + + + + + + [Channel3] + MC7000.needleSearchTouchShift + "Shift" + Touch detection for Needle Search + 0x92 + 0x51 + + + + + + [Channel3] + MC7000.needleSearchMSB + Jump to track position (Needle Search) + 0xB2 + 0x2B + + + + + + [Channel3] + MC7000.needleSearchStripPosition + Jump to track position (Needle Search) + 0xB2 + 0x78 + + + + + + [Channel4] + MC7000.needleSearchTouch + Touch detection for Needle Search + 0x93 + 0x50 + + + + + + [Channel4] + MC7000.needleSearchTouchShift + "Shift" + Touch detection for Needle Search + 0x93 + 0x51 + + + + + + [Channel4] + MC7000.needleSearchMSB + Jump to track position (Needle Search) + 0xB3 + 0x2B + + + + + + [Channel4] + MC7000.needleSearchStripPosition + Jump to track position (Needle Search) + 0xB3 + 0x78 + + + + + + + [EffectRack1_EffectUnit1] + MC7000.fxWetDry + 0xB8 + 0x03 + + + + + + [EffectRack1_EffectUnit2] + MC7000.fxWetDry + 0xB9 + 0x03 + + + + + + [Master] + MC7000.samplerLevel + 0xBF + 0x1A + + + + + + [Mixer Profile] + MC7000.crossFaderCurve + sets the Crossfader Curve + 0xBF + 0x09 + + + + + + + [Channel1] + MC7000.vinylModeToggle + Vinyl toggle + 0x90 + 0x07 + + + + + + [Channel2] + MC7000.vinylModeToggle + Vinyl toggle + 0x91 + 0x07 + + + + + + [Channel3] + MC7000.vinylModeToggle + Vinyl toggle + 0x92 + 0x07 + + + + + + [Channel4] + MC7000.vinylModeToggle + Vinyl toggle + 0x93 + 0x07 + + + + + + [Channel1] + MC7000.wheelTouch + MIDI Learned from 759 messages. + 0x90 + 0x06 + + + + + + [Channel2] + MC7000.wheelTouch + MIDI Learned from 759 messages. + 0x91 + 0x06 + + + + + + [Channel3] + MC7000.wheelTouch + MIDI Learned from 759 messages. + 0x92 + 0x06 + + + + + + [Channel4] + MC7000.wheelTouch + MIDI Learned from 759 messages. + 0x93 + 0x06 + + + + + + [Channel1] + MC7000.wheelTurn + MIDI Learned from 759 messages. + 0xB0 + 0x06 + + + + + + [Channel2] + MC7000.wheelTurn + MIDI Learned from 759 messages. + 0xB1 + 0x06 + + + + + + [Channel3] + MC7000.wheelTurn + MIDI Learned from 759 messages. + 0xB2 + 0x06 + + + + + + [Channel4] + MC7000.wheelTurn + MIDI Learned from 759 messages. + 0xB3 + 0x06 + + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + Hi Ch1 + 0xB0 + 0x17 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + Hi Ch2 + 0xB1 + 0x17 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter3 + Hi Ch3 + 0xB2 + 0x17 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter3 + Hi Ch4 + 0xB3 + 0x17 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + MID Ch1 + 0xB0 + 0x18 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + MID Ch2 + 0xB1 + 0x18 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter2 + MID Ch3 + 0xB2 + 0x18 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter2 + MID Ch4 + 0xB3 + 0x18 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + LOW Ch1 + 0xB0 + 0x19 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + LOW Ch2 + 0xB1 + 0x19 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter1 + LOW Ch3 + 0xB2 + 0x19 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter1 + LOW Ch4 + 0xB3 + 0x19 + + + + + + [QuickEffectRack1_[Channel1]] + super1 + Filter Ch1 + 0xB0 + 0x1A + + + + + + [QuickEffectRack1_[Channel2]] + super1 + Filter Ch2 + 0xB1 + 0x1A + + + + + + [QuickEffectRack1_[Channel3]] + super1 + Filter Ch3 + 0xB2 + 0x1A + + + + + + [QuickEffectRack1_[Channel4]] + super1 + Filter Ch4 + 0xB3 + 0x1A + + + + + + + [Channel1] + pregain + Level / Gain Ch1 + 0xB0 + 0x16 + + + + + + [Channel2] + pregain + Level / Gain Ch2 + 0xB1 + 0x16 + + + + + + [Channel3] + pregain + Level / Gain Ch3 + 0xB2 + 0x16 + + + + + + [Channel4] + pregain + Level / Gain Ch4 + 0xB3 + 0x16 + + + + + + [Channel1] + volume + Line Fader Ch1 + 0xB0 + 0x1C + + + + + + [Channel2] + volume + Line Fader Ch2 + 0xB1 + 0x1C + + + + + + [Channel3] + volume + Line Fader Ch3 + 0xB2 + 0x1C + + + + + + [Channel4] + volume + Line Fader Ch4 + 0xB3 + 0x1C + + + + + + [Master] + crossfader + Crossfader + 0xBF + 0x08 + + + + + + [Channel1] + pfl + PFL Ch1 + 0x90 + 0x1B + + + + + + [Channel2] + pfl + PFL Ch2 + 0x91 + 0x1B + + + + + + [Channel3] + pfl + PFL Ch3 + 0x92 + 0x1B + + + + + + [Channel4] + pfl + PFL Ch4 + 0x93 + 0x1B + + + + + + + [Channel1] + play + Play Ch1 + 0x90 + 0x00 + + + + + + [Channel2] + play + Play Ch2 + 0x91 + 0x00 + + + + + + [Channel3] + play + Play Ch3 + 0x92 + 0x00 + + + + + + [Channel4] + play + Play Ch4 + 0x93 + 0x00 + + + + + + [Channel1] + play_stutter + Stutter play Ch1 + 0x90 + 0x04 + + + + + + [Channel2] + play_stutter + Stutter play Ch2 + 0x91 + 0x04 + + + + + + [Channel3] + play_stutter + Stutter play Ch3 + 0x92 + 0x04 + + + + + + [Channel4] + play_stutter + Stutter play Ch4 + 0x93 + 0x04 + + + + + + [PreviewDeck1] + play + Play Preview Deck + 0x9F + 0x10 + + + + + + [Channel1] + cue_default + CUE Ch1 + 0x90 + 0x01 + + + + + + [Channel2] + cue_default + CUE Ch2 + 0x91 + 0x01 + + + + + + [Channel3] + cue_default + CUE Ch3 + 0x92 + 0x01 + + + + + + [Channel4] + cue_default + CUE Ch4 + 0x93 + 0x01 + + + + + + [Channel1] + start_stop + start stop Ch1 + 0x90 + 0x05 + + + + + + [Channel2] + start_stop + start stop Ch2 + 0x91 + 0x05 + + + + + + [Channel3] + start_stop + start stop Ch3 + 0x92 + 0x05 + + + + + + [Channel4] + start_stop + start stop Ch4 + 0x93 + 0x05 + + + + + + [Channel1] + sync_enabled + SYNC Ch1 + 0x90 + 0x02 + + + + + + [Channel2] + sync_enabled + SYNC Ch2 + 0x91 + 0x02 + + + + + + [Channel3] + sync_enabled + SYNC Ch3 + 0x92 + 0x02 + + + + + + [Channel4] + sync_enabled + SYNC Ch4 + 0x93 + 0x02 + + + + + + + [Channel1] + beats_translate_curpos + BeatGrid Adjust Ch1 + 0x94 + 0x46 + + + + + + [Channel2] + beats_translate_curpos + BeatGrid Adjust Ch2 + 0x95 + 0x46 + + + + + + [Channel3] + beats_translate_curpos + BeatGrid Adjust Ch3 + 0x96 + 0x46 + + + + + + [Channel4] + beats_translate_curpos + BeatGrid Adjust Ch4 + 0x97 + 0x46 + + + + + + [Channel1] + beats_translate_match_alignment + BeatGrid Slide Ch1 + 0x94 + 0x48 + + + + + + [Channel2] + beats_translate_match_alignment + BeatGrid Slide Ch2 + 0x95 + 0x48 + + + + + + [Channel3] + beats_translate_match_alignment + BeatGrid Slide Ch3 + 0x96 + 0x48 + + + + + + [Channel4] + beats_translate_match_alignment + BeatGrid Slide Ch4 + 0x97 + 0x48 + + + + + + [Channel1] + quantize + Quantize + 0x94 + 0x47 + + + + + + [Channel2] + quantize + Quantize + 0x95 + 0x47 + + + + + + [Channel3] + quantize + Quantize + 0x96 + 0x47 + + + + + + [Channel4] + quantize + Quantize + 0x97 + 0x47 + + + + + + [Channel1] + beatloop_activate + AutoLoop Ch1 + 0x94 + 0x32 + + + + + + [Channel2] + beatloop_activate + AutoLoop Ch2 + 0x95 + 0x32 + + + + + + [Channel3] + beatloop_activate + AutoLoop Ch3 + 0x96 + 0x32 + + + + + + [Channel4] + beatloop_activate + AutoLoop Ch4 + 0x97 + 0x32 + + + + + + [Channel1] + loop_halve + X1/2 Ch1 + 0x94 + 0x34 + + + + + + [Channel2] + loop_halve + X1/2 Ch2 + 0x95 + 0x34 + + + + + + [Channel3] + loop_halve + X1/2 Ch3 + 0x96 + 0x34 + + + + + + [Channel4] + loop_halve + X1/2 Ch4 + 0x97 + 0x34 + + + + + + [Channel1] + loop_double + X2 Ch1 + 0x94 + 0x35 + + + + + + [Channel2] + loop_double + X2 Ch2 + 0x95 + 0x35 + + + + + + [Channel3] + loop_double + X2 Ch3 + 0x96 + 0x35 + + + + + + [Channel4] + loop_double + X2 Ch4 + 0x97 + 0x35 + + + + + + [Channel1] + loop_in + Loop in Ch1 + 0x94 + 0x38 + + + + + + [Channel2] + loop_in + Loop in Ch2 + 0x95 + 0x38 + + + + + + [Channel3] + loop_in + Loop in Ch3 + 0x96 + 0x38 + + + + + + [Channel4] + loop_in + Loop in Ch4 + 0x97 + 0x38 + + + + + + [Channel1] + loop_out + Loop out Ch1 + 0x94 + 0x39 + + + + + + [Channel2] + loop_out + Loop out Ch2 + 0x95 + 0x39 + + + + + + [Channel3] + loop_out + Loop out Ch3 + 0x96 + 0x39 + + + + + + [Channel4] + loop_out + Loop out Ch4 + 0x97 + 0x39 + + + + + + [Channel1] + reloop_toggle + Reloop Ch1 + 0x94 + 0x33 + + + + + + [Channel2] + reloop_toggle + Reloop Ch2 + 0x95 + 0x33 + + + + + + [Channel3] + reloop_toggle + Reloop Ch3 + 0x96 + 0x33 + + + + + + [Channel4] + reloop_toggle + Reloop Ch4 + 0x97 + 0x33 + + + + + + + [Channel1] + beatjump_8_backward + MIDI Learned from 10 messages. + 0x94 + 0x28 + + + + + + [Channel1] + beatjump_8_forward + MIDI Learned from 2 messages. + 0x94 + 0x29 + + + + + + [Channel1] + beatjump_32_backward + MIDI Learned from 8 messages. + 0x94 + 0x2A + + + + + + [Channel1] + beatjump_32_forward + MIDI Learned from 6 messages. + 0x94 + 0x2B + + + + + + [Channel2] + beatjump_8_backward + MIDI Learned from 10 messages. + 0x95 + 0x28 + + + + + + [Channel2] + beatjump_8_forward + MIDI Learned from 2 messages. + 0x95 + 0x29 + + + + + + [Channel2] + beatjump_32_backward + MIDI Learned from 8 messages. + 0x95 + 0x2A + + + + + + [Channel2] + beatjump_32_forward + MIDI Learned from 6 messages. + 0x95 + 0x2B + + + + + + [Channel3] + beatjump_8_backward + MIDI Learned from 10 messages. + 0x96 + 0x28 + + + + + + [Channel3] + beatjump_8_forward + MIDI Learned from 2 messages. + 0x96 + 0x29 + + + + + + [Channel3] + beatjump_32_backward + MIDI Learned from 8 messages. + 0x96 + 0x2A + + + + + + [Channel3] + beatjump_32_forward + MIDI Learned from 6 messages. + 0x96 + 0x2B + + + + + + [Channel4] + beatjump_8_backward + MIDI Learned from 10 messages. + 0x97 + 0x28 + + + + + + [Channel4] + beatjump_8_forward + MIDI Learned from 2 messages. + 0x97 + 0x29 + + + + + + [Channel4] + beatjump_32_backward + MIDI Learned from 8 messages. + 0x97 + 0x2A + + + + + + [Channel4] + beatjump_32_forward + MIDI Learned from 6 messages. + 0x97 + 0x2B + + + + + + + [Library] + MoveVertical + Select line + 0xBF + 0x00 + + + + + + [Library] + ScrollVertical + Select page + 0xBF + 0x01 + + + + + + [Channel1] + LoadSelectedTrack + MIDI Learned from 2 messages. + 0x9F + 0x02 + + + + + + [Channel2] + LoadSelectedTrack + MIDI Learned from 2 messages. + 0x9F + 0x03 + + + + + + [Channel3] + LoadSelectedTrack + MIDI Learned from 2 messages. + 0x9F + 0x04 + + + + + + [Channel4] + LoadSelectedTrack + MIDI Learned from 2 messages. + 0x9F + 0x05 + + + + + + [Library] + GoToItem + Select Item + 0x9F + 0x1F + + + + + + [Library] + MoveFocusForward + change active panel + 0x9F + 0x06 + + + + + + [Library] + MoveFocusBackward + change active panel + 0x9F + 0x07 + + + + + + [PreviewDeck1] + LoadSelectedTrack + Load in Preview deck + 0x9F + 0x1B + + + + + + [EffectRack1] + show + Show Effect Rack + 0x9F + 0x11 + + + + + + [Master] + maximize_library + Full screen Library + 0x9F + 0x0F + + + + + + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + FX 1 to Ch1 + 0x98 + 0x05 + + + + + + [EffectRack1_EffectUnit1] + group_[Channel2]_enable + FX 1 to Ch2 + 0x98 + 0x06 + + + + + + [EffectRack1_EffectUnit1] + group_[Channel3]_enable + FX 1 to Ch3 + 0x98 + 0x07 + + + + + + [EffectRack1_EffectUnit1] + group_[Channel4]_enable + FX 1 to Ch4 + 0x98 + 0x08 + + + + + + [EffectRack1_EffectUnit2] + group_[Channel1]_enable + FX 2 to Ch1 + 0x99 + 0x05 + + + + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + FX 2 to Ch2 + 0x99 + 0x06 + + + + + + [EffectRack1_EffectUnit2] + group_[Channel3]_enable + FX 2 to Ch3 + 0x99 + 0x07 + + + + + + [EffectRack1_EffectUnit2] + group_[Channel4]_enable + FX 2 to Ch4 + 0x99 + 0x08 + + + + + + + [EffectRack1_EffectUnit1_Effect1] + enabled + FX1 1 on + 0x98 + 0x00 + + + + + + [EffectRack1_EffectUnit1_Effect2] + enabled + FX1 2 on + 0x98 + 0x01 + + + + + + [EffectRack1_EffectUnit1_Effect3] + enabled + FX1 3 on + 0x98 + 0x02 + + + + + + [EffectRack1_EffectUnit1_Effect1] + meta + FX1 Level 1 + 0xB8 + 0x00 + + + + + + [EffectRack1_EffectUnit1_Effect2] + meta + FX1 Level 2 + 0xB8 + 0x01 + + + + + + [EffectRack1_EffectUnit1_Effect3] + meta + FX1 Level 3 + 0xB8 + 0x02 + + + + + + + [EffectRack1_EffectUnit2_Effect1] + enabled + FX2 1 on + 0x99 + 0x00 + + + + + + [EffectRack1_EffectUnit2_Effect2] + enabled + FX2 2 on + 0x99 + 0x01 + + + + + + [EffectRack1_EffectUnit2_Effect3] + enabled + FX2 3 on + 0x99 + 0x02 + + + + + + [EffectRack1_EffectUnit2_Effect1] + meta + FX2 Level 1 + 0xB9 + 0x00 + + + + + + [EffectRack1_EffectUnit2_Effect2] + meta + FX2 Level 2 + 0xB9 + 0x01 + + + + + + [EffectRack1_EffectUnit2_Effect3] + meta + FX2 Level 3 + 0xB9 + 0x02 + + + + + + + [EffectRack1_EffectUnit1_Effect1] + next_effect + FX1 1 + 0x98 + 0x0B + + + + + + [EffectRack1_EffectUnit2_Effect1] + next_effect + FX2 1 + 0x99 + 0x0B + + + + + + [EffectRack1_EffectUnit1_Effect3] + next_effect + FX1 3 + 0x98 + 0x0D + + + + + + [EffectRack1_EffectUnit1_Effect2] + next_effect + FX1 2 + 0x98 + 0x0C + + + + + + [EffectRack1_EffectUnit2_Effect3] + next_effect + FX2 3 + 0x99 + 0x0D + + + + + + [EffectRack1_EffectUnit2_Effect2] + next_effect + FX2 2 + 0x99 + 0x0C + + + + + + + [EffectRack1_EffectUnit1] + group_[Master]_enable + FX1 on master + 0x98 + 0x04 + + + + + + [EffectRack1_EffectUnit2] + group_[Master]_enable + FX2 on master + 0x99 + 0x04 + + + + + + [EffectRack1_EffectUnit1] + group_[Headphone]_enable + MIDI Learned from 2 messages. + 0x98 + 0x0A + + + + + + [EffectRack1_EffectUnit2] + group_[Headphone]_enable + MIDI Learned from 2 messages. + 0x99 + 0x0A + + + + + + + [Channel1] + slip_enabled + MIDI Learned from 12 messages. + 0x90 + 0x0F + + + + + + [Channel2] + slip_enabled + MIDI Learned from 124 messages. + 0x91 + 0x0F + + + + + + [Channel3] + slip_enabled + MIDI Learned from 70 messages. + 0x92 + 0x0F + + + + + + [Channel4] + slip_enabled + MIDI Learned from 160 messages. + 0x93 + 0x0F + + + + + + [Channel1] + MC7000.censor + Backspin Ch1 + 0x90 + 0x10 + + + + + + [Channel2] + MC7000.censor + Backspin Ch2 + 0x91 + 0x10 + + + + + + [Channel3] + MC7000.censor + Backspin Ch3 + 0x92 + 0x10 + + + + + + [Channel4] + MC7000.censor + Backspin Ch4 + 0x93 + 0x10 + + + + + + [Channel1] + MC7000.stopTime + Stop Time Ch1 + 0xB0 + 0x13 + + + + + + [Channel2] + MC7000.stopTime + Stop Time Ch2 + 0xB1 + 0x13 + + + + + + [Channel3] + MC7000.stopTime + Stop Time Ch3 + 0xB2 + 0x13 + + + + + + [Channel4] + MC7000.stopTime + Stop Time Ch4 + 0xB3 + 0x13 + + + + + + [Channel1] + reverse + Reverse Ch1 + 0x90 + 0x11 + + + + + + [Channel2] + reverse + Reverse Ch2 + 0x91 + 0x11 + + + + + + [Channel3] + reverse + Reverse Ch3 + 0x92 + 0x11 + + + + + + [Channel4] + reverse + Reverse Ch4 + 0x93 + 0x11 + + + + + + + [Channel1] + keylock + Keylock Ch1 + 0x90 + 0x0D + + + + + + [Channel2] + keylock + Keylock Ch2 + 0x91 + 0x0D + + + + + + [Channel3] + keylock + Keylock Ch3 + 0x92 + 0x0D + + + + + + [Channel4] + keylock + Keylock Ch4 + 0x93 + 0x0D + + + + + + [Channel1] + sync_key + sync_key Ch1 + 0x90 + 0x29 + + + + + + [Channel2] + sync_key + sync_key Ch2 + 0x91 + 0x29 + + + + + + [Channel3] + sync_key + sync_key Ch3 + 0x92 + 0x29 + + + + + + [Channel4] + sync_key + sync_key Ch4 + 0x93 + 0x29 + + + + + + [Channel1] + reset_key + Default Key + 0x90 + 0x2A + + + + + + [Channel2] + reset_key + Default Key + 0x91 + 0x2A + + + + + + [Channel3] + reset_key + Default Key + 0x92 + 0x2A + + + + + + [Channel4] + reset_key + Default Key + 0x93 + 0x2A + + + + + + + [Channel1] + rate_temp_down_small + Pitch Bend - + 0x90 + 0x0C + + + + + + [Channel2] + rate_temp_down_small + Pitch Bend - + 0x91 + 0x0C + + + + + + [Channel3] + rate_temp_down_small + Pitch Bend - + 0x92 + 0x0C + + + + + + [Channel4] + rate_temp_down_small + Pitch Bend - + 0x93 + 0x0C + + + + + + [Channel1] + rate_temp_up_small + Pitch Bend + + 0x90 + 0x0B + + + + + + [Channel2] + rate_temp_up_small + Pitch Bend + + 0x91 + 0x0B + + + + + + [Channel3] + rate_temp_up_small + Pitch Bend + + 0x92 + 0x0B + + + + + + [Channel4] + rate_temp_up_small + Pitch Bend + + 0x93 + 0x0B + + + + + + + [Channel1] + MC7000.PadButtons + PAD-1 + 0x94 + 0x14 + + + + + + [Channel2] + MC7000.PadButtons + PAD-1 + 0x95 + 0x14 + + + + + + [Channel3] + MC7000.PadButtons + PAD-1 + 0x96 + 0x14 + + + + + + [Channel4] + MC7000.PadButtons + PAD-1 + 0x97 + 0x14 + + + + + + [Channel1] + MC7000.PadButtons + PAD-2 + 0x94 + 0x15 + + + + + + [Channel2] + MC7000.PadButtons + PAD-2 + 0x95 + 0x15 + + + + + + [Channel3] + MC7000.PadButtons + PAD-2 + 0x96 + 0x15 + + + + + + [Channel4] + MC7000.PadButtons + PAD-2 + 0x97 + 0x15 + + + + + + [Channel1] + MC7000.PadButtons + PAD_3 + 0x94 + 0x16 + + + + + + [Channel2] + MC7000.PadButtons + PAD_3 + 0x95 + 0x16 + + + + + + [Channel3] + MC7000.PadButtons + PAD_3 + 0x96 + 0x16 + + + + + + [Channel4] + MC7000.PadButtons + PAD_3 + 0x97 + 0x16 + + + + + + [Channel1] + MC7000.PadButtons + PAD_4 + 0x94 + 0x17 + + + + + + [Channel2] + MC7000.PadButtons + PAD_4 + 0x95 + 0x17 + + + + + + [Channel3] + MC7000.PadButtons + PAD_4 + 0x96 + 0x17 + + + + + + [Channel4] + MC7000.PadButtons + PAD_4 + 0x97 + 0x17 + + + + + + [Channel1] + MC7000.PadButtons + PAD_5 + 0x94 + 0x18 + + + + + + [Channel2] + MC7000.PadButtons + PAD_5 + 0x95 + 0x18 + + + + + + [Channel3] + MC7000.PadButtons + PAD_5 + 0x96 + 0x18 + + + + + + [Channel4] + MC7000.PadButtons + PAD_5 + 0x97 + 0x18 + + + + + + [Channel1] + MC7000.PadButtons + PAD_6 + 0x94 + 0x19 + + + + + + [Channel2] + MC7000.PadButtons + PAD_6 + 0x95 + 0x19 + + + + + + [Channel3] + MC7000.PadButtons + PAD_6 + 0x96 + 0x19 + + + + + + [Channel4] + MC7000.PadButtons + PAD_6 + 0x97 + 0x19 + + + + + + [Channel1] + MC7000.PadButtons + PAD_7 + 0x94 + 0x1A + + + + + + [Channel2] + MC7000.PadButtons + PAD_7 + 0x95 + 0x1A + + + + + + [Channel3] + MC7000.PadButtons + PAD_7 + 0x96 + 0x1A + + + + + + [Channel4] + MC7000.PadButtons + PAD_7 + 0x97 + 0x1A + + + + + + [Channel1] + MC7000.PadButtons + PAD_8 + 0x94 + 0x1B + + + + + + [Channel2] + MC7000.PadButtons + PAD_8 + 0x95 + 0x1B + + + + + + [Channel3] + MC7000.PadButtons + PAD_8 + 0x96 + 0x1B + + + + + + [Channel4] + MC7000.PadButtons + PAD_8 + 0x97 + 0x1B + + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD-1 + 0x94 + 0x1C + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD-1 + 0x95 + 0x1C + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD-1 + 0x96 + 0x1C + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD-1 + 0x97 + 0x1C + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD-2 + 0x94 + 0x1D + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD-2 + 0x95 + 0x1D + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD-2 + 0x96 + 0x1D + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD-2 + 0x97 + 0x1D + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_3 + 0x94 + 0x1E + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_3 + 0x95 + 0x1E + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_3 + 0x96 + 0x1E + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_3 + 0x97 + 0x1E + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_4 + 0x94 + 0x1F + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_4 + 0x95 + 0x1F + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_4 + 0x96 + 0x1F + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_4 + 0x97 + 0x1F + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_5 + 0x94 + 0x20 + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_5 + 0x95 + 0x20 + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_5 + 0x96 + 0x20 + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_5 + 0x97 + 0x20 + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_6 + 0x94 + 0x21 + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_6 + 0x95 + 0x21 + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_6 + 0x96 + 0x21 + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_6 + 0x97 + 0x21 + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_7 + 0x94 + 0x22 + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_7 + 0x95 + 0x22 + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_7 + 0x96 + 0x22 + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_7 + 0x97 + 0x22 + + + + + + [Channel1] + MC7000.PadButtons + CLEAR_PAD_8 + 0x94 + 0x23 + + + + + + [Channel2] + MC7000.PadButtons + CLEAR_PAD_8 + 0x95 + 0x23 + + + + + + [Channel3] + MC7000.PadButtons + CLEAR_PAD_8 + 0x96 + 0x23 + + + + + + [Channel4] + MC7000.PadButtons + CLEAR_PAD_8 + 0x97 + 0x23 + + + + + + + + + [Channel1] + loop_enabled + Autoloop LED + 0x94 + 0x32 + 0x01 + 0.5 + + + [Channel1] + loop_enabled + Reloop LED + 0x94 + 0x33 + 0x02 + 0x01 + 0.5 + + + [Channel2] + loop_enabled + Autoloop LED + 0x95 + 0x32 + 0x01 + 0.5 + + + [Channel2] + loop_enabled + Reloop LED + 0x95 + 0x33 + 0x02 + 0x01 + 0.5 + + + [Channel3] + loop_enabled + Autoloop LED + 0x96 + 0x32 + 0x01 + 0.5 + + + [Channel3] + loop_enabled + Reloop LED + 0x96 + 0x33 + 0x02 + 0x01 + 0.5 + + + [Channel4] + loop_enabled + Autoloop LED + 0x97 + 0x32 + 0x01 + 0.5 + + + [Channel4] + loop_enabled + Reloop LED + 0x97 + 0x33 + 0x02 + 0x01 + 0.5 + + + [Channel1] + play_indicator + Play LED + 0x90 + 0x00 + 0x01 + 0.5 + + + [Channel2] + play_indicator + Play LED + 0x91 + 0x00 + 0x01 + 0.5 + + + [Channel3] + play_indicator + Play LED + 0x92 + 0x00 + 0x01 + 0.5 + + + [Channel4] + play_indicator + Play LED + 0x93 + 0x00 + 0x01 + 0.5 + + + [Channel1] + cue_indicator + Cue LED + 0x90 + 0x01 + 0x01 + 0.5 + + + [Channel2] + cue_indicator + Cue LED + 0x91 + 0x01 + 0x01 + 0.5 + + + [Channel3] + cue_indicator + Cue LED + 0x92 + 0x01 + 0x01 + 0.5 + + + [Channel4] + cue_indicator + Cue LED + 0x93 + 0x01 + 0x01 + 0.5 + + + [Channel1] + sync_enabled + Sync LED + 0x90 + 0x02 + 0x01 + 0.5 + + + [Channel2] + sync_enabled + Sync LED + 0x91 + 0x02 + 0x01 + 0.5 + + + [Channel3] + sync_enabled + Sync LED + 0x92 + 0x02 + 0x01 + 0.5 + + + [Channel4] + sync_enabled + Sync LED + 0x93 + 0x02 + 0x01 + 0.5 + + + [Channel1] + slip_enabled + Slip LED + 0x90 + 0x0F + 0x01 + 0.5 + + + [Channel2] + slip_enabled + Slip LED + 0x91 + 0x0F + 0x01 + 0.5 + + + [Channel3] + slip_enabled + Slip LED + 0x92 + 0x0F + 0x01 + 0.5 + + + [Channel4] + slip_enabled + Slip LED + 0x93 + 0x0F + 0x01 + 0.5 + + + [Channel1] + pfl + PFL LED + 0x90 + 0x1B + 0x01 + 0.5 + + + [Channel2] + pfl + PFL LED + 0x91 + 0x1B + 0x01 + 0.5 + + + [Channel3] + pfl + PFL LED + 0x92 + 0x1B + 0x01 + 0.5 + + + [Channel4] + pfl + PFL LED + 0x93 + 0x1B + 0x01 + 0.5 + + + [Channel1] + keylock + keylock LED + 0x90 + 0x0D + 0x01 + 0.5 + + + [Channel2] + keylock + keylock LED + 0x91 + 0x0D + 0x01 + 0.5 + + + [Channel3] + keylock + keylock LED + 0x92 + 0x0D + 0x01 + 0.5 + + + [Channel4] + keylock + keylock LED + 0x93 + 0x0D + 0x01 + 0.5 + + + [Channel1] + reverseroll + Censor LED + 0x90 + 0x10 + 0x01 + 0.5 + + + [Channel2] + reverseroll + Censor LED + 0x91 + 0x10 + 0x01 + 0.5 + + + [Channel3] + reverseroll + Censor LED + 0x92 + 0x10 + 0x01 + 0.5 + + + [Channel4] + reverseroll + Censor LED + 0x93 + 0x10 + 0x01 + 0.5 + + + + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + FX 1 to Ch1 + 0x98 + 0x05 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Channel2]_enable + FX 1 to Ch2 + 0x98 + 0x06 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Channel3]_enable + FX 1 to Ch3 + 0x98 + 0x07 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Channel4]_enable + FX 1 to Ch4 + 0x98 + 0x08 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Channel1]_enable + FX 2 to Ch1 + 0x99 + 0x05 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + FX 2 to Ch2 + 0x99 + 0x06 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Channel3]_enable + FX 2 to Ch3 + 0x99 + 0x07 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Channel4]_enable + FX 2 to Ch4 + 0x99 + 0x08 + 0x01 + 0.5 + + + + [EffectRack1_EffectUnit1_Effect1] + enabled + FX1 1 on + 0x98 + 0x00 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1_Effect2] + enabled + FX1 2 on + 0x98 + 0x01 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1_Effect3] + enabled + FX1 3 on + 0x98 + 0x02 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2_Effect1] + enabled + FX2 1 on + 0x99 + 0x00 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2_Effect2] + enabled + FX2 2 on + 0x99 + 0x01 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2_Effect3] + enabled + FX2 3 on + 0x99 + 0x02 + 0x01 + 0.5 + + + + [EffectRack1_EffectUnit1] + group_[Master]_enable + FX1 on master + 0x98 + 0x04 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Master]_enable + FX2 on master + 0x99 + 0x04 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Headphone]_enable + 0x98 + 0x0A + 0x02 + 0x01 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Headphone]_enable + 0x99 + 0x0A + 0x02 + 0x01 + 0.5 + + + [Channel1] + sync_key + sync_key Ch1 + 0x90 + 0x29 + 0x02 + 0xFF + 0.5 + + + [Channel2] + sync_key + sync_key Ch2 + 0x91 + 0x29 + 0x02 + 0xFF + 0.5 + + + [Channel3] + sync_key + sync_key Ch3 + 0x92 + 0x29 + 0x02 + 0xFF + 0.5 + + + [Channel4] + sync_key + sync_key Ch4 + 0x93 + 0x29 + 0x02 + 0xFF + 0.5 + + + [Channel1] + reset_key + Default Key + 0x90 + 0x29 + 0x01 + 0.5 + + + [Channel2] + reset_key + Default Key + 0x91 + 0x29 + 0x01 + 0.5 + + + [Channel3] + reset_key + Default Key + 0x92 + 0x29 + 0x01 + 0.5 + + + [Channel4] + reset_key + Default Key + 0x93 + 0x29 + 0x01 + 0.5 + + + [Channel1] + quantize + Quantize + 0x94 + 0x47 + 0x02 + 0x01 + 0.5 + + + [Channel2] + quantize + Quantize + 0x95 + 0x47 + 0x02 + 0x01 + 0.5 + + + [Channel3] + quantize + Quantize + 0x96 + 0x47 + 0x02 + 0x01 + 0.5 + + + [Channel4] + quantize + Quantize + 0x97 + 0x47 + 0x02 + 0x01 + 0.5 + + + + diff -Nru mixxx-2.2.3~dfsg/res/controllers/Denon-MC7000-scripts.js mixxx-2.2.4~dfsg/res/controllers/Denon-MC7000-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Denon-MC7000-scripts.js 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Denon-MC7000-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,867 @@ +/** + * Denon DJ MC7000 DJ controller script for Mixxx 2.2.3 + * + * Started in Dec. 2019 by OsZ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Before using the mapping please make sure your MC7000 controller works for + * your operating system. For Windows you need driver software by Denon, Mac users + * should be lucky as it shall work out-of-the-box. Linux users need to know that + * the MC7000 internal audio interface is not available out-of-the-box for + * older Linux Kernels. You should upgrade your Kernel to minimum versions + * LTS: 4.19.105 or 5.4.21, stable branch 5.5.5 or current 5.6 (2020-Feb-19). + * Newer Kernels will surely also provide native audio support for this controller. +**/ + +var MC7000 = {}; + +/*/////////////////////////////////// +// USER VARIABLES BEGIN // +///////////////////////////////////*/ + +// Wanna have Needle Search active while playing a track ? +// In any case Needle Search is available holding "SHIFT" down. +// can be true or false (recommended: false) +MC7000.needleSearchPlay = false; + +// Possible pitchfader rateranges given in percent. +// can be cycled through be the RANGE buttons. +MC7000.rateRanges = [ + 4/100, // default: 4/100 + 6/100, // default: 6/100 + 10/100, // default: 10/100 + 16/100, // default: 16/100 + 24/100, // default: 24/100 +]; + +// Platter Ring LED mode +// Mode 0 = Single "off" LED chase (all others "on") +// Mode 1 = Single "on" LED chase (all others "off") +// use "SHIFT" + "DECK #" to toggle between both modes +MC7000.modeSingleLED = 1; // default: 1 + +// Set Vinyl Mode on ("true") or off ("false") when MIXXX starts. +// This sets the Jog Wheel touch detection / Vinyl Mode +// and the Jog LEDs ("VINYL" on = spinny, "VINYL" off = track position). +MC7000.VinylModeOn = true; // default: true + +// Scratch algorithm parameters +MC7000.scratchParams = { + recordSpeed: 33.3, // default: 33.3 + alpha: (1.0/10), // default: (1.0/10) + beta: (1.0/10)/32 // default: (1.0/10)/32 +}; + +// Sensitivity of the jog wheel (also depends on audio latency) +MC7000.jogParams = { + // Lower values for less, higher values for more sensitive + jogSensitivity: 30, // default: 30 + // this will limit the parameter of "jog" (keep between 0.5 and 3) + maxJogValue: 3 // default: 3 +}; + +/*///////////////////////////////// +// USER VARIABLES END // +/////////////////////////////////*/ + + +/* OTHER VARIABLES - DONT'T TOUCH EXCEPT YOU KNOW WHAT YOU DO */ + +// Resolution of the jog wheel, set so the spinny +// Jog LED to match exactly the movement of the Jog Wheel +// The physical resolution seems to be around 1100 +MC7000.jogWheelTicksPerRevolution = 894; + +// must be "true" for Needle Search to be active +MC7000.needleSearchTouched = [true, true, true, true]; + +// initial value for VINYL mode per Deck (see above for user input) +MC7000.isVinylMode = [MC7000.VinylModeOn, MC7000.VinylModeOn, MC7000.VinylModeOn, MC7000.VinylModeOn]; + +// used to keep track of which the rateRange of each slider. +// value used as an index to MC7000.rateRanges +MC7000.currentRateRangeIndex = [0, 0, 0, 0]; + +// initialize the "factor" function for Spinback +MC7000.factor = []; + +// initialize the PAD Mode to Hot Cue and all others off when starting +MC7000.PADModeCue = [true, true, true, true]; +MC7000.PADModeCueLoop = [false, false, false, false]; +MC7000.PADModeFlip = [false, false, false, false]; +MC7000.PADModeRoll = [false, false, false, false]; +MC7000.PADModeSavedLoop = [false, false, false, false]; +MC7000.PADModeSlicer = [false, false, false, false]; +MC7000.PADModeSlicerLoop = [false, false, false, false]; +MC7000.PADModeSampler = [false, false, false, false]; +MC7000.PADModeVelSamp = [false, false, false, false]; +MC7000.PADModePitch = [false, false, false, false]; + +// Define the MIDI signal for red LED at VU Meters +MC7000.VuMeterLEDPeakValue = 0x76; + +// PAD Mode Colors +MC7000.padColor = { + "alloff": 0x01, // switch off completely + // Hot Cue + "hotcueon": 0x04, // darkblue Hot Cue active + "hotcueoff": 0x02, // lightblue Hot Cue inactive + // Cue Loop + "cueloopon": 0x0D, // Cueloop colour for activated cue point + "cueloopoff": 0x1A, // Cueloop colour inactive + // Roll + "rollon": 0x20, // BeatloopRoll active colour + "rolloff": 0x06, // BeatloopRoll off colour + // Slicer + "sliceron": 0x11, // activated Slicer + "slicerJumpFwd": 0x31, // Sliver forward jump + "slicerJumpBack": 0x31, // Sliver backward jump + // Sampler + "samplerloaded": 0x38, // dark pink Sampler loaded colour + "samplerplay": 0x09, // green Sampler playing + "sampleroff": 0x12 // light pink Sampler standard colour +}; + +/* DECK INITIALIZATION */ +MC7000.init = function() { + + // set default Master Volume to 85% to give a little head room for mixing + // engine.setValue("[Master]", "gain", 0.85); + + // VU meters + engine.makeConnection("[Channel1]", "VuMeter", MC7000.VuMeter); + engine.makeConnection("[Channel2]", "VuMeter", MC7000.VuMeter); + engine.makeConnection("[Channel3]", "VuMeter", MC7000.VuMeter); + engine.makeConnection("[Channel4]", "VuMeter", MC7000.VuMeter); + + // Platter Ring LED + midi.sendShortMsg(0x90, 0x64, MC7000.modeSingleLED); + midi.sendShortMsg(0x91, 0x64, MC7000.modeSingleLED); + midi.sendShortMsg(0x92, 0x64, MC7000.modeSingleLED); + midi.sendShortMsg(0x93, 0x64, MC7000.modeSingleLED); + engine.makeConnection("[Channel1]", "playposition", MC7000.JogLed); + engine.makeConnection("[Channel2]", "playposition", MC7000.JogLed); + engine.makeConnection("[Channel3]", "playposition", MC7000.JogLed); + engine.makeConnection("[Channel4]", "playposition", MC7000.JogLed); + + // Vinyl mode LEDs + midi.sendShortMsg(0x90, 0x07, MC7000.isVinylMode ? 0x7F: 0x01); + midi.sendShortMsg(0x91, 0x07, MC7000.isVinylMode ? 0x7F: 0x01); + midi.sendShortMsg(0x92, 0x07, MC7000.isVinylMode ? 0x7F: 0x01); + midi.sendShortMsg(0x93, 0x07, MC7000.isVinylMode ? 0x7F: 0x01); + + // HotCue Mode LEDs + for (var i = 1; i <= 8; i++) { + engine.makeConnection("[Channel1]", "hotcue_"+i+"_enabled", MC7000.HotCueLED); + engine.makeConnection("[Channel2]", "hotcue_"+i+"_enabled", MC7000.HotCueLED); + engine.makeConnection("[Channel3]", "hotcue_"+i+"_enabled", MC7000.HotCueLED); + engine.makeConnection("[Channel4]", "hotcue_"+i+"_enabled", MC7000.HotCueLED); + } + + // Sampler Mode LEDs + for (i = 1; i <= 8; i++) { + engine.makeConnection("[Sampler"+i+"]", "track_loaded", MC7000.SamplerLED); + engine.makeConnection("[Sampler"+i+"]", "play", MC7000.SamplerLED); + } + + // Sampler Volume Control + MC7000.samplerLevel = function(channel, control, value) { + // check if the Sampler Volume is at Zero and if so hide the sampler bank + if (value > 0x00) { + engine.setValue("[Samplers]", "show_samplers", true); + } else { + engine.setValue("[Samplers]", "show_samplers", false); + } + // get the Sampler Rows opened with its details + engine.setValue("[SamplerRow1]", "expanded", true); + engine.setValue("[SamplerRow2]", "expanded", true); + + //control up to 16 sampler volumes with the one knob on the mixer + for (var i = 1; i <= 16; i++) { + engine.setValue("[Sampler"+i+"]", "pregain", script.absoluteNonLin(value, 0, 1.0, 4.0)); + } + }; + + // The SysEx message to send to the controller to force the midi controller + // to send the status of every item on the control surface. + var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7]; + + // After midi controller receive this Outbound Message request SysEx Message, + // midi controller will send the status of every item on the + // control surface. (Mixxx will be initialized with current values) + midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length); +}; + +// PAD Mode Hot Cue +MC7000.padModeCue = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + // set HotCue Mode true + MC7000.PADModeCue[deckNumber] = true; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + // change PAD color when switching to Hot Cue Mode + for (var i = 1; i <= 8; i++) { + if (engine.getValue(group, "hotcue_" + i + "_enabled", true)) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.hotcueon); + } else { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.hotcueoff); + } + } +}; +// PAD Mode Cue Loop +MC7000.padModeCueLoop = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = true; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.alloff); + } +}; +// PAD Mode Flip +MC7000.padModeFlip = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = true; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, + MC7000.padColor.alloff); + } +}; +// PAD Mode Roll +MC7000.padModeRoll = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = true; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.rolloff); + } +}; +// PAD Mode Saved Loop +MC7000.padModeSavedLoop = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = true; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.alloff); + } +}; +// PAD Mode Slicer +MC7000.padModeSlicer = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = true; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.sliceron); + } +}; +// PAD Mode Slicer Loop +MC7000.padModeSlicerLoop = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = true; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.alloff); + } +}; +// PAD Mode Sampler +MC7000.padModeSampler = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = true; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = false; + } + // change PAD color when switching to Sampler Mode + for (var i = 1; i <= 8; i++) { + if (engine.getValue("[Sampler" + i + "]", "play")) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.samplerplay); + } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.sampleroff); + } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1 && + engine.getValue("[Sampler" + i + "]", "play") === 0) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.samplerloaded); + } + } +}; +// PAD Mode Velocity Sampler +MC7000.padModeVelSamp = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = false; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = true; + MC7000.PADModePitch[deckNumber] = false; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.alloff); + } +}; +// PAD Mode Pitch +MC7000.padModePitch = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (value === 0x00) + return; // don't respond to note off messages + if (value === 0x7F) { + MC7000.PADModeCue[deckNumber] = false; + MC7000.PADModeCueLoop[deckNumber] = false; + MC7000.PADModeFlip[deckNumber] = false; + MC7000.PADModeRoll[deckNumber] = false; + MC7000.PADModeSavedLoop[deckNumber] = false; + MC7000.PADModeSlicer[deckNumber] = true; + MC7000.PADModeSlicerLoop[deckNumber] = false; + MC7000.PADModeSampler[deckNumber] = false; + MC7000.PADModeVelSamp[deckNumber] = false; + MC7000.PADModePitch[deckNumber] = true; + } + for (var i = 1; i <= 8; i++) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, + MC7000.padColor.alloff); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, + MC7000.padColor.alloff); + } +}; + +// PAD buttons +MC7000.PadButtons = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + + // activate and clear Hot Cues + if (MC7000.PADModeCue[deckNumber] && + engine.getValue(group, "track_loaded") === 1) { + for (var i = 1; i <= 8; i++) { + if (control === 0x14 + i - 1 && value >= 0x01) { + engine.setValue(group, "hotcue_" + i + "_activate", true); + } else { + engine.setValue(group, "hotcue_" + i + "_activate", false); + } + if (control === 0x1C + i - 1 && value >= 0x01) { + engine.setValue(group, "hotcue_" + i + "_clear", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, + MC7000.padColor.hotcueoff); + } + } + } else if (MC7000.PADModeFlip[deckNumber]) { + return; + } else if (MC7000.PADModeFlip[deckNumber]) { + return; + } else if (MC7000.PADModeRoll[deckNumber]) { + if (control === 0x14 && value >= 0x01) { + engine.setValue(group, "beatlooproll_0.0625_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14, MC7000.padColor.rollon); + } else if (control === 0x14 && value >= 0x00) { + engine.setValue(group, "beatlooproll_0.0625_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14, MC7000.padColor.rolloff); + } else if (control === 0x15 && value >= 0x01) { + engine.setValue(group, "beatlooproll_0.125_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x15, MC7000.padColor.rollon); + } else if (control === 0x15 && value >= 0x00) { + engine.setValue(group, "beatlooproll_0.125_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x15, MC7000.padColor.rolloff); + } else if (control === 0x16 && value >= 0x01) { + engine.setValue(group, "beatlooproll_0.25_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x16, MC7000.padColor.rollon); + } else if (control === 0x16 && value >= 0x00) { + engine.setValue(group, "beatlooproll_0.25_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x16, MC7000.padColor.rolloff); + } else if (control === 0x17 && value >= 0x01) { + engine.setValue(group, "beatlooproll_0.5_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x17, MC7000.padColor.rollon); + } else if (control === 0x17 && value >= 0x00) { + engine.setValue(group, "beatlooproll_0.5_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x17, MC7000.padColor.rolloff); + } else if (control === 0x18 && value >= 0x01) { + engine.setValue(group, "beatlooproll_1_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x18, MC7000.padColor.rollon); + } else if (control === 0x18 && value >= 0x00) { + engine.setValue(group, "beatlooproll_1_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x18, MC7000.padColor.rolloff); + } else if (control === 0x19 && value >= 0x01) { + engine.setValue(group, "beatlooproll_2_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x19, MC7000.padColor.rollon); + } else if (control === 0x19 && value >= 0x00) { + engine.setValue(group, "beatlooproll_2_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x19, MC7000.padColor.rolloff); + } else if (control === 0x1A && value >= 0x01) { + engine.setValue(group, "beatlooproll_4_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1A, MC7000.padColor.rollon); + } else if (control === 0x1A && value >= 0x00) { + engine.setValue(group, "beatlooproll_4_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1A, MC7000.padColor.rolloff); + } else if (control === 0x1B && value >= 0x01) { + engine.setValue(group, "beatlooproll_8_activate", true); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1B, MC7000.padColor.rollon); + } else if (control === 0x1B && value >= 0x00) { + engine.setValue(group, "beatlooproll_8_activate", false); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1B, MC7000.padColor.rolloff); + } + } else if (MC7000.PADModeSavedLoop[deckNumber]) { + return; + } else if (MC7000.PADModeSlicer[deckNumber]) { + if (value > 0) { + var beats = 1 << (control % 4); + if (control > 0x17) { + engine.setValue(group, "beatjump_" + beats + "_backward", value); + midi.sendShortMsg(0x94 + deckNumber -1, control, MC7000.padColor.slicerJumpBack); + } else { + engine.setValue(group, "beatjump_" + beats + "_forward", value); + midi.sendShortMsg(0x94 + deckNumber -1, control, MC7000.padColor.slicerJumpFwd); + } + } else { + midi.sendShortMsg(0x94 + deckNumber -1, control, MC7000.padColor.sliceron); + } + } else if (MC7000.PADModeSlicerLoop[deckNumber]) { + return; + } else if (MC7000.PADModeSampler[deckNumber]) { + for (i = 1; i <= 8; i++) { + if (control === 0x14 + i - 1 && value >= 0x01) { + if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) { + engine.setValue("[Sampler" + i + "]", "LoadSelectedTrack", 1); + } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === + 1) { + engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); + } + } else if (control === 0x1C + i - 1 && value >= 0x01) { + if (engine.getValue("[Sampler" + i + "]", "play") === 1) { + engine.setValue("[Sampler" + i + "]", "cue_gotoandstop", 1); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, + MC7000.padColor.samplerloaded); + } else { + engine.setValue("[Sampler" + i + "]", "eject", 1); + midi.sendShortMsg(0x94 + deckNumber - 1, 0x1C + i - 1, + MC7000.padColor.sampleroff); + engine.setValue("[Sampler" + i + "]", "eject", 0); + } + } + } + } else if (MC7000.PADModeVelSamp[deckNumber]) { + return; + } else if (MC7000.PADModePitch[deckNumber]) { + return; + } +}; + +// Toggle Vinyl Mode +MC7000.vinylModeToggle = function(channel, control, value, status, group) { + if (value === 0x00) + return; // don't respond to note off messages + + if (value === 0x7F) { + var deckNumber = script.deckFromGroup(group); + MC7000.isVinylMode[deckNumber] = !MC7000.isVinylMode[deckNumber]; + midi.sendShortMsg(0x90 + channel, 0x07, + MC7000.isVinylMode[deckNumber] ? 0x7F : 0x01); + } +}; + +// The button that enables/disables scratching +MC7000.wheelTouch = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (MC7000.isVinylMode[deckNumber]) { + if (value === 0x7F) { + engine.scratchEnable(deckNumber, MC7000.jogWheelTicksPerRevolution, + MC7000.scratchParams.recordSpeed, + MC7000.scratchParams.alpha, + MC7000.scratchParams.beta); + } else { + engine.scratchDisable(deckNumber); + } + } +}; + +// The wheel that actually controls the scratching +MC7000.wheelTurn = function(channel, control, value, status, group) { + // A: For a control that centers on 0: + var numTicks = (value < 0x64) ? value : (value - 128); + var deckNumber = script.deckFromGroup(group); + if (engine.isScratching(deckNumber)) { + // Scratch! + engine.scratchTick(deckNumber, numTicks); + } else { + // Pitch bend + var jogDelta = numTicks / MC7000.jogWheelTicksPerRevolution * + MC7000.jogParams.jogSensitivity; + var jogAbsolute = jogDelta + engine.getValue(group, "jog"); + engine.setValue( + group, "jog", + Math.max(-MC7000.jogParams.maxJogValue, + Math.min(MC7000.jogParams.maxJogValue, jogAbsolute))); + } +}; + +// Needle Search Touch detection +MC7000.needleSearchTouch = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + if (engine.getValue(group, "play")) { + MC7000.needleSearchTouched[deckNumber] = + MC7000.needleSearchPlay && (!!value); + } else { + MC7000.needleSearchTouched[deckNumber] = !!value; + } +}; + +// Needle Search Touch while "SHIFT" button is pressed +MC7000.needleSearchTouchShift = function(channel, control, value, status, + group) { + var deckNumber = script.deckFromGroup(group); + MC7000.needleSearchTouched[deckNumber] = !!value; +}; + +// Needle Search Position detection (MSB) +MC7000.needleSearchMSB = function(channel, control, value) { + MC7000.needleDropMSB = value; // just defining rough position +}; + +// Needle Search Position detection (MSB + LSB) +MC7000.needleSearchStripPosition = function(channel, control, value, status, + group) { + var deckNumber = script.deckFromGroup(group); + if (MC7000.needleSearchTouched[deckNumber]) { + var fullValue = (MC7000.needleDropMSB << 7) + + value; // move MSB 7 binary gigits to the left and add LSB + var position = (fullValue / 0x3FFF); // devide by all possible positions to + // get relative between 0 - 1 + engine.setParameter(group, "playposition", position); + } +}; + +// Pitch Fader (MSB) +MC7000.pitchFaderMSB = function(channel, control, value) { + MC7000.pitchMSB = value; // just defining rough position +}; + +// Pitch Fader Position (MSB + LSB) +MC7000.pitchFaderPosition = function(channel, control, value, status, group) { + var fullValue = (MC7000.pitchMSB << 7) + value; + var position = + 1 - (fullValue / 0x3FFF); // 1 - () to turn around the direction + engine.setParameter(group, "rate", position); +}; + +// Next Rate range toggle +MC7000.nextRateRange = function(midichan, control, value, status, group) { + if (value === 0) + return; // don't respond to note off messages + var deckNumber = script.deckFromGroup(group); + // increment currentRateRangeIndex and check for overflow + if (++MC7000.currentRateRangeIndex[deckNumber - 1] === + MC7000.rateRanges.length) { + MC7000.currentRateRangeIndex[deckNumber - 1] = 0; + } + engine.setValue( + group, "rateRange", + MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]); +}; + +// Previous Rate range toggle +MC7000.prevRateRange = function(midichan, control, value, status, group) { + if (value === 0) + return; // don't respond to note off messages + var deckNumber = script.deckFromGroup(group); + // decrement currentRateRangeIndex and check for underflow + if (--MC7000.currentRateRangeIndex[deckNumber - 1] < 0) { + MC7000.currentRateRangeIndex[deckNumber - 1] = MC7000.rateRanges.length - 1; + } + engine.setValue( + group, "rateRange", + MC7000.rateRanges[MC7000.currentRateRangeIndex[deckNumber - 1]]); +}; + +// Key Select +MC7000.keySelect = function(midichan, control, value, status, group) { + if (value === 0x01) { + engine.setValue(group, "pitch_up", true); + } else if (value === 0x7F) { + engine.setValue(group, "pitch_down", true); + } +}; + +// Assign Channel to Crossfader +MC7000.crossfaderAssign = function(channel, control, value, status, group) { + if (value === 0x00) { + engine.setValue(group, "orientation", 1); // Centre position + } else if (value === 0x01) { + engine.setValue(group, "orientation", 0); // Right position + } else if (value === 0x02) { + engine.setValue(group, "orientation", 2); // Left position + } +}; + +// Assign Spinback length to STOP TIME knob +MC7000.stopTime = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + // "factor" for engine.brake() + // this formula produces factors between 31 (min STOP TIME for ca 7 sec back + // in track) and 1 (max STOP TIME for ca 18.0 sec back in track) + MC7000.factor[deckNumber] = (1.1 - (value / 127)) * 30 - 2; +}; + +// Use the CENSOR button as Spinback with STOP TIME adjusted length +MC7000.censor = function(channel, control, value, status, group) { + var deckNumber = script.deckFromGroup(group); + var deck = + parseInt(group.substring(8, 9)); // work out which deck we are using + engine.brake(deck, value > 0, MC7000.factor[deckNumber], + -15); // start at a rate of -15 and decrease by "factor" +}; + +/* SET CROSSFADER CURVE */ +MC7000.crossFaderCurve = function(control, value) { + script.crossfaderCurve(value); +}; + +/* Set FX wet/dry value */ +MC7000.fxWetDry = function(midichan, control, value, status, group) { + var numTicks = (value < 0x64) ? value: (value - 128); + var newVal = engine.getValue(group, "mix") + numTicks/64*2; + engine.setValue(group, "mix", Math.max(0, Math.min(1, newVal))); + + +}; + +/* LEDs for VuMeter */ +// VuMeters only for Channel 1-4 / Master is on Hardware +MC7000.VuMeter = function(value, group) { + var VULevelOutValue = engine.getValue(group, "PeakIndicator") ? MC7000.VuMeterLEDPeakValue : value*value*value*value*0x69, + deckNumber = script.deckFromGroup(group); + + midi.sendShortMsg(0xB0 + deckNumber - 1, 0x1F, VULevelOutValue); +}; + +/* LEDs around Jog wheel */ +MC7000.JogLed = function(value, group) { + var deckNumber = script.deckFromGroup(group); + // do nothing before track starts + if (value < 0) return; + + var trackDuration = engine.getValue(group, "duration"), + position = value * trackDuration / 60 * MC7000.scratchParams.recordSpeed, + // LED ring contains 48 segments with each LED activated by the next even number + LEDmidiSignal = 48 * 2, + activeLED = MC7000.isVinylMode[deckNumber] ? Math.round(position * LEDmidiSignal) % LEDmidiSignal : value * LEDmidiSignal; + + midi.sendShortMsg(0x90 + deckNumber -1, 0x06, activeLED); +}; + +// initial HotCue LED when loading a track with already existing hotcues +MC7000.HotCueLED = function(value, group) { + var deckNumber = script.deckFromGroup(group); + if (MC7000.PADModeCue[deckNumber]) { + for (var i = 1; i <= 8; i++) { + if (value === 1) { + if (engine.getValue(group, "hotcue_"+i+"_enabled") === 1) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.hotcueon); + } + } else { + if (engine.getValue(group, "hotcue_"+i+"_enabled") === 0) { + midi.sendShortMsg(0x94 + deckNumber - 1, 0x14 + i - 1, MC7000.padColor.hotcueoff); + } + } + } + } +}; + +// Sampler LED +MC7000.SamplerLED = function() { + for (var j = 1; j <= 4; j++) { + for (var i = 1; i <= 8; i++) { + if (MC7000.PADModeSampler[j]) { + if (engine.getValue("[Sampler"+i+"]", "track_loaded") === 1) { + if (engine.getValue("[Sampler"+i+"]", "play") === 0) { + midi.sendShortMsg(0x94 + j - 1, 0x14 + i - 1, MC7000.padColor.samplerloaded); + } else { + midi.sendShortMsg(0x94 + j - 1, 0x14 + i - 1, MC7000.padColor.samplerplay); + } + } else if (engine.getValue("[Sampler"+i+"]", "track_loaded") === 0) { + midi.sendShortMsg(0x94 + j - 1, 0x14 + i - 1, MC7000.padColor.sampleroff); + } + } + } + } +}; + +/* CONTROLLER SHUTDOWN */ +MC7000.shutdown = function() { + + // Need to switch off LEDs one by one, + // otherwise the controller cannot handle the signal traffic + + // Switch off Transport section LEDs + for (var i = 0; i <= 3; i++) { + midi.sendShortMsg(0x90 + i, 0x00, 0x01); + midi.sendShortMsg(0x90 + i, 0x01, 0x01); + midi.sendShortMsg(0x90 + i, 0x02, 0x01); + midi.sendShortMsg(0x90 + i, 0x03, 0x01); + midi.sendShortMsg(0x90 + i, 0x04, 0x01); + midi.sendShortMsg(0x90 + i, 0x05, 0x01); + } + // Switch off Loop Section LEDs + for (i = 0; i <= 3; i++) { + midi.sendShortMsg(0x94 + i, 0x32, 0x01); + midi.sendShortMsg(0x94 + i, 0x33, 0x01); + midi.sendShortMsg(0x94 + i, 0x34, 0x01); + midi.sendShortMsg(0x94 + i, 0x35, 0x01); + midi.sendShortMsg(0x94 + i, 0x38, 0x01); + midi.sendShortMsg(0x94 + i, 0x39, 0x01); + // switch PAD Mode to CUE LED + midi.sendShortMsg(0x94 + i, 0x00, 0x04); + } + // Switch all PAD LEDs to HotCue mode + for (i = 0x14; i <= 0x1B; i++) { + midi.sendShortMsg(0x94, i, 0x02); + midi.sendShortMsg(0x95, i, 0x02); + midi.sendShortMsg(0x96, i, 0x02); + midi.sendShortMsg(0x97, i, 0x02); + } + // Switch off Channel Cue, VINYL, SLIP, KEY LOCK LEDs + for (i = 0; i <= 3; i++) { + midi.sendShortMsg(0x90 + i, 0x07, 0x01); + midi.sendShortMsg(0x90 + i, 0x0F, 0x01); + midi.sendShortMsg(0x90 + i, 0x0D, 0x01); + midi.sendShortMsg(0x90 + i, 0x1B, 0x01); + } + // Switch off FX Section LEDs + for (i = 0; i <= 1; i++) { + midi.sendShortMsg(0x98 + i, 0x00, 0x01); + midi.sendShortMsg(0x98 + i, 0x01, 0x01); + midi.sendShortMsg(0x98 + i, 0x02, 0x01); + midi.sendShortMsg(0x98 + i, 0x04, 0x01); + midi.sendShortMsg(0x98 + i, 0x0A, 0x01); + midi.sendShortMsg(0x98 + i, 0x05, 0x01); + midi.sendShortMsg(0x98 + i, 0x06, 0x01); + midi.sendShortMsg(0x98 + i, 0x07, 0x01); + midi.sendShortMsg(0x98 + i, 0x08, 0x01); + } + // Reset Level Meters and JogLED + for (i = 0; i <= 3; i++) { + // Switch off Level Meters + midi.sendShortMsg(0xB0 + i, 0x1F, 0x00); + // Platter Ring: Reset JogLED to Zero position + midi.sendShortMsg(0x90 + i, 0x06, 0x00); + // Platter Ring: Switch all LEDs on + midi.sendShortMsg(0x90 + i, 0x64, 0x00); + } +}; diff -Nru mixxx-2.2.3~dfsg/res/controllers/.eslintrc.json mixxx-2.2.4~dfsg/res/controllers/.eslintrc.json --- mixxx-2.2.3~dfsg/res/controllers/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/.eslintrc.json 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,10 @@ +{ + "globals": { + "_": "readonly", + "color": "readonly", + "components": "readonly", + "engine": "readonly", + "midi": "readonly", + "script": "readonly" + } +} diff -Nru mixxx-2.2.3~dfsg/res/controllers/Hercules_DJControl_Inpulse_300.midi.xml mixxx-2.2.4~dfsg/res/controllers/Hercules_DJControl_Inpulse_300.midi.xml --- mixxx-2.2.3~dfsg/res/controllers/Hercules_DJControl_Inpulse_300.midi.xml 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Hercules_DJControl_Inpulse_300.midi.xml 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,2669 @@ + + + + Hercules DJControl Inpulse 300 + DJ Phatso for Hercules Technical Support + MIDI Preset for Hercules DJControl Inpulse 300 + https://www.mixxx.org/wiki/doku.php/hercules_djcontrol_inpulse_300 + https://www.mixxx.org/forums/viewtopic.php?f=7&t=12599 + + + + + + + + + + + + + + [Library] + MoveFocus + Browser button + 0x90 + 0x00 + + + + + + + + [AutoDJ] + enabled + AutoDJ On/Off + 0x90 + 0x03 + + + + + + + + [Channel1] + play + Play button + 0x91 + 0x07 + + + + + + + [Channel1] + cue_default + Cue button + 0x91 + 0x06 + + + + + + + [Channel1] + sync_enabled + Sync button + 0x91 + 0x05 + + + + + + + [Channel1] + pfl + PFL button + 0x91 + 0x0C + + + + + + + [Channel1] + LoadSelectedTrack + LOAD A button + 0x91 + 0x0D + + + + + + + [Channel1] + slip_enabled + SLIP button + 0x91 + 0x01 + + + + + + + [Channel1] + keylock + Q button + 0x91 + 0x02 + + + + + + + + [Channel1] + DJCi300.vinylButton + Vinyl Deck A + 0x91 + 0x03 + + + + + + + + [Channel1] + DJCi300.wheelTouch + Jog Wheel Touch Deck A + 0x91 + 0x08 + + + + + + + + [Channel1] + beatloop_4_activate + Loop In button + 0x91 + 0x09 + + + + + + [Channel1] + reloop_toggle + Loop Out button + 0x91 + 0x0A + + + + + + + + [EffectRack1_EffectUnit1_Effect3] + enabled + FX Rack 1 - Slot 3 On/Off + 0x91 + 0x00 + + + + + + + + + + [Channel2] + play + Play button + 0x92 + 0x07 + + + + + + + [Channel2] + cue_default + Cue button + 0x92 + 0x06 + + + + + + + [Channel2] + sync_enabled + Sync button + 0x92 + 0x05 + + + + + + + [Channel2] + pfl + PFL button + 0x92 + 0x0C + + + + + + + [Channel2] + LoadSelectedTrack + LOAD B button + 0x92 + 0x0D + + + + + + + [Channel2] + slip_enabled + SLIP button + 0x92 + 0x01 + + + + + + + [Channel2] + keylock + Q button + 0x92 + 0x02 + + + + + + + [Channel2] + DJCi300.vinylButton + Vinyl Deck B + 0x92 + 0x03 + + + + + + + [Channel2] + DJCi300.wheelTouch + Jog Wheel Touch Deck B + 0x92 + 0x08 + + + + + + + [Channel2] + beatloop_4_activate + Loop In button + 0x92 + 0x09 + + + + + + [Channel2] + reloop_toggle + Loop Out button + 0x92 + 0x0A + + + + + + + + [EffectRack1_EffectUnit2_Effect3] + enabled + FX Rack 2 - Slot 3 On/Off + 0x92 + 0x00 + + + + + + + + + + [Master] + maximize_library + Browser button - Maximize Library view + 0x93 + 0x00 + + + + + + + + + [Channel1] + DJCi300.wheelTouchShift + Jog Wheel Shift Touch Deck A + 0x94 + 0x08 + + + + + + + + [Channel1] + play_stutter + SHIFT + Play: Play Stutter + 0x94 + 0x07 + + + + + + + [Channel1] + start_play + SHIFT + Cue: REWIND to beginning + 0x94 + 0x06 + + + + + + + [Channel1] + sync_master + SHIFT + Sync: Sync Master + 0x94 + 0x05 + + + + + + + [Channel1] + loop_halve + SHIFT + Loop In: Loop Half + 0x94 + 0x09 + + + + + + [Channel1] + loop_double + SHIFT + Loop Out: Loop Double + 0x94 + 0x0A + + + + + + + [EffectRack1_EffectUnit1_Effect3] + next_effect + SHIFT + Effect ON: Next effect + 0x94 + 0x00 + + + + + + + + + [Channel2] + DJCi300.wheelTouchShift + Jog Wheel Shift Touch Deck B + 0x95 + 0x08 + + + + + + + + [Channel2] + play_stutter + SHIFT + Play: Play Stutter + 0x95 + 0x07 + + + + + + + [Channel2] + start_play + SHIFT + Cue: REWIND to beginning + 0x95 + 0x06 + + + + + + + [Channel2] + sync_master + SHIFT + Sync: Sync Master + 0x95 + 0x05 + + + + + + + [Channel2] + loop_halve + SHIFT + Loop In: Loop Half + 0x95 + 0x09 + + + + + + [Channel2] + loop_double + SHIFT + Loop Ou: Loop Double + 0x95 + 0x0A + + + + + + + [EffectRack1_EffectUnit2_Effect3] + next_effect + SHIFT + Effect ON: Next effect + 0x95 + 0x00 + + + + + + + + + + [Channel1] + hotcue_1_activate + PAD 1 + 0x96 + 0x00 + + + + + + [Channel1] + hotcue_2_activate + PAD 2 + 0x96 + 0x01 + + + + + + [Channel1] + hotcue_3_activate + PAD 3 + 0x96 + 0x02 + + + + + + [Channel1] + hotcue_4_activate + PAD 4 + 0x96 + 0x03 + + + + + + [Channel1] + hotcue_5_activate + PAD 5 + 0x96 + 0x04 + + + + + + [Channel1] + hotcue_6_activate + PAD 6 + 0x96 + 0x05 + + + + + + [Channel1] + hotcue_7_activate + PAD 7 + 0x96 + 0x06 + + + + + + [Channel1] + hotcue_8_activate + PAD 8 + 0x96 + 0x07 + + + + + + + [Channel1] + hotcue_1_clear + PAD 1 + 0x96 + 0x08 + + + + + + [Channel1] + hotcue_2_clear + PAD 2 + 0x96 + 0x09 + + + + + + [Channel1] + hotcue_3_clear + PAD 3 + 0x96 + 0x0A + + + + + + [Channel1] + hotcue_4_clear + PAD 4 + 0x96 + 0x0B + + + + + + [Channel1] + hotcue_5_clear + PAD 5 + 0x96 + 0x0C + + + + + + [Channel1] + hotcue_6_clear + PAD 6 + 0x96 + 0x0D + + + + + + [Channel1] + hotcue_7_clear + PAD 7 + 0x96 + 0x0E + + + + + + [Channel1] + hotcue_8_clear + PAD 8 + 0x96 + 0x0F + + + + + + + [Channel1] + beatlooproll_0.125_activate + Loop 1/8 Beat (Pad 1) + 0x96 + 0x10 + + + + + + [Channel1] + beatlooproll_0.25_activate + Loop 1/4 Beat (Pad 2) + 0x96 + 0x11 + + + + + + [Channel1] + beatlooproll_0.5_activate + Loop 1/2 Beat (Pad 3) + 0x96 + 0x12 + + + + + + [Channel1] + beatlooproll_1_activate + Loop 1 Beat (Pad 4) + 0x96 + 0x13 + + + + + + [Channel1] + beatlooproll_2_activate + Loop 2 Beat (Pad 5) + 0x96 + 0x14 + + + + + + [Channel1] + beatlooproll_4_activate + Loop 2 Beat (Pad 6) + 0x96 + 0x15 + + + + + + [Channel1] + beatlooproll_8_activate + Loop 8 Beat (Pad 7) + 0x96 + 0x16 + + + + + + [Channel1] + beatlooproll_16_activate + Loop 2 Beat (Pad 8) + 0x96 + 0x17 + + + + + + + [Sampler1] + cue_gotoandplay + PAD 1 + 0x96 + 0x30 + + + + + + [Sampler2] + cue_gotoandplay + PAD 2 + 0x96 + 0x31 + + + + + + [Sampler3] + cue_gotoandplay + PAD 3 + 0x96 + 0x32 + + + + + + [Sampler4] + cue_gotoandplay + PAD 4 + 0x96 + 0x33 + + + + + + [Sampler5] + cue_gotoandplay + PAD 5 + 0x96 + 0x34 + + + + + + [Sampler6] + cue_gotoandplay + PAD 6 + 0x96 + 0x35 + + + + + + [Sampler7] + cue_gotoandplay + PAD 7 + 0x96 + 0x36 + + + + + + [Sampler8] + cue_gotoandplay + PAD 8 + 0x96 + 0x37 + + + + + + + + + + + + + [Channel1] + beatjump_1_backward + PAD 1 + 0x96 + 0x70 + + + + + + [Channel1] + beatjump_1_forward + PAD 2 + 0x96 + 0x71 + + + + + + [Channel1] + beatjump_2_backward + PAD 3 + 0x96 + 0x72 + + + + + + [Channel1] + beatjump_2_forward + PAD 4 + 0x96 + 0x73 + + + + + + [Channel1] + beatjump_4_backward + PAD 5 + 0x96 + 0x74 + + + + + + [Channel1] + beatjump_4_forward + PAD 6 + 0x96 + 0x75 + + + + + + [Channel1] + beatjump_8_backward + PAD 7 + 0x96 + 0x76 + + + + + + [Channel1] + beatjump_8_forward + PAD 8 + 0x96 + 0x77 + + + + + + + + + + + [Channel2] + hotcue_1_activate + PAD 1 + 0x97 + 0x00 + + + + + + [Channel2] + hotcue_2_activate + PAD 2 + 0x97 + 0x01 + + + + + + [Channel2] + hotcue_3_activate + PAD 3 + 0x97 + 0x02 + + + + + + [Channel2] + hotcue_4_activate + PAD 4 + 0x97 + 0x03 + + + + + + [Channel2] + hotcue_5_activate + PAD 5 + 0x97 + 0x04 + + + + + + [Channel2] + hotcue_6_activate + PAD 6 + 0x97 + 0x05 + + + + + + [Channel2] + hotcue_7_activate + PAD 7 + 0x97 + 0x06 + + + + + + [Channel2] + hotcue_8_activate + PAD 8 + 0x97 + 0x07 + + + + + + + [Channel2] + hotcue_1_clear + PAD 1 + 0x97 + 0x08 + + + + + + [Channel2] + hotcue_2_clear + PAD 2 + 0x97 + 0x09 + + + + + + [Channel2] + hotcue_3_clear + PAD 3 + 0x97 + 0x0A + + + + + + [Channel2] + hotcue_4_clear + PAD 4 + 0x97 + 0x0B + + + + + + [Channel2] + hotcue_5_clear + PAD 5 + 0x97 + 0x0C + + + + + + [Channel2] + hotcue_6_clear + PAD 6 + 0x97 + 0x0D + + + + + + [Channel2] + hotcue_7_clear + PAD 7 + 0x97 + 0x0E + + + + + + [Channel2] + hotcue_8_clear + PAD 8 + 0x97 + 0x0F + + + + + + + [Channel2] + beatlooproll_0.125_activate + Loop 1/8 Beat (Pad 1) + 0x97 + 0x10 + + + + + + [Channel2] + beatlooproll_0.25_activate + Loop 1/4 Beat (Pad 2) + 0x97 + 0x11 + + + + + + [Channel2] + beatlooproll_0.5_activate + Loop 1/2 Beat (Pad 3) + 0x97 + 0x12 + + + + + + [Channel2] + beatlooproll_1_activate + Loop 1 Beat (Pad 4) + 0x97 + 0x13 + + + + + + [Channel2] + beatlooproll_2_activate + Loop 2 Beat (Pad 5) + 0x97 + 0x14 + + + + + + [Channel2] + beatlooproll_4_activate + Loop 2 Beat (Pad 6) + 0x97 + 0x15 + + + + + + [Channel2] + beatlooproll_8_activate + Loop 8 Beat (Pad 7) + 0x97 + 0x16 + + + + + + [Channel2] + beatlooproll_16_activate + Loop 2 Beat (Pad 8) + 0x97 + 0x17 + + + + + + + [Sampler1] + cue_gotoandplay + PAD 1 + 0x97 + 0x30 + + + + + + [Sampler2] + cue_gotoandplay + PAD 2 + 0x97 + 0x31 + + + + + + [Sampler3] + cue_gotoandplay + PAD 3 + 0x97 + 0x32 + + + + + + [Sampler4] + cue_gotoandplay + PAD 1 + 0x97 + 0x33 + + + + + + [Sampler5] + cue_gotoandplay + PAD 5 + 0x97 + 0x34 + + + + + + [Sampler6] + cue_gotoandplay + PAD 6 + 0x97 + 0x35 + + + + + + [Sampler7] + cue_gotoandplay + PAD 7 + 0x97 + 0x36 + + + + + + [Sampler8] + cue_gotoandplay + PAD 8 + 0x97 + 0x37 + + + + + + + + + + + + + [Channel2] + beatjump_1_backward + PAD 1 + 0x97 + 0x70 + + + + + + [Channel2] + beatjump_1_forward + PAD 2 + 0x97 + 0x71 + + + + + + [Channel2] + beatjump_2_backward + PAD 3 + 0x97 + 0x72 + + + + + + [Channel2] + beatjump_2_forward + PAD 4 + 0x97 + 0x73 + + + + + + [Channel2] + beatjump_4_backward + PAD 5 + 0x97 + 0x74 + + + + + + [Channel2] + beatjump_4_forward + PAD 6 + 0x97 + 0x75 + + + + + + [Channel2] + beatjump_8_backward + PAD 7 + 0x97 + 0x76 + + + + + + [Channel2] + beatjump_8_forward + PAD 8 + 0x97 + 0x77 + + + + + + + + + + + [Master] + crossfader + Crossfader + 0xB0 + 0x00 + + + + + + + [Library] + MoveVertical + Move Vertical (Browser Knob) + 0xB0 + 0x01 + + + + + + + + + + [Channel1] + volume + Volume Deck A + 0xB1 + 0x00 + + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + EQ LOW Deck A + 0xB1 + 0x02 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + EQ MID Deck A + 0xB1 + 0x03 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + EQ HIGH Deck A + 0xB1 + 0x04 + + + + + + + [Channel1] + pregain + Gain Deck A + 0xB1 + 0x05 + + + + + + + [QuickEffectRack1_[Channel1]] + super1 + Filter Deck A + 0xB1 + 0x01 + + + + + + + [Channel1] + rate + 0xB1 + 0x08 + + + + + + [Channel1] + rate + 0xB1 + 0x28 + + + + + + + [Channel1] + DJCi300.scratchWheel + Scratch Deck A (Jog-Wheel) + 0xB1 + 0x0A + + + + + + [Channel1] + DJCi300.bendWheel + Pitch Bend Deck A (Jog-Wheel) + 0xB1 + 0x09 + + + + + + [Channel1] + DJCi300.scratchPad + Pitch Bend Deck A (FX PAD 7 / 8 ) + 0xB1 + 0x0C + + + + + + + [EffectRack1_EffectUnit1_Effect3] + meta + Effect Rack 1 - Slot 3 Level + 0xB1 + 0x06 + + + + + + [EffectRack1_EffectUnit1] + mix + Effect Rack 1 - Dry/Wet Level + 0xB1 + 0x07 + + + + + + + + + + + [Channel2] + volume + Volume Deck A + 0xB2 + 0x00 + + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + EQ LOW Deck A + 0xB2 + 0x02 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + EQ MID Deck A + 0xB2 + 0x03 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + EQ HIGH Deck A + 0xB2 + 0x04 + + + + + + + [Channel2] + pregain + Gain Deck A + 0xB2 + 0x05 + + + + + + + [QuickEffectRack1_[Channel2]] + super1 + Filter Deck A + 0xB2 + 0x01 + + + + + + + [Channel2] + rate + 0xB2 + 0x08 + + + + + + [Channel2] + rate + 0xB2 + 0x28 + + + + + + + [Channel2] + DJCi300.scratchWheel + Pitch Bend Deck B (Jog-Wheel) + 0xB2 + 0x0A + + + + + + [Channel2] + DJCi300.bendWheel + Pitch Bend Deck B (Jog-Wheel) + 0xB2 + 0x09 + + + + + + [Channel2] + DJCi300.scratchPad + Pitch Bend Deck B (FX PAD 7 / 8 ) + 0xB2 + 0x0C + + + + + + + + [EffectRack1_EffectUnit2_Effect3] + meta + Effect Rack 2 - Slot 3 Level + 0xB2 + 0x06 + + + + + + [EffectRack1_EffectUnit2] + mix + Effect Rack 2 - Dry/Wet Level + 0xB2 + 0x07 + + + + + + + + + [Channel1] + DJCi300.scratchWheel + SHIFT + Scratch Deck A (Jog-Wheel) + 0xB4 + 0x0A + + + + + + + + + [Channel2] + DJCi300.scratchWheel + SHIFT + Scratch Deck B (Jog-Wheel) + 0xB5 + 0x0A + + + + + + + + + + + [Channel1] + play_indicator + PLAY LED Deck A + 0.5 + 1 + 0x91 + 0x07 + 0x7f + 0x0 + + + [Channel1] + cue_indicator + CUE LED Deck A + 0.5 + 1 + 0x91 + 0x06 + 0x7f + 0x0 + + + [Channel1] + start_play + CUE LED Deck A(SHIFT MODE) + 0.5 + 1 + 0x94 + 0x06 + 0x7f + 0x0 + + + [Channel1] + sync_enabled + SYNC LED Deck A + 0.5 + 1 + 0x91 + 0x05 + 0x7f + 0x0 + + + [Channel1] + sync_master + SYNC LED Deck A(SHIFT mode) + 0.5 + 1 + 0x93 + 0x05 + 0x7f + 0x0 + + + [Channel1] + slip_enabled + Slip button Deck A + 0.5 + 1 + 0x91 + 0x01 + 0x7f + 0x0 + + + [Channel1] + keylock + Q button Deck A + 0.5 + 1 + 0x91 + 0x02 + 0x7f + 0x0 + + + [Channel2] + play_indicator + PLAY LED Deck B + 0.5 + 1 + 0x92 + 0x07 + 0x7f + 0x0 + + + [Channel2] + cue_indicator + CUE LED Deck B + 0.5 + 1 + 0x92 + 0x06 + 0x7f + 0x0 + + + [Channel2] + sync_enabled + SYNC LED Deck B + 0.5 + 1 + 0x92 + 0x05 + 0x7f + 0x0 + + + [Channel2] + sync_master + SYNC LED Deck B(SHIFT mode) + 0.5 + 1 + 0x94 + 0x05 + 0x7f + 0x0 + + + [Channel2] + slip_enabled + Slip button Deck B + 0.5 + 1 + 0x92 + 0x01 + 0x7f + 0x0 + + + [Channel2] + keylock + Q button Deck B + 0.5 + 1 + 0x92 + 0x02 + 0x7f + 0x0 + + + + [Channel1] + beatloop_4_enabled + Loop In LED DA + 0.5 + 1 + 0x91 + 0x09 + 0x7f + 0x00 + + + [Channel2] + beatloop_4_enabled + Loop In LED DB + 0.5 + 1 + 0x92 + 0x09 + 0x7f + 0x00 + + + + [Channel1] + pfl + PFL LED DECK A + 0.5 + 1 + 0x91 + 0x0C + 0x7f + 0x0 + + + [Channel2] + pfl + PFL LED DECK B + 0.5 + 1 + 0x92 + 0x0C + 0x7f + 0x0 + + + + [Library] + MoveFocus + Browser LED (BLUE) + 0.5 + 1 + 0x90 + 0x04 + 0x05 + 0x07 + + + [Master] + maximize_library + Browser LED (GREEN) + 0.5 + 1 + 0x90 + 0x04 + 0x07 + 0x05 + + + + [AutoDJ] + enabled + Auto DJ On + 0.5 + 1 + 0x90 + 0x03 + 0x7f + 0x0 + + + + [EffectRack1_EffectUnit1_Effect3] + enabled + Effect On/Off button + 0.5 + 1 + 0x91 + 0x00 + 0x7f + 0x0 + + + [EffectRack1_EffectUnit2_Effect3] + enabled + Effect On/Off buttonn + 0.5 + 1 + 0x92 + 0x00 + 0x7f + 0x0 + + + + [Channel1] + end_of_track + Auto DJ On + 0.5 + 1 + 0x91 + 0x1C + 0x7f + 0x0 + + + [Channel1] + end_of_track + Auto DJ On + 0.5 + 1 + 0x91 + 0x1D + 0x7f + 0x0 + + + [Channel2] + end_of_track + Auto DJ On + 0.5 + 1 + 0x92 + 0x1C + 0x7f + 0x0 + + + [Channel2] + end_of_track + Auto DJ On + 0.5 + 1 + 0x92 + 0x1D + 0x7f + 0x0 + + + + [Channel1] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x96 + 0x00 + 0x7E + 0.5 + + + [Channel1] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x96 + 0x01 + 0x7E + 0.5 + + + [Channel1] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x96 + 0x02 + 0x7E + 0.5 + + + [Channel1] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x96 + 0x03 + 0x7E + 0.5 + + + [Channel1] + hotcue_5_enabled + Hotcue 5 (Pad 5) + 0x96 + 0x04 + 0x7E + 0.5 + + + [Channel1] + hotcue_6_enabled + Hotcue 6 (Pad 6) + 0x96 + 0x05 + 0x7E + 0.5 + + + [Channel1] + hotcue_7_enabled + Hotcue 7 (Pad 7) + 0x96 + 0x06 + 0x7E + 0.5 + + + [Channel1] + hotcue_8_enabled + Hotcue 8 (Pad 8) + 0x96 + 0x07 + 0x7E + 0.5 + + + [Channel2] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x97 + 0x00 + 0x7E + 0.5 + + + [Channel2] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x97 + 0x01 + 0x7E + 0.5 + + + [Channel2] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x97 + 0x02 + 0x7E + 0.5 + + + [Channel2] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x97 + 0x03 + 0x7E + 0.5 + + + [Channel2] + hotcue_5_enabled + Hotcue 5 (Pad 5) + 0x97 + 0x04 + 0x7E + 0.5 + + + [Channel2] + hotcue_6_enabled + Hotcue 6 (Pad 6) + 0x97 + 0x05 + 0x7E + 0.5 + + + [Channel2] + hotcue_7_enabled + Hotcue 7 (Pad 7) + 0x97 + 0x06 + 0x7E + 0.5 + + + [Channel2] + hotcue_8_enabled + Hotcue 8 (Pad 8) + 0x97 + 0x07 + 0x7E + 0.5 + + + + [Channel1] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x96 + 0x08 + 0x7E + 0.5 + + + [Channel1] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x96 + 0x09 + 0x7E + 0.5 + + + [Channel1] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x96 + 0x0A + 0x7E + 0.5 + + + [Channel1] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x96 + 0x0B + 0x7E + 0.5 + + + [Channel1] + hotcue_5_enabled + Hotcue 5 (Pad 5) + 0x96 + 0x0C + 0x7E + 0.5 + + + [Channel1] + hotcue_6_enabled + Hotcue 6 (Pad 6) + 0x96 + 0x0D + 0x7E + 0.5 + + + [Channel1] + hotcue_7_enabled + Hotcue 7 (Pad 7) + 0x96 + 0x0E + 0x7E + 0.5 + + + [Channel1] + hotcue_8_enabled + Hotcue 8 (Pad 8) + 0x96 + 0x0F + 0x7E + 0.5 + + + [Channel2] + hotcue_1_enabled + Hotcue 1 (Pad 1) + 0x97 + 0x08 + 0x7E + 0.5 + + + [Channel2] + hotcue_2_enabled + Hotcue 2 (Pad 2) + 0x97 + 0x09 + 0x7E + 0.5 + + + [Channel2] + hotcue_3_enabled + Hotcue 3 (Pad 3) + 0x97 + 0x0A + 0x7E + 0.5 + + + [Channel2] + hotcue_4_enabled + Hotcue 4 (Pad 4) + 0x97 + 0x0B + 0x7E + 0.5 + + + [Channel2] + hotcue_5_enabled + Hotcue 5 (Pad 5) + 0x97 + 0x0C + 0x7E + 0.5 + + + [Channel2] + hotcue_6_enabled + Hotcue 6 (Pad 6) + 0x97 + 0x0D + 0x7E + 0.5 + + + [Channel2] + hotcue_7_enabled + Hotcue 7 (Pad 7) + 0x97 + 0x0E + 0x7E + 0.5 + + + [Channel2] + hotcue_8_enabled + Hotcue 8 (Pad 8) + 0x97 + 0x0F + 0x7E + 0.5 + + + + [Channel1] + beatlooproll_0.125_activate + Loop 1/8 Beat (Pad 1) + 0x96 + 0x10 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_0.25_activate + Loop 1/4 Beat (Pad 2) + 0x96 + 0x11 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_0.5_activate + Loop 1/2 Beat (Pad 3) + 0x96 + 0x12 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_1_activate + Loop 1 Beat (Pad 4) + 0x96 + 0x13 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_2_activate + Loop 2 Beat (Pad 5) + 0x96 + 0x14 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_4_activate + Loop 4 Beat (Pad 6) + 0x96 + 0x15 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_8_activate + Loop 8 Beat (Pad 7) + 0x96 + 0x16 + 0x7F + 0.5 + + + [Channel1] + beatlooproll_16_activate + Loop 16 Beat (Pad 8) + 0x96 + 0x17 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_0.125_activate + Loop 1/8 Beat (Pad 1) + 0x97 + 0x10 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_0.25_activate + Loop 1/4 Beat (Pad 2) + 0x97 + 0x11 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_0.5_activate + Loop 1/2 Beat (Pad 3) + 0x97 + 0x12 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_1_activate + Loop 1 Beat (Pad 4) + 0x97 + 0x13 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_2_activate + Loop 2 Beat (Pad 5) + 0x97 + 0x14 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_4_activate + Loop 4 Beat (Pad 6) + 0x97 + 0x15 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_8_activate + Loop 8 Beat (Pad 7) + 0x97 + 0x16 + 0x7F + 0.5 + + + [Channel2] + beatlooproll_16_activate + Loop 16 Beat (Pad 8) + 0x97 + 0x17 + 0x7F + 0.5 + + + + [Sampler1] + play_indicator + (Pad 1 DECK A) + 0x96 + 0x30 + 0x7F + 0.5 + + + [Sampler1] + play_indicator + (Pad 1 DECK B) + 0x97 + 0x30 + 0x7F + 0.5 + + + [Sampler2] + play_indicator + (Pad 2 DECK A) + 0x96 + 0x31 + 0x7F + 0.5 + + + [Sampler2] + play_indicator + (Pad 2 DECK B) + 0x97 + 0x31 + 0x7F + 0.5 + + + [Sampler3] + play_indicator + (Pad 3 DECK A) + 0x96 + 0x32 + 0x7F + 0.5 + + + [Sampler3] + play_indicator + (Pad 3 DECK B) + 0x97 + 0x32 + 0x7F + 0.5 + + + [Sampler4] + play_indicator + (Pad 4 DECK A) + 0x96 + 0x33 + 0x7F + 0.5 + + + [Sampler4] + play_indicator + (Pad 4 DECK B) + 0x97 + 0x33 + 0x7F + 0.5 + + + [Sampler5] + play_indicator + (Pad 5 DECK A) + 0x96 + 0x34 + 0x7F + 0.5 + + + [Sampler5] + play_indicator + (Pad 5 DECK B) + 0x97 + 0x34 + 0x7F + 0.5 + + + [Sampler6] + play_indicator + (Pad 6 DECK A) + 0x96 + 0x35 + 0x7F + 0.5 + + + [Sampler6] + play_indicator + (Pad 6 DECK B) + 0x97 + 0x35 + 0x7F + 0.5 + + + [Sampler7] + play_indicator + (Pad 7 DECK A) + 0x96 + 0x36 + 0x7F + 0.5 + + + [Sampler7] + play_indicator + (Pad 7 DECK B) + 0x97 + 0x36 + 0x7F + 0.5 + + + [Sampler8] + play_indicator + (Pad 8 DECK A) + 0x96 + 0x37 + 0x7F + 0.5 + + + [Sampler8] + play_indicator + (Pad 4 DECK B) + 0x97 + 0x37 + 0x7F + 0.5 + + + + [Channel1] + beatjump_1_backward + (Beatjump 1 backward DECK A) + 0x96 + 0x70 + 0x7F + 0.5 + + + [Channel2] + beatjump_1_backward + (Beatjump 1 backward DECK B) + 0x97 + 0x70 + 0x7F + 0.5 + + + [Channel1] + beatjump_1_forward + (Beatjump 1 forward DECK A) + 0x96 + 0x71 + 0x7F + 0.5 + + + [Channel2] + beatjump_1_forward + (Beatjump 1 forward DECK B) + 0x97 + 0x71 + 0x7F + 0.5 + + + [Channel1] + beatjump_2_backward + (Beatjump 2 backward DECK A) + 0x96 + 0x72 + 0x7F + 0.5 + + + [Channel2] + beatjump_2_backward + (Beatjump 2 backward DECK B) + 0x97 + 0x72 + 0x7F + 0.5 + + + [Channel1] + beatjump_2_forward + (Beatjump 2 forward DECK A) + 0x96 + 0x73 + 0x7F + 0.5 + + + [Channel2] + beatjump_2_forward + (Beatjump 2 forward DECK B) + 0x97 + 0x73 + 0x7F + 0.5 + + + [Channel1] + beatjump_4_backward + (Beatjump 4 backward DECK A) + 0x96 + 0x74 + 0x7F + 0.5 + + + [Channel2] + beatjump_4_backward + (Beatjump 4 backward DECK B) + 0x97 + 0x74 + 0x7F + 0.5 + + + [Channel1] + beatjump_4_forward + (Beatjump 4 forward DECK A) + 0x96 + 0x75 + 0x7F + 0.5 + + + [Channel2] + beatjump_4_forward + (Beatjump 4 forward DECK B) + 0x97 + 0x75 + 0x7F + 0.5 + + + [Channel1] + beatjump_8_backward + (Beatjump 8 backward DECK A) + 0x96 + 0x76 + 0x7F + 0.5 + + + [Channel2] + beatjump_8_backward + (Beatjump 8 backward DECK B) + 0x97 + 0x76 + 0x7F + 0.5 + + + [Channel1] + beatjump_8_forward + (Beatjump 8 forward DECK A) + 0x96 + 0x77 + 0x7F + 0.5 + + + [Channel2] + beatjump_8_forward + (Beatjump 8 forward Deck B) + 0x97 + 0x77 + 0x7F + 0.5 + + + + diff -Nru mixxx-2.2.3~dfsg/res/controllers/Hercules-DJControl-Inpulse-300-script.js mixxx-2.2.4~dfsg/res/controllers/Hercules-DJControl-Inpulse-300-script.js --- mixxx-2.2.3~dfsg/res/controllers/Hercules-DJControl-Inpulse-300-script.js 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Hercules-DJControl-Inpulse-300-script.js 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,197 @@ +// DJControl_Inpulse_300_script.js +// +// *************************************************************************** +// * Mixxx mapping script file for the Hercules DJControl Inpulse 300. +// * Author: DJ Phatso, contributions by Kerrick Staley +// * Version 1.2 (March 2020) +// * Forum: https://www.mixxx.org/forums/viewtopic.php?f=7&t=12599 +// * Wiki: https://mixxx.org/wiki/doku.php/hercules_djcontrol_inpulse_300 +// +// Changes to v1.2 +// - Code cleanup. +// +// Changes to v1.1 +// - Fix seek-to-start and cue-master behavior. +// - Tweak scratch, seek, and bend behavior. +// - Controller knob/slider values are queried on startup, so MIXXX is synced. +// - Fixed vinyl button behavior the first time it's pressed. +// +// v1.0 : Original forum release +// +// TO DO: Functions that could be implemented to the script: +// +// * ROLL: Keep SLIP active (if already enabled) when exiting from rolls +// +// * SLICER/SLICER LOOP +// +// * TONEPLAY +// +// * FX: +// - See how to preselect effects for a rack +// **************************************************************************** +var DJCi300 = {}; +/////////////////////////////////////////////////////////////// +// USER OPTIONS // +/////////////////////////////////////////////////////////////// + +// How fast scratching is. +DJCi300.scratchScale = 1.0; + +// How much faster seeking (shift+scratch) is than scratching. +DJCi300.scratchShiftMultiplier = 4; + +// How fast bending is. +DJCi300.bendScale = 1.0; + +// Other scratch related options +DJCi300.kScratchActionNone = 0; +DJCi300.kScratchActionScratch = 1; +DJCi300.kScratchActionSeek = 2; +DJCi300.kScratchActionBend = 3; + +DJCi300.vuMeterUpdateMaster = function(value, _group, _control) { + value = (value * 122) + 5; + midi.sendShortMsg(0xB0, 0x40, value); + midi.sendShortMsg(0xB0, 0x41, value); +}; + +DJCi300.vuMeterUpdateDeck = function(value, group, _control, _status) { + value = (value * 122) + 5; + var status = (group === "[Channel1]") ? 0xB1 : 0xB2; + midi.sendShortMsg(status, 0x40, value); +}; + +DJCi300.init = function() { + // Scratch button state + DJCi300.scratchButtonState = true; + // Scratch Action + DJCi300.scratchAction = { + 1: DJCi300.kScratchActionNone, + 2: DJCi300.kScratchActionNone + }; + + // Turn On Vinyl buttons LED(one for each deck). + midi.sendShortMsg(0x91, 0x03, 0x7F); + midi.sendShortMsg(0x92, 0x03, 0x7F); + + //Turn On Browser button LED + midi.sendShortMsg(0x90, 0x04, 0x05); + + //Softtakeover for Pitch fader + engine.softTakeover("[Channel1]", "rate", true); + engine.softTakeover("[Channel2]", "rate", true); + engine.softTakeoverIgnoreNextValue("[Channel1]", "rate"); + engine.softTakeoverIgnoreNextValue("[Channel2]", "rate"); + + // Connect the VUMeters + engine.connectControl("[Channel1]", "VuMeter", "DJCi300.vuMeterUpdateDeck"); + engine.getValue("[Channel1]", "VuMeter", "DJCi300.vuMeterUpdateDeck"); + engine.connectControl("[Channel2]", "VuMeter", "DJCi300.vuMeterUpdateDeck"); + engine.getValue("[Channel2]", "VuMeter", "DJCi300.vuMeterUpdateDeck"); + engine.connectControl("[Master]", "VuMeterL", "DJCi300.vuMeterUpdateMaster"); + engine.connectControl("[Master]", "VuMeterR", "DJCi300.vuMeterUpdateMaster"); + engine.getValue("[Master]", "VuMeterL", "DJCi300.vuMeterUpdateMaster"); + engine.getValue("[Master]", "VuMeterR", "DJCi300.vuMeterUpdateMaster"); + + // Ask the controller to send all current knob/slider values over MIDI, which will update + // the corresponding GUI controls in MIXXX. + midi.sendShortMsg(0xB0, 0x7F, 0x7F); +}; + +// The Vinyl button, used to enable or disable scratching on the jog wheels (One per deck). +DJCi300.vinylButton = function(_channel, _control, value, status, _group) { + if (value) { + if (DJCi300.scratchButtonState) { + DJCi300.scratchButtonState = false; + midi.sendShortMsg(status, 0x03, 0x00); + } else { + DJCi300.scratchButtonState = true; + midi.sendShortMsg(status, 0x03, 0x7F); + } + } +}; + +DJCi300._scratchEnable = function(deck) { + var alpha = 1.0/8; + var beta = alpha/32; + engine.scratchEnable(deck, 248, 33 + 1/3, alpha, beta); +}; + +DJCi300._convertWheelRotation = function(value) { + // When you rotate the jogwheel, the controller always sends either 0x1 + // (clockwise) or 0x7F (counter clockwise). 0x1 should map to 1, 0x7F + // should map to -1 (IOW it's 7-bit signed). + return value < 0x40 ? 1 : -1; +}; + +// The touch action on the jog wheel's top surface +DJCi300.wheelTouch = function(channel, control, value, _status, _group) { + var deck = channel; + if (value > 0) { + // Touching the wheel. + if (engine.getValue("[Channel" + deck + "]", "play") !== 1 || DJCi300.scratchButtonState) { + DJCi300._scratchEnable(deck); + DJCi300.scratchAction[deck] = DJCi300.kScratchActionScratch; + } else { + DJCi300.scratchAction[deck] = DJCi300.kScratchActionBend; + } + } else { + // Released the wheel. + engine.scratchDisable(deck); + DJCi300.scratchAction[deck] = DJCi300.kScratchActionNone; + } +}; + +// The touch action on the jog wheel's top surface while holding shift +DJCi300.wheelTouchShift = function(channel, control, value, _status, _group) { + var deck = channel - 3; + // We always enable scratching regardless of button state. + if (value > 0) { + DJCi300._scratchEnable(deck); + DJCi300.scratchAction[deck] = DJCi300.kScratchActionSeek; + } else { + // Released the wheel. + engine.scratchDisable(deck); + DJCi300.scratchAction[deck] = DJCi300.kScratchActionNone; + } +}; + +// Scratching on the jog wheel (rotating it while pressing the top surface) +DJCi300.scratchWheel = function(channel, control, value, status, _group) { + var deck; + switch (status) { + case 0xB1: + case 0xB4: + deck = 1; + break; + case 0xB2: + case 0xB5: + deck = 2; + break; + default: + return; + } + var interval = DJCi300._convertWheelRotation(value); + var scratchAction = DJCi300.scratchAction[deck]; + if (scratchAction === DJCi300.kScratchActionScratch) { + engine.scratchTick(deck, interval * DJCi300.scratchScale); + } else if (scratchAction === DJCi300.kScratchActionSeek) { + engine.scratchTick(deck, + interval * DJCi300.scratchScale * + DJCi300.scratchShiftMultiplier); + } else { + engine.setValue( + "[Channel" + deck + "]", "jog", interval * DJCi300.bendScale); + } +}; + +// Bending on the jog wheel (rotating using the edge) +DJCi300.bendWheel = function(channel, control, value, _status, _group) { + var interval = DJCi300._convertWheelRotation(value); + engine.setValue( + "[Channel" + channel + "]", "jog", interval * DJCi300.bendScale); +}; + +DJCi300.shutdown = function() { + midi.sendShortMsg(0xB0, 0x7F, 0x00); +}; diff -Nru mixxx-2.2.3~dfsg/res/controllers/novation-launchpad/.eslintrc.yaml mixxx-2.2.4~dfsg/res/controllers/novation-launchpad/.eslintrc.yaml --- mixxx-2.2.3~dfsg/res/controllers/novation-launchpad/.eslintrc.yaml 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/novation-launchpad/.eslintrc.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -env: - node: true - es6: true - -extends: standard -parser: babel-eslint -plugins: - - import - - flowtype -rules: - # sort-imports: error - import/no-duplicates: error - no-duplicate-imports: off # see https://github.com/babel/eslint-plugin-babel/issues/59 - flowtype/boolean-style: - - 2 - - boolean - flowtype/define-flow-type: 1 - flowtype/delimiter-dangle: - - 2 - - never - flowtype/generic-spacing: - - 2 - - never - flowtype/no-primitive-constructor-types: 2 - # flowtype/no-weak-types: 2 - flowtype/object-type-delimiter: - - 2 - - comma - # flowtype/require-parameter-type: 2 - # flowtype/require-return-type: - # - 2 - # - always - # - annotateUndefined: never - flowtype/require-valid-file-annotation: 2 - flowtype/semi: - - 2 - - never - flowtype/space-after-type-colon: - - 2 - - always - flowtype/space-before-generic-bracket: - - 2 - - never - flowtype/space-before-type-colon: - - 2 - - never - flowtype/type-id-match: - - 2 - - "^([A-Z][a-z0-9]+)+$" - flowtype/union-intersection-spacing: - - 2 - - always - flowtype/use-flow-type: 1 - flowtype/valid-syntax: 1 -settings: - flowtype: - onlyFilesWithFlowAnnotation: false diff -Nru mixxx-2.2.3~dfsg/res/controllers/Numark-Mixtrack-Platinum-scripts.js mixxx-2.2.4~dfsg/res/controllers/Numark-Mixtrack-Platinum-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Numark-Mixtrack-Platinum-scripts.js 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Numark-Mixtrack-Platinum-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -1230,7 +1230,7 @@ var alpha = 1.0/8; var beta = alpha/32; - engine.scratchEnable(deck, 1011, 33+1/3, alpha, beta); + engine.scratchEnable(deck, 1240, 33+1/3, alpha, beta); MixtrackPlatinum.stopScratchTimer(deck); }; diff -Nru mixxx-2.2.3~dfsg/res/controllers/Pioneer-DDJ-SB2-scripts.js mixxx-2.2.4~dfsg/res/controllers/Pioneer-DDJ-SB2-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Pioneer-DDJ-SB2-scripts.js 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Pioneer-DDJ-SB2-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -15,8 +15,8 @@ // the beginning of the track and stops playback. PioneerDDJSB2.reverseRollOnShiftCue = false; -// Sets the jogwheels sensivity. 1 is default, 2 is twice as sensitive, 0.5 is half as sensitive. -PioneerDDJSB2.jogwheelSensivity = 1.0; +// Sets the jogwheels sensitivity. 1 is default, 2 is twice as sensitive, 0.5 is half as sensitive. +PioneerDDJSB2.jogwheelSensitivity = 1.0; // Sets how much more sensitive the jogwheels get when holding shift. // Set to 1 to disable jogwheel sensitivity increase when holding shift. @@ -93,7 +93,7 @@ PioneerDDJSB2.longButtonPress = false; PioneerDDJSB2.speedRateToNormalTimer = new Array(4); -PioneerDDJSB2.init = function(id) { +PioneerDDJSB2.init = function(_id) { PioneerDDJSB2.deck = []; PioneerDDJSB2.deck[1] = new PioneerDDJSB2.Deck(1); PioneerDDJSB2.deck[2] = new PioneerDDJSB2.Deck(2); @@ -105,25 +105,25 @@ PioneerDDJSB2.effectUnit[2] = new PioneerDDJSB2.EffectUnit(2); PioneerDDJSB2.scratchSettings = { - 'alpha': 1.0 / 8, - 'beta': 1.0 / 8 / 32, - 'jogResolution': 720, - 'vinylSpeed': 33 + 1 / 3, - 'safeScratchTimeout': 20 + "alpha": 1.0 / 8, + "beta": 1.0 / 8 / 32, + "jogResolution": 720, + "vinylSpeed": 33 + 1 / 3, + "safeScratchTimeout": 20 }; PioneerDDJSB2.channelGroups = { - '[Channel1]': 0x00, - '[Channel2]': 0x01, - '[Channel3]': 0x02, - '[Channel4]': 0x03 + "[Channel1]": 0x00, + "[Channel2]": 0x01, + "[Channel3]": 0x02, + "[Channel4]": 0x03 }; PioneerDDJSB2.samplerGroups = { - '[Sampler1]': 0x00, - '[Sampler2]': 0x01, - '[Sampler3]': 0x02, - '[Sampler4]': 0x03 + "[Sampler1]": 0x00, + "[Sampler2]": 0x01, + "[Sampler3]": 0x02, + "[Sampler4]": 0x03 }; PioneerDDJSB2.shiftPressed = false; @@ -136,36 +136,36 @@ PioneerDDJSB2.scratchMode = [false, false, false, false]; PioneerDDJSB2.ledGroups = { - 'hotCue': 0x00, - 'autoLoop': 0x10, - 'manualLoop': 0x20, - 'sampler': 0x30 + "hotCue": 0x00, + "autoLoop": 0x10, + "manualLoop": 0x20, + "sampler": 0x30 }; PioneerDDJSB2.nonPadLeds = { - 'headphoneCue': 0x54, - 'shiftHeadphoneCue': 0x68, - 'cue': 0x0C, - 'shiftCue': 0x48, - 'keyLock': 0x1A, - 'shiftKeyLock': 0x60, - 'play': 0x0B, - 'shiftPlay': 0x47, - 'vinyl': 0x17, - 'shiftVinyl': 0x4E, - 'sync': 0x58, - 'shiftSync': 0x5C + "headphoneCue": 0x54, + "shiftHeadphoneCue": 0x68, + "cue": 0x0C, + "shiftCue": 0x48, + "keyLock": 0x1A, + "shiftKeyLock": 0x60, + "play": 0x0B, + "shiftPlay": 0x47, + "vinyl": 0x17, + "shiftVinyl": 0x4E, + "sync": 0x58, + "shiftSync": 0x5C }; PioneerDDJSB2.valueVuMeter = { - '[Channel1]_current': 0, - '[Channel2]_current': 0, - '[Channel3]_current': 0, - '[Channel4]_current': 0, - '[Channel1]_enabled': 1, - '[Channel2]_enabled': 1, - '[Channel3]_enabled': 1, - '[Channel4]_enabled': 1, + "[Channel1]_current": 0, + "[Channel2]_current": 0, + "[Channel3]_current": 0, + "[Channel4]_current": 0, + "[Channel1]_enabled": 1, + "[Channel2]_enabled": 1, + "[Channel3]_enabled": 1, + "[Channel4]_enabled": 1, }; @@ -174,24 +174,24 @@ PioneerDDJSB2.looprollIntervals = [1 / 16, 1 / 8, 1 / 4, 1 / 2, 1, 2, 4, 8]; PioneerDDJSB2.bindNonDeckControlConnections(false); - PioneerDDJSB2.initDeck('[Channel1]'); - PioneerDDJSB2.initDeck('[Channel2]'); - PioneerDDJSB2.initDeck('[Channel3]'); - PioneerDDJSB2.initDeck('[Channel4]'); + PioneerDDJSB2.initDeck("[Channel1]"); + PioneerDDJSB2.initDeck("[Channel2]"); + PioneerDDJSB2.initDeck("[Channel3]"); + PioneerDDJSB2.initDeck("[Channel4]"); if (PioneerDDJSB2.twinkleVumeterAutodjOn) { - PioneerDDJSB2.vu_meter_timer = engine.beginTimer(100, "PioneerDDJSB2.vuMeterTwinkle()"); + PioneerDDJSB2.vuMeterTimer = engine.beginTimer(100, "PioneerDDJSB2.vuMeterTwinkle()"); } // request the positions of the knobs and faders from the controller midi.sendShortMsg(0x9B, 0x09, 0x7f); }; -PioneerDDJSB2.Deck = function (deckNumber) { +PioneerDDJSB2.Deck = function(deckNumber) { var theDeck = this; - this.group = '[Channel' + deckNumber + ']'; + this.group = "[Channel" + deckNumber + "]"; - this.shiftButton = function (channel, control, value, status, group) { + this.shiftButton = function(channel, control, value, _status, _group) { if (value > 0) { theDeck.shift(); PioneerDDJSB2.shiftPressed = true; @@ -230,16 +230,16 @@ } this.gainKnob = new components.Pot({ - unshift: function () { - this.group = '[Channel' + deckNumber + ']'; - this.inKey = 'pregain'; + unshift: function() { + this.group = "[Channel" + deckNumber + "]"; + this.inKey = "pregain"; this.disconnect(); this.connect(); }, - shift: function () { - var focusedEffect = engine.getValue('[EffectRack1_EffectUnit' + effectUnitNumber + ']', 'focused_effect'); - this.group = '[EffectRack1_EffectUnit' + effectUnitNumber + '_Effect' + focusedEffect + ']'; - this.inKey = 'parameter1'; + shift: function() { + var focusedEffect = engine.getValue("[EffectRack1_EffectUnit" + effectUnitNumber + "]", "focused_effect"); + this.group = "[EffectRack1_EffectUnit" + effectUnitNumber + "_Effect" + focusedEffect + "]"; + this.inKey = "parameter1"; this.disconnect(); this.connect(); }, @@ -249,16 +249,16 @@ for (var k = 1; k <= 3; k++) { this.eqKnob[k] = new components.Pot({ number: k, - unshift: function () { - this.group = '[EqualizerRack1_[Channel' + deckNumber + ']_Effect1]'; - this.inKey = 'parameter' + this.number; + unshift: function() { + this.group = "[EqualizerRack1_[Channel" + deckNumber + "]_Effect1]"; + this.inKey = "parameter" + this.number; this.disconnect(); this.connect(); }, - shift: function () { - var focusedEffect = engine.getValue('[EffectRack1_EffectUnit' + effectUnitNumber + ']', 'focused_effect'); - this.group = '[EffectRack1_EffectUnit' + effectUnitNumber + '_Effect' + focusedEffect + ']'; - this.inKey = 'parameter' + (5 - this.number); + shift: function() { + var focusedEffect = engine.getValue("[EffectRack1_EffectUnit" + effectUnitNumber + "]", "focused_effect"); + this.group = "[EffectRack1_EffectUnit" + effectUnitNumber + "_Effect" + focusedEffect + "]"; + this.inKey = "parameter" + (5 - this.number); this.disconnect(); this.connect(); }, @@ -266,24 +266,24 @@ } this.quickEffectKnob = new components.Pot({ - unshift: function () { - this.group = '[QuickEffectRack1_[Channel' + deckNumber + ']]'; - this.inKey = 'super1'; + unshift: function() { + this.group = "[QuickEffectRack1_[Channel" + deckNumber + "]]"; + this.inKey = "super1"; this.disconnect(); this.connect(); }, - shift: function () { - var focusedEffect = engine.getValue('[EffectRack1_EffectUnit' + effectUnitNumber + ']', 'focused_effect'); - this.group = '[EffectRack1_EffectUnit' + effectUnitNumber + '_Effect' + focusedEffect + ']'; - this.inKey = 'parameter5'; + shift: function() { + var focusedEffect = engine.getValue("[EffectRack1_EffectUnit" + effectUnitNumber + "]", "focused_effect"); + this.group = "[EffectRack1_EffectUnit" + effectUnitNumber + "_Effect" + focusedEffect + "]"; + this.inKey = "parameter5"; this.disconnect(); this.connect(); }, }); this.tempoFader = new components.Pot({ - inKey: 'rate', -// relative: true, + inKey: "rate", + // relative: true, invert: true, }); @@ -291,16 +291,16 @@ this.topPadRow.autoLoopLayer = new components.ComponentContainer(); this.topPadRow.autoLoopLayer.beatloopButton = new components.Button({ midi: [0x96 + deckNumber, 0x10], - unshift: function () { - this.inKey = 'beatloop_activate'; - this.outKey = 'beatloop_activate'; + unshift: function() { + this.inKey = "beatloop_activate"; + this.outKey = "beatloop_activate"; this.disconnect(); this.connect(); this.trigger(); }, - shift: function () { - this.inKey = 'beatlooproll_activate'; - this.outKey = 'beatlooproll_activate'; + shift: function() { + this.inKey = "beatlooproll_activate"; + this.outKey = "beatlooproll_activate"; this.disconnect(); this.connect(); this.trigger(); @@ -309,16 +309,16 @@ this.topPadRow.autoLoopLayer.beatloopHalveButton = new components.Button({ midi: [0x96 + deckNumber, 0x11], - unshift: function () { - this.inKey = 'loop_halve'; - this.outKey = 'loop_halve'; + unshift: function() { + this.inKey = "loop_halve"; + this.outKey = "loop_halve"; this.disconnect(); this.connect(); this.trigger(); }, - shift: function () { - this.inKey = 'beatjump_backward'; - this.outKey = 'beatjump_backward'; + shift: function() { + this.inKey = "beatjump_backward"; + this.outKey = "beatjump_backward"; this.disconnect(); this.connect(); this.trigger(); @@ -327,16 +327,16 @@ this.topPadRow.autoLoopLayer.beatloopDoubleButton = new components.Button({ midi: [0x96 + deckNumber, 0x12], - unshift: function () { - this.inKey = 'loop_double'; - this.outKey = 'loop_double'; + unshift: function() { + this.inKey = "loop_double"; + this.outKey = "loop_double"; this.disconnect(); this.connect(); this.trigger(); }, - shift: function () { - this.inKey = 'beatjump_forward'; - this.outKey = 'beatjump_forward'; + shift: function() { + this.inKey = "beatjump_forward"; + this.outKey = "beatjump_forward"; this.disconnect(); this.connect(); this.trigger(); @@ -345,22 +345,22 @@ this.topPadRow.autoLoopLayer.reloopButton = new components.Button({ midi: [0x96 + deckNumber, 0x13], - outKey: 'loop_enabled', - unshift: function () { - this.inKey = 'reloop_toggle'; + outKey: "loop_enabled", + unshift: function() { + this.inKey = "reloop_toggle"; }, - shift: function () { - this.inKey = 'reloop_andstop'; + shift: function() { + this.inKey = "reloop_andstop"; }, }); - this.topPadRow.forEachComponent(function (button) { + this.topPadRow.forEachComponent(function(button) { button.sendShifted = true; button.shiftControl = true; button.shiftOffset = 8; }); - this.forEachComponent(function (c) { + this.forEachComponent(function(c) { if (c.group === undefined) { c.group = theDeck.group; c.connect(); @@ -400,18 +400,18 @@ }; PioneerDDJSB2.speedRateToNormal = function(group, deck) { - var speed = engine.getValue(group, 'rate'); + var speed = engine.getValue(group, "rate"); if (speed > 0) { - engine.setValue(group, 'rate_perm_down_small', true); - if (engine.getValue(group, 'rate') <= 0) { + engine.setValue(group, "rate_perm_up_small", true); + if (engine.getValue(group, "rate") <= 0) { engine.stopTimer(PioneerDDJSB2.speedRateToNormalTimer[deck]); - engine.setValue(group, 'rate', 0); + engine.setValue(group, "rate", 0); } } else if (speed < 0) { - engine.setValue(group, 'rate_perm_up_small', true); - if (engine.getValue(group, 'rate') >= 0) { + engine.setValue(group, "rate_perm_down_small", true); + if (engine.getValue(group, "rate") >= 0) { engine.stopTimer(PioneerDDJSB2.speedRateToNormalTimer[deck]); - engine.setValue(group, 'rate', 0); + engine.setValue(group, "rate", 0); } } }; @@ -430,34 +430,34 @@ PioneerDDJSB2.blinkAutodjState = 0; } if (PioneerDDJSB2.blinkAutodjState === 0) { - PioneerDDJSB2.valueVuMeter['[Channel1]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel3]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel2]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel4]_enabled'] = 0; + PioneerDDJSB2.valueVuMeter["[Channel1]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel3]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel2]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel4]_enabled"] = 0; } if (PioneerDDJSB2.blinkAutodjState === 1) { - PioneerDDJSB2.valueVuMeter['[Channel1]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel3]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel2]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel4]_enabled'] = 0; + PioneerDDJSB2.valueVuMeter["[Channel1]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel3]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel2]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel4]_enabled"] = 0; } if (PioneerDDJSB2.blinkAutodjState === 2) { - PioneerDDJSB2.valueVuMeter['[Channel1]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel3]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel2]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel4]_enabled'] = 1; + PioneerDDJSB2.valueVuMeter["[Channel1]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel3]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel2]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel4]_enabled"] = 1; } if (PioneerDDJSB2.blinkAutodjState === 3) { - PioneerDDJSB2.valueVuMeter['[Channel1]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel3]_enabled'] = 0; - PioneerDDJSB2.valueVuMeter['[Channel2]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel4]_enabled'] = 1; + PioneerDDJSB2.valueVuMeter["[Channel1]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel3]_enabled"] = 0; + PioneerDDJSB2.valueVuMeter["[Channel2]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel4]_enabled"] = 1; } } else { - PioneerDDJSB2.valueVuMeter['[Channel1]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel3]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel2]_enabled'] = 1; - PioneerDDJSB2.valueVuMeter['[Channel4]_enabled'] = 1; + PioneerDDJSB2.valueVuMeter["[Channel1]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel3]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel2]_enabled"] = 1; + PioneerDDJSB2.valueVuMeter["[Channel4]_enabled"] = 1; } }; @@ -466,7 +466,7 @@ // AutoDJ // /////////////////////////////////////////////////////////////// -PioneerDDJSB2.autodjSkipNext = function(channel, control, value, status, group) { +PioneerDDJSB2.autodjSkipNext = function(channel, control, value, _status, _group) { if (value === 0) { return; } @@ -475,7 +475,7 @@ } }; -PioneerDDJSB2.autodjToggle = function(channel, control, value, status, group) { +PioneerDDJSB2.autodjToggle = function(channel, control, value, _status, _group) { if (value === 0) { return; } @@ -492,34 +492,34 @@ /////////////////////////////////////////////////////////////// PioneerDDJSB2.bindSamplerControlConnections = function(samplerGroup, isUnbinding) { - engine.connectControl(samplerGroup, 'duration', 'PioneerDDJSB2.samplerLeds', isUnbinding); + engine.connectControl(samplerGroup, "duration", "PioneerDDJSB2.samplerLeds", isUnbinding); }; PioneerDDJSB2.bindDeckControlConnections = function(channelGroup, isUnbinding) { var i, index, controlsToFunctions = { - 'pfl': 'PioneerDDJSB2.headphoneCueLed', - 'keylock': 'PioneerDDJSB2.keyLockLed', - 'loop_in': 'PioneerDDJSB2.loopInLed', - 'loop_out': 'PioneerDDJSB2.loopOutLed', - 'filterLowKill': 'PioneerDDJSB2.lowKillLed', - 'filterMidKill': 'PioneerDDJSB2.midKillLed', - 'filterHighKill': 'PioneerDDJSB2.highKillLed', - 'mute': 'PioneerDDJSB2.muteLed', - 'loop_enabled': 'PioneerDDJSB2.loopExitLed', + "pfl": "PioneerDDJSB2.headphoneCueLed", + "keylock": "PioneerDDJSB2.keyLockLed", + "loop_in": "PioneerDDJSB2.loopInLed", + "loop_out": "PioneerDDJSB2.loopOutLed", + "filterLowKill": "PioneerDDJSB2.lowKillLed", + "filterMidKill": "PioneerDDJSB2.midKillLed", + "filterHighKill": "PioneerDDJSB2.highKillLed", + "mute": "PioneerDDJSB2.muteLed", + "loop_enabled": "PioneerDDJSB2.loopExitLed", }; if (PioneerDDJSB2.invertVinylSlipButton) { - controlsToFunctions.slip_enabled = 'PioneerDDJSB2.slipLed'; + controlsToFunctions.slipEnabled = "PioneerDDJSB2.slipLed"; } for (i = 1; i <= 8; i++) { - controlsToFunctions['hotcue_' + i + '_enabled'] = 'PioneerDDJSB2.hotCueLeds'; + controlsToFunctions["hotcue_" + i + "_enabled"] = "PioneerDDJSB2.hotCueLeds"; } for (index in PioneerDDJSB2.looprollIntervals) { - controlsToFunctions['beatlooproll_' + PioneerDDJSB2.looprollIntervals[index] + '_activate'] = 'PioneerDDJSB2.beatlooprollLeds'; + controlsToFunctions["beatlooproll_" + PioneerDDJSB2.looprollIntervals[index] + "_activate"] = "PioneerDDJSB2.beatlooprollLeds"; } script.bindConnections(channelGroup, controlsToFunctions, isUnbinding); @@ -529,17 +529,17 @@ var samplerIndex; for (samplerIndex = 1; samplerIndex <= 4; samplerIndex++) { - PioneerDDJSB2.bindSamplerControlConnections('[Sampler' + samplerIndex + ']', isUnbinding); + PioneerDDJSB2.bindSamplerControlConnections("[Sampler" + samplerIndex + "]", isUnbinding); } if (PioneerDDJSB2.showVumeterMaster) { - engine.connectControl('[Master]', 'VuMeterL', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); - engine.connectControl('[Master]', 'VuMeterR', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); + engine.connectControl("[Master]", "VuMeterL", "PioneerDDJSB2.VuMeterLeds", isUnbinding); + engine.connectControl("[Master]", "VuMeterR", "PioneerDDJSB2.VuMeterLeds", isUnbinding); } else { - engine.connectControl('[Channel1]', 'VuMeter', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); - engine.connectControl('[Channel2]', 'VuMeter', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); - engine.connectControl('[Channel3]', 'VuMeter', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); - engine.connectControl('[Channel4]', 'VuMeter', 'PioneerDDJSB2.VuMeterLeds', isUnbinding); + engine.connectControl("[Channel1]", "VuMeter", "PioneerDDJSB2.VuMeterLeds", isUnbinding); + engine.connectControl("[Channel2]", "VuMeter", "PioneerDDJSB2.VuMeterLeds", isUnbinding); + engine.connectControl("[Channel3]", "VuMeter", "PioneerDDJSB2.VuMeterLeds", isUnbinding); + engine.connectControl("[Channel4]", "VuMeter", "PioneerDDJSB2.VuMeterLeds", isUnbinding); } }; @@ -548,11 +548,11 @@ channelIndex; for (samplerIndex = 1; samplerIndex <= 4; samplerIndex++) { - PioneerDDJSB2.bindSamplerControlConnections('[Sampler' + samplerIndex + ']', isUnbinding); + PioneerDDJSB2.bindSamplerControlConnections("[Sampler" + samplerIndex + "]", isUnbinding); } for (channelIndex = 1; channelIndex <= 2; channelIndex++) { - PioneerDDJSB2.bindDeckControlConnections('[Channel' + channelIndex + ']', isUnbinding); + PioneerDDJSB2.bindDeckControlConnections("[Channel" + channelIndex + "]", isUnbinding); } }; @@ -561,18 +561,18 @@ /////////////////////////////////////////////////////////////// PioneerDDJSB2.deckSwitchTable = { - '[Channel1]': '[Channel1]', - '[Channel2]': '[Channel2]', - '[Channel3]': '[Channel3]', - '[Channel4]': '[Channel4]' + "[Channel1]": "[Channel1]", + "[Channel2]": "[Channel2]", + "[Channel3]": "[Channel3]", + "[Channel4]": "[Channel4]" }; PioneerDDJSB2.deckShiftSwitchTable = { - '[Channel1]': '[Channel3]', - '[Channel2]': '[Channel4]', - '[Channel3]': '[Channel1]', - '[Channel4]': '[Channel2]' + "[Channel1]": "[Channel3]", + "[Channel2]": "[Channel4]", + "[Channel3]": "[Channel1]", + "[Channel4]": "[Channel2]" }; PioneerDDJSB2.initDeck = function(group) { @@ -587,10 +587,10 @@ /////////////////////////////////////////////////////////////// PioneerDDJSB2.highResMSB = { - '[Channel1]': {}, - '[Channel2]': {}, - '[Channel3]': {}, - '[Channel4]': {} + "[Channel1]": {}, + "[Channel2]": {}, + "[Channel3]": {}, + "[Channel4]": {} }; PioneerDDJSB2.deckFaderMSB = function(channel, control, value, status, group) { @@ -601,33 +601,33 @@ var fullValue = (PioneerDDJSB2.highResMSB[group].deckFader << 7) + value; if (PioneerDDJSB2.shiftPressed && - engine.getValue(group, 'volume') === 0 && + engine.getValue(group, "volume") === 0 && fullValue !== 0 && - engine.getValue(group, 'play') === 0 + engine.getValue(group, "play") === 0 ) { - PioneerDDJSB2.chFaderStart[channel] = engine.getValue(group, 'playposition'); - engine.setValue(group, 'play', 1); + PioneerDDJSB2.chFaderStart[channel] = engine.getValue(group, "playposition"); + engine.setValue(group, "play", 1); } else if ( PioneerDDJSB2.shiftPressed && - engine.getValue(group, 'volume') !== 0 && + engine.getValue(group, "volume") !== 0 && fullValue === 0 && - engine.getValue(group, 'play') === 1 && + engine.getValue(group, "play") === 1 && PioneerDDJSB2.chFaderStart[channel] !== null ) { - engine.setValue(group, 'play', 0); - engine.setValue(group, 'playposition', PioneerDDJSB2.chFaderStart[channel]); + engine.setValue(group, "play", 0); + engine.setValue(group, "playposition", PioneerDDJSB2.chFaderStart[channel]); PioneerDDJSB2.chFaderStart[channel] = null; } - engine.setValue(group, 'volume', fullValue / 0x3FFF); + engine.setValue(group, "volume", fullValue / 0x3FFF); }; /////////////////////////////////////////////////////////////// // SINGLE MESSAGE MIDI INPUT HANDLERS // /////////////////////////////////////////////////////////////// -PioneerDDJSB2.shiftButton = function(channel, control, value, status, group) { +PioneerDDJSB2.shiftButton = function(channel, control, value, _status, _group) { var index = 0; - PioneerDDJSB2.shiftPressed = (value == 0x7F); + PioneerDDJSB2.shiftPressed = (value === 0x7F); for (index in PioneerDDJSB2.chFaderStart) { PioneerDDJSB2.chFaderStart[index] = null; } @@ -635,50 +635,50 @@ PioneerDDJSB2.playButton = function(channel, control, value, status, group) { if (value) { - script.toggleControl(PioneerDDJSB2.deckSwitchTable[group], 'play'); + script.toggleControl(PioneerDDJSB2.deckSwitchTable[group], "play"); } }; PioneerDDJSB2.headphoneCueButton = function(channel, control, value, status, group) { if (value) { - script.toggleControl(group, 'pfl'); + script.toggleControl(group, "pfl"); } }; PioneerDDJSB2.headphoneShiftCueButton = function(channel, control, value, status, group) { if (value) { - script.toggleControl(PioneerDDJSB2.deckShiftSwitchTable[group], 'pfl'); + script.toggleControl(PioneerDDJSB2.deckShiftSwitchTable[group], "pfl"); } }; PioneerDDJSB2.hotCueButtons = function(channel, control, value, status, group) { var hotCueIndex = (control >= 0x40 ? control - 0x40 + 5 : control + 1); - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'hotcue_' + hotCueIndex + '_activate', value); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "hotcue_" + hotCueIndex + "_activate", value); }; PioneerDDJSB2.clearHotCueButtons = function(channel, control, value, status, group) { var hotCueIndex = (control >= 0x48 ? control - 0x48 + 5 : control - 7); if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'hotcue_' + hotCueIndex + '_clear', 1); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "hotcue_" + hotCueIndex + "_clear", 1); } }; PioneerDDJSB2.cueButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'cue_default', value); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "cue_default", value); }; PioneerDDJSB2.beatloopRollButtons = function(channel, control, value, status, group) { var index = (control <= 0x53 ? control - 0x50 : control - 0x54); engine.setValue( PioneerDDJSB2.deckSwitchTable[group], - 'beatlooproll_' + PioneerDDJSB2.looprollIntervals[index] + '_activate', + "beatlooproll_" + PioneerDDJSB2.looprollIntervals[index] + "_activate", value ); }; PioneerDDJSB2.vinylButton = function(channel, control, value, status, group) { if (PioneerDDJSB2.invertVinylSlipButton) { - engine.setValue(group, 'slip_enabled', value / 127); + engine.setValue(group, "slip_enabled", value / 127); } else { PioneerDDJSB2.toggleScratch(channel, control, value, status, group); } @@ -688,13 +688,13 @@ if (PioneerDDJSB2.invertVinylSlipButton) { PioneerDDJSB2.toggleScratch(channel, control, value, status, group); } else { - engine.setValue(group, 'slip_enabled', value / 127); + engine.setValue(group, "slip_enabled", value / 127); } }; PioneerDDJSB2.keyLockButton = function(channel, control, value, status, group) { if (value) { - script.toggleControl(group, 'keylock'); + script.toggleControl(group, "keylock"); } }; @@ -707,67 +707,67 @@ }; PioneerDDJSB2.loopInButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_in', value ? 1 : 0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_in", value ? 1 : 0); }; PioneerDDJSB2.loopOutButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_out', value ? 1 : 0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_out", value ? 1 : 0); }; PioneerDDJSB2.loopExitButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'reloop_exit', 1); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "reloop_exit", 1); } }; PioneerDDJSB2.loopHalveButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_scale', 0.5); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_scale", 0.5); } }; PioneerDDJSB2.loopDoubleButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_scale', 2.0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_scale", 2.0); } }; PioneerDDJSB2.loopMoveBackButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_move', -1); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_move", -1); } }; PioneerDDJSB2.loopMoveForwardButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'loop_move', 1); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "loop_move", 1); } }; PioneerDDJSB2.loadButton = function(channel, control, value, status, group) { if (value) { - engine.setValue(group, 'LoadSelectedTrack', 1); + engine.setValue(group, "LoadSelectedTrack", 1); } }; PioneerDDJSB2.reverseRollButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'reverseroll', value); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "reverseroll", value); }; PioneerDDJSB2.lowKillButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'filterLowKill', value ? 1 : 0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "filterLowKill", value ? 1 : 0); }; PioneerDDJSB2.midKillButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'filterMidKill', value ? 1 : 0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "filterMidKill", value ? 1 : 0); }; PioneerDDJSB2.highKillButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'filterHighKill', value ? 1 : 0); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "filterHighKill", value ? 1 : 0); }; PioneerDDJSB2.muteButton = function(channel, control, value, status, group) { - engine.setValue(PioneerDDJSB2.deckSwitchTable[group], 'mute', value); + engine.setValue(PioneerDDJSB2.deckSwitchTable[group], "mute", value); }; @@ -821,58 +821,58 @@ // LEDS // /////////////////////////////////////////////////////////////// -PioneerDDJSB2.headphoneCueLed = function(value, group, control) { +PioneerDDJSB2.headphoneCueLed = function(value, group, _control) { PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.headphoneCue, value); PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.shiftHeadphoneCue, value); }; -PioneerDDJSB2.keyLockLed = function(value, group, control) { +PioneerDDJSB2.keyLockLed = function(value, group, _control) { PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.keyLock, value); PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.shiftKeyLock, value); }; -PioneerDDJSB2.slipLed = function(value, group, control) { +PioneerDDJSB2.slipLed = function(value, group, _control) { PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.vinyl, value); PioneerDDJSB2.nonPadLedControl(group, PioneerDDJSB2.nonPadLeds.shiftVinyl, value); }; -PioneerDDJSB2.loopInLed = function(value, group, control) { +PioneerDDJSB2.loopInLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, false, 0, false, value); }; -PioneerDDJSB2.loopOutLed = function(value, group, control) { +PioneerDDJSB2.loopOutLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, false, 1, false, value); }; -PioneerDDJSB2.loopExitLed = function(value, group, control) { +PioneerDDJSB2.loopExitLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, false, 2, false, value); }; -PioneerDDJSB2.loopHalveLed = function(value, group, control) { +PioneerDDJSB2.loopHalveLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, false, 3, false, value); }; -PioneerDDJSB2.loopDoubleLed = function(value, group, control) { +PioneerDDJSB2.loopDoubleLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, false, 3, true, value); }; -PioneerDDJSB2.lowKillLed = function(value, group, control) { +PioneerDDJSB2.lowKillLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, true, 0, false, value); }; -PioneerDDJSB2.midKillLed = function(value, group, control) { +PioneerDDJSB2.midKillLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, true, 1, false, value); }; -PioneerDDJSB2.highKillLed = function(value, group, control) { +PioneerDDJSB2.highKillLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, true, 2, false, value); }; -PioneerDDJSB2.muteLed = function(value, group, control) { +PioneerDDJSB2.muteLed = function(value, group, _control) { PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.manualLoop, true, 3, false, value); }; -PioneerDDJSB2.samplerLeds = function(value, group, control) { +PioneerDDJSB2.samplerLeds = function(value, group, _control) { var sampler = PioneerDDJSB2.samplerGroups[group], channel; @@ -890,7 +890,7 @@ shifted; for (index in PioneerDDJSB2.looprollIntervals) { - if (control === 'beatlooproll_' + PioneerDDJSB2.looprollIntervals[index] + '_activate') { + if (control === "beatlooproll_" + PioneerDDJSB2.looprollIntervals[index] + "_activate") { padNum = index % 4; shifted = (index >= 4); PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.autoLoop, true, padNum, shifted, value); @@ -904,7 +904,7 @@ hotCueNum; for (hotCueNum = 1; hotCueNum <= 8; hotCueNum++) { - if (control === 'hotcue_' + hotCueNum + '_enabled') { + if (control === "hotcue_" + hotCueNum + "_enabled") { padNum = (hotCueNum - 1) % 4; shiftedGroup = (hotCueNum > 4); PioneerDDJSB2.padLedControl(group, PioneerDDJSB2.ledGroups.hotCue, shiftedGroup, padNum, false, value); @@ -916,7 +916,7 @@ PioneerDDJSB2.VuMeterLeds = function(value, group, control) { // The red LED lights up with MIDI values 119 (0x77) and above. That should only light up when // the track is clipping. - if (engine.getValue(group, 'PeakIndicator') === 1) { + if (engine.getValue(group, "PeakIndicator") === 1) { value = 119; } else { // 117 was determined experimentally so the yellow LED only lights @@ -927,9 +927,9 @@ if (!(PioneerDDJSB2.twinkleVumeterAutodjOn && engine.getValue("[AutoDJ]", "enabled"))) { var midiChannel; if (PioneerDDJSB2.showVumeterMaster) { - if (control === 'VuMeterL') { + if (control === "VuMeterL") { midiChannel = 0; - } else if (control === 'VuMeterR') { + } else if (control === "VuMeterR") { midiChannel = 1; } // Send for deck 1 or 2 @@ -941,24 +941,24 @@ midi.sendShortMsg(0xB0 + midiChannel, 2, value); } } else { - if (group == "[Master]") { - if (control == "VuMeterL") { - PioneerDDJSB2.valueVuMeter['[Channel1]_current'] = value; - PioneerDDJSB2.valueVuMeter['[Channel3]_current'] = value; + if (group === "[Master]") { + if (control === "VuMeterL") { + PioneerDDJSB2.valueVuMeter["[Channel1]_current"] = value; + PioneerDDJSB2.valueVuMeter["[Channel3]_current"] = value; } else { - PioneerDDJSB2.valueVuMeter['[Channel2]_current'] = value; - PioneerDDJSB2.valueVuMeter['[Channel4]_current'] = value; + PioneerDDJSB2.valueVuMeter["[Channel2]_current"] = value; + PioneerDDJSB2.valueVuMeter["[Channel4]_current"] = value; } } else { - PioneerDDJSB2.valueVuMeter[group + '_current'] = value; + PioneerDDJSB2.valueVuMeter[group + "_current"] = value; } for (var channel = 0; channel < 4; channel++) { - var midiOut = PioneerDDJSB2.valueVuMeter['[Channel' + (channel + 1) + ']_current']; - if (PioneerDDJSB2.valueVuMeter['[Channel' + (channel + 1) + ']_enabled']) { + var midiOut = PioneerDDJSB2.valueVuMeter["[Channel" + (channel + 1) + "]_current"]; + if (PioneerDDJSB2.valueVuMeter["[Channel" + (channel + 1) + "]_enabled"]) { midiOut = 0; } - if (midiOut < 5 && PioneerDDJSB2.valueVuMeter['[Channel' + (channel + 1) + ']_enabled'] === 0) { + if (midiOut < 5 && PioneerDDJSB2.valueVuMeter["[Channel" + (channel + 1) + "]_enabled"] === 0) { midiOut = 5; } @@ -1047,9 +1047,9 @@ }; PioneerDDJSB2.pitchBendFromJog = function(channel, movement) { - var group = (typeof channel === "string" ? channel : '[Channel' + channel + 1 + ']'); + var group = (typeof channel === "string" ? channel : "[Channel" + channel + 1 + "]"); - engine.setValue(group, 'jog', movement / 5 * PioneerDDJSB2.jogwheelSensivity); + engine.setValue(group, "jog", movement / 5 * PioneerDDJSB2.jogwheelSensitivity); }; @@ -1069,42 +1069,42 @@ return delta; }; -PioneerDDJSB2.rotarySelector = function(channel, control, value, status) { +PioneerDDJSB2.rotarySelector = function(channel, control, value, _status) { var delta = PioneerDDJSB2.getRotaryDelta(value); - engine.setValue('[Playlist]', 'SelectTrackKnob', delta); + engine.setValue("[Playlist]", "SelectTrackKnob", delta); PioneerDDJSB2.rotarySelectorChanged = true; }; -PioneerDDJSB2.shiftedRotarySelector = function(channel, control, value, status) { +PioneerDDJSB2.shiftedRotarySelector = function(channel, control, value, _status) { var delta = PioneerDDJSB2.getRotaryDelta(value), - f = (delta > 0 ? 'SelectNextPlaylist' : 'SelectPrevPlaylist'); + f = (delta > 0 ? "SelectNextPlaylist" : "SelectPrevPlaylist"); - engine.setValue('[Playlist]', f, Math.abs(delta)); + engine.setValue("[Playlist]", f, Math.abs(delta)); }; -PioneerDDJSB2.rotarySelectorClick = function(channel, control, value, status) { +PioneerDDJSB2.rotarySelectorClick = function(channel, control, value, _status) { if (PioneerDDJSB2.rotarySelectorChanged === true) { if (value) { - engine.setValue('[PreviewDeck1]', 'LoadSelectedTrackAndPlay', true); + engine.setValue("[PreviewDeck1]", "LoadSelectedTrackAndPlay", true); } else { if (PioneerDDJSB2.jumpPreviewEnabled) { - engine.setValue('[PreviewDeck1]', 'playposition', PioneerDDJSB2.jumpPreviewPosition); + engine.setValue("[PreviewDeck1]", "playposition", PioneerDDJSB2.jumpPreviewPosition); } PioneerDDJSB2.rotarySelectorChanged = false; } } else { if (value) { - engine.setValue('[PreviewDeck1]', 'stop', 1); + engine.setValue("[PreviewDeck1]", "stop", 1); } else { PioneerDDJSB2.rotarySelectorChanged = true; } } }; -PioneerDDJSB2.rotarySelectorShiftedClick = function(channel, control, value, status) { +PioneerDDJSB2.rotarySelectorShiftedClick = function(channel, control, value, _status) { if (value) { - engine.setValue('[Playlist]', 'ToggleSelectedSidebarItem', 1); + engine.setValue("[Playlist]", "ToggleSelectedSidebarItem", 1); } }; @@ -1113,12 +1113,12 @@ // FX // /////////////////////////////////////////////////////////////// -PioneerDDJSB2.EffectUnit = function (unitNumber) { +PioneerDDJSB2.EffectUnit = function(unitNumber) { var eu = this; - this.group = '[EffectRack1_EffectUnit' + unitNumber + ']'; - engine.setValue(this.group, 'show_focus', 1); + this.group = "[EffectRack1_EffectUnit" + unitNumber + "]"; + engine.setValue(this.group, "show_focus", 1); - this.EffectButton = function (buttonNumber) { + this.EffectButton = function(buttonNumber) { this.buttonNumber = buttonNumber; this.group = eu.group; @@ -1127,29 +1127,29 @@ components.Button.call(this); }; this.EffectButton.prototype = new components.Button({ - input: function (channel, control, value, status) { + input: function(channel, control, value, status) { if (this.isPress(channel, control, value, status)) { this.isLongPressed = false; - this.longPressTimer = engine.beginTimer(this.longPressTimeout, function () { - var effectGroup = '[EffectRack1_EffectUnit' + unitNumber + '_Effect' + this.buttonNumber + ']'; - script.toggleControl(effectGroup, 'enabled'); + this.longPressTimer = engine.beginTimer(this.longPressTimeout, function() { + var effectGroup = "[EffectRack1_EffectUnit" + unitNumber + "_Effect" + this.buttonNumber + "]"; + script.toggleControl(effectGroup, "enabled"); this.isLongPressed = true; }, true); } else { if (!this.isLongPressed) { - var focusedEffect = engine.getValue(eu.group, 'focused_effect'); + var focusedEffect = engine.getValue(eu.group, "focused_effect"); if (focusedEffect === this.buttonNumber) { - engine.setValue(eu.group, 'focused_effect', 0); + engine.setValue(eu.group, "focused_effect", 0); } else { - engine.setValue(eu.group, 'focused_effect', this.buttonNumber); + engine.setValue(eu.group, "focused_effect", this.buttonNumber); } } this.isLongPressed = false; engine.stopTimer(this.longPressTimer); } }, - outKey: 'focused_effect', - output: function (value, group, control) { + outKey: "focused_effect", + output: function(value, _group, _control) { this.send((value === this.buttonNumber) ? this.on : this.off); }, sendShifted: true, @@ -1161,33 +1161,33 @@ for (var i = 1; i <= 3; i++) { this.button[i] = new this.EffectButton(i); - var effectGroup = '[EffectRack1_EffectUnit' + unitNumber + '_Effect' + i + ']'; - engine.softTakeover(effectGroup, 'meta', true); - engine.softTakeover(eu.group, 'mix', true); + var effectGroup = "[EffectRack1_EffectUnit" + unitNumber + "_Effect" + i + "]"; + engine.softTakeover(effectGroup, "meta", true); + engine.softTakeover(eu.group, "mix", true); } this.knob = new components.Pot({ - unshift: function () { - this.input = function (channel, control, value, status) { + unshift: function() { + this.input = function(channel, control, value, _status) { value = (this.MSB << 7) + value; - var focusedEffect = engine.getValue(eu.group, 'focused_effect'); + var focusedEffect = engine.getValue(eu.group, "focused_effect"); if (focusedEffect === 0) { - engine.setParameter(eu.group, 'mix', value / this.max); + engine.setParameter(eu.group, "mix", value / this.max); } else { - var effectGroup = '[EffectRack1_EffectUnit' + unitNumber + '_Effect' + focusedEffect + ']'; - engine.setParameter(effectGroup, 'meta', value / this.max); + var effectGroup = "[EffectRack1_EffectUnit" + unitNumber + "_Effect" + focusedEffect + "]"; + engine.setParameter(effectGroup, "meta", value / this.max); } }; }, }); - this.knobSoftTakeoverHandler = engine.makeConnection(eu.group, 'focused_effect', function (value, group, control) { + this.knobSoftTakeoverHandler = engine.makeConnection(eu.group, "focused_effect", function(value, _group, _control) { if (value === 0) { - engine.softTakeoverIgnoreNextValue(eu.group, 'mix'); + engine.softTakeoverIgnoreNextValue(eu.group, "mix"); } else { - var effectGroup = '[EffectRack1_EffectUnit' + unitNumber + '_Effect' + value + ']'; - engine.softTakeoverIgnoreNextValue(effectGroup, 'meta'); + var effectGroup = "[EffectRack1_EffectUnit" + unitNumber + "_Effect" + value + "]"; + engine.softTakeoverIgnoreNextValue(effectGroup, "meta"); } }); }; diff -Nru mixxx-2.2.3~dfsg/res/controllers/Reloop-Beatmix-2-4-scripts.js mixxx-2.2.4~dfsg/res/controllers/Reloop-Beatmix-2-4-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Reloop-Beatmix-2-4-scripts.js 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Reloop-Beatmix-2-4-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -407,7 +407,7 @@ if (engine.isScratching(deck)) { engine.scratchTick(deck, newValue); // Scratch! } else { - engine.setValue(group, 'jog', newValue); // Pitch bend + engine.setValue(group, 'jog', newValue / 5); // Pitch bend } }; diff -Nru mixxx-2.2.3~dfsg/res/controllers/Soundless_joyMIDI.midi.xml mixxx-2.2.4~dfsg/res/controllers/Soundless_joyMIDI.midi.xml --- mixxx-2.2.3~dfsg/res/controllers/Soundless_joyMIDI.midi.xml 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Soundless_joyMIDI.midi.xml 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,1227 @@ + + + + Soundless joyMIDI + Ozzy Chiu + Soundless Portable MIDI Controller + https://www.mixxx.org/forums/viewtopic.php?f=7&t=13166 + https://www.mixxx.org/wiki/doku.php/soundless_studio_joymidi + + + + + + + + + [Master] + crossfader + 0xB0 + 0x01 + + + + + + [Master] + joyMIDI.fsr + 0xB0 + 0x02 + + + + + + [Master] + joyMIDI.joystick + 0xB0 + 0x10 + + + + + + [Master] + joyMIDI.joystick + 0xB0 + 0x11 + + + + + + [Master] + joyMIDI.joystick + 0xB0 + 0x12 + + + + + + [Master] + joyMIDI.joystick + 0xB0 + 0x13 + + + + + + [Master] + joyMIDI.gsensor + 0xB0 + 0x14 + + + + + + [Master] + joyMIDI.gsensor + 0xB0 + 0x15 + + + + + + [Master] + joyMIDI.gsensor + 0xB0 + 0x16 + + + + + + [Master] + joyMIDI.gsensor + 0xB0 + 0x17 + + + + + + + + [Channel1] + joyMIDI.wheel + 0xB0 + 0x0E + + + + + + + + [Channel2] + joyMIDI.wheel + 0xB0 + 0x0F + + + + + + + + [Channel1] + joyMIDI.shiftButton + 0x90 + 0x24 + + + + + + [Channel1] + joyMIDI.shiftButton + 0x80 + 0x24 + + + + + + [Channel1] + joyMIDI.syncButton + 0x90 + 0x25 + + + + + + [Channel1] + joyMIDI.syncButton + 0x80 + 0x25 + + + + + + [Channel1] + joyMIDI.cueButton + 0x90 + 0x26 + + + + + + [Channel1] + joyMIDI.cueButton + 0x80 + 0x26 + + + + + + [Channel1] + joyMIDI.playButton + 0x90 + 0x27 + + + + + + [Channel1] + joyMIDI.playButton + 0x80 + 0x27 + + + + + + [Channel1] + joyMIDI.scratchButton + 0x90 + 0x2C + + + + + + [Channel1] + joyMIDI.scratchButton + 0x80 + 0x2C + + + + + + [Channel1] + joyMIDI.keyButton + 0x90 + 0x2D + + + + + + [Channel1] + joyMIDI.keyButton + 0x80 + 0x2D + + + + + + [Channel1] + joyMIDI.beatgridButton + 0x90 + 0x2E + + + + + + [Channel1] + joyMIDI.beatgridButton + 0x80 + 0x2E + + + + + + [Channel1] + joyMIDI.volumeButton + 0x90 + 0x2F + + + + + + [Channel1] + joyMIDI.volumeButton + 0x80 + 0x2F + + + + + + + + [Channel1] + joyMIDI.shiftButton + 0x90 + 0x34 + + + + + + [Channel1] + joyMIDI.shiftButton + 0x80 + 0x34 + + + + + + [Channel1] + joyMIDI.filterLowButton + 0x90 + 0x35 + + + + + + [Channel1] + joyMIDI.filterLowButton + 0x80 + 0x35 + + + + + + [Channel1] + joyMIDI.filterMiddleButton + 0x90 + 0x36 + + + + + + [Channel1] + joyMIDI.filterMiddleButton + 0x80 + 0x36 + + + + + + [Channel1] + joyMIDI.filterHighButton + 0x90 + 0x37 + + + + + + [Channel1] + joyMIDI.filterHighButton + 0x80 + 0x37 + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x90 + 0x3C + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x80 + 0x3C + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x90 + 0x3D + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x80 + 0x3D + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x90 + 0x3E + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x80 + 0x3E + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x90 + 0x3F + + + + + + [Channel1] + joyMIDI.hotcueButton + 0x80 + 0x3F + + + + + + + + [Channel1] + joyMIDI.shiftButton + 0x90 + 0x44 + + + + + + [Channel1] + joyMIDI.shiftButton + 0x80 + 0x44 + + + + + + [Channel1] + joyMIDI.reloopToggleButton + 0x90 + 0x45 + + + + + + [Channel1] + joyMIDI.reloopToggleButton + 0x80 + 0x45 + + + + + + [Channel1] + joyMIDI.loopInButton + 0x90 + 0x46 + + + + + + [Channel1] + joyMIDI.loopInButton + 0x80 + 0x46 + + + + + + [Channel1] + joyMIDI.loopOutButton + 0x90 + 0x47 + + + + + + [Channel1] + joyMIDI.loopOutButton + 0x80 + 0x47 + + + + + + [Channel1] + joyMIDI.loop0p125Button + 0x90 + 0x4C + + + + + + [Channel1] + joyMIDI.loop0p125Button + 0x80 + 0x4C + + + + + + [Channel1] + joyMIDI.loop0p25Button + 0x90 + 0x4D + + + + + + [Channel1] + joyMIDI.loop0p25Button + 0x80 + 0x4D + + + + + + [Channel1] + joyMIDI.loop0p5Button + 0x90 + 0x4E + + + + + + [Channel1] + joyMIDI.loop0p5Button + 0x80 + 0x4E + + + + + + [Channel1] + joyMIDI.loop1Button + 0x90 + 0x4F + + + + + + [Channel1] + joyMIDI.loop1Button + 0x80 + 0x4F + + + + + + + + [Channel1] + joyMIDI.shiftButton + 0x90 + 0x54 + + + + + + [Channel1] + joyMIDI.shiftButton + 0x80 + 0x54 + + + + + + [Channel1] + joyMIDI.loadButton + 0x90 + 0x55 + + + + + + [Channel1] + joyMIDI.loadButton + 0x80 + 0x55 + + + + + + [Sampler1] + joyMIDI.sampler1Button + 0x90 + 0x5C + + + + + + [Sampler1] + joyMIDI.sampler1Button + 0x80 + 0x5C + + + + + + [Sampler2] + joyMIDI.sampler2Button + 0x90 + 0x5D + + + + + + [Sampler2] + joyMIDI.sampler2Button + 0x80 + 0x5D + + + + + + [Channel1] + joyMIDI.fx1Button + 0x90 + 0x5E + + + + + + [Channel1] + joyMIDI.fx1Button + 0x80 + 0x5E + + + + + + [Channel1] + joyMIDI.fx2Button + 0x90 + 0x5F + + + + + + [Channel1] + joyMIDI.fx2Button + 0x80 + 0x5F + + + + + + + + [Channel2] + joyMIDI.shiftButton + 0x90 + 0x28 + + + + + + [Channel2] + joyMIDI.shiftButton + 0x80 + 0x28 + + + + + + [Channel2] + joyMIDI.syncButton + 0x90 + 0x29 + + + + + + [Channel2] + joyMIDI.syncButton + 0x80 + 0x29 + + + + + + [Channel2] + joyMIDI.cueButton + 0x90 + 0x2A + + + + + + [Channel2] + joyMIDI.cueButton + 0x80 + 0x2A + + + + + + [Channel2] + joyMIDI.playButton + 0x90 + 0x2B + + + + + + [Channel2] + joyMIDI.playButton + 0x80 + 0x2B + + + + + + [Channel2] + joyMIDI.scratchButton + 0x90 + 0x30 + + + + + + [Channel2] + joyMIDI.scratchButton + 0x80 + 0x30 + + + + + + [Channel2] + joyMIDI.keyButton + 0x90 + 0x31 + + + + + + [Channel2] + joyMIDI.keyButton + 0x80 + 0x31 + + + + + + [Channel2] + joyMIDI.beatgridButton + 0x90 + 0x32 + + + + + + [Channel2] + joyMIDI.beatgridButton + 0x80 + 0x32 + + + + + + [Channel2] + joyMIDI.volumeButton + 0x90 + 0x33 + + + + + + [Channel2] + joyMIDI.volumeButton + 0x80 + 0x33 + + + + + + + + [Channel2] + joyMIDI.shiftButton + 0x90 + 0x38 + + + + + + [Channel2] + joyMIDI.shiftButton + 0x80 + 0x38 + + + + + + [Channel2] + joyMIDI.filterLowButton + 0x90 + 0x39 + + + + + + [Channel2] + joyMIDI.filterLowButton + 0x80 + 0x39 + + + + + + [Channel2] + joyMIDI.filterMiddleButton + 0x90 + 0x3A + + + + + + [Channel2] + joyMIDI.filterMiddleButton + 0x80 + 0x3A + + + + + + [Channel2] + joyMIDI.filterHighButton + 0x90 + 0x3B + + + + + + [Channel2] + joyMIDI.filterHighButton + 0x80 + 0x3B + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x90 + 0x40 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x80 + 0x40 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x90 + 0x41 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x80 + 0x41 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x90 + 0x42 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x80 + 0x42 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x90 + 0x43 + + + + + + [Channel2] + joyMIDI.hotcueButton + 0x80 + 0x43 + + + + + + + + [Channel2] + joyMIDI.shiftButton + 0x90 + 0x48 + + + + + + [Channel2] + joyMIDI.shiftButton + 0x80 + 0x48 + + + + + + [Channel2] + joyMIDI.reloopToggleButton + 0x90 + 0x49 + + + + + + [Channel2] + joyMIDI.reloopToggleButton + 0x80 + 0x49 + + + + + + [Channel2] + joyMIDI.loopInButton + 0x90 + 0x4A + + + + + + [Channel2] + joyMIDI.loopInButton + 0x80 + 0x4A + + + + + + [Channel2] + joyMIDI.loopOutButton + 0x90 + 0x4B + + + + + + [Channel2] + joyMIDI.loopOutButton + 0x80 + 0x4B + + + + + + [Channel2] + joyMIDI.loop0p125Button + 0x90 + 0x50 + + + + + + [Channel2] + joyMIDI.loop0p125Button + 0x80 + 0x50 + + + + + + [Channel2] + joyMIDI.loop0p25Button + 0x90 + 0x51 + + + + + + [Channel2] + joyMIDI.loop0p25Button + 0x80 + 0x51 + + + + + + [Channel2] + joyMIDI.loop0p5Button + 0x90 + 0x52 + + + + + + [Channel2] + joyMIDI.loop0p5Button + 0x80 + 0x52 + + + + + + [Channel2] + joyMIDI.loop1Button + 0x90 + 0x53 + + + + + + [Channel2] + joyMIDI.loop1Button + 0x80 + 0x53 + + + + + + + + [Channel2] + joyMIDI.shiftButton + 0x90 + 0x58 + + + + + + [Channel2] + joyMIDI.shiftButton + 0x80 + 0x58 + + + + + + [Channel2] + joyMIDI.loadButton + 0x90 + 0x59 + + + + + + [Channel2] + joyMIDI.loadButton + 0x80 + 0x59 + + + + + + [Sampler3] + joyMIDI.sampler3Button + 0x90 + 0x60 + + + + + + [Sampler3] + joyMIDI.sampler3Button + 0x80 + 0x60 + + + + + + [Sampler4] + joyMIDI.sampler4Button + 0x90 + 0x61 + + + + + + [Sampler4] + joyMIDI.sampler4Button + 0x80 + 0x61 + + + + + + [Channel2] + joyMIDI.fx1Button + 0x90 + 0x62 + + + + + + [Channel2] + joyMIDI.fx1Button + 0x80 + 0x62 + + + + + + [Channel2] + joyMIDI.fx2Button + 0x90 + 0x63 + + + + + + [Channel2] + joyMIDI.fx2Button + 0x80 + 0x63 + + + + + + + + diff -Nru mixxx-2.2.3~dfsg/res/controllers/Soundless_joyMIDI_scripts.js mixxx-2.2.4~dfsg/res/controllers/Soundless_joyMIDI_scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Soundless_joyMIDI_scripts.js 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Soundless_joyMIDI_scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,710 @@ +/******************************************************************* + * Soundless studio. + * Author: Ozzy Chiu (ozzy.chc@gmail.com) + * Version: 2020-01-17 + * + * Variables on joyMIDI.userSetting can be modified by users to suit their preferences + *******************************************************************/ +var joyMIDI = { + + // User Setting + "userSetting": { + // Enable the knob(button+jog) function + "knobEnable": true, + // Enable the beatloop with roll(1) function otherwise toggle(0) + "beatLoopRollEnable": true, + // Enable the samplers played from cue(1) otherwise from track start(0) + "samplerCueModeEnable": true, + }, + + // Channel1 variable + "[Channel1]": { + btnShift: 0, + btnSync: 0, syncTimerID: null, syncLongPress: 0, + btnScratch: 0, isScratchPermanent: 0, scratchTimerID: 0, + btnKey: 0, + btnBeatgrid: 0, + btnVolume: 0, + btnFilter: {"low": 0, "middle": 0, "high": 0}, + btnFx: {"1": 0, "2": 0}, + + connBeatIndicator: {}, + }, + + // Channel2 variable + "[Channel2]": { + btnShift: 0, + btnSync: 0, syncTimerID: null, syncLongPress: 0, + btnScratch: 0, isScratchPermanent: 0, scratchTimerID: 0, + btnKey: 0, + btnBeatgrid: 0, + btnVolume: 0, + btnFilter: {"low": 0, "middle": 0, "high": 0}, + btnFx: {"1": 0, "2": 0}, + + connBeatIndicator: {}, + }, +}; + +// Constant +var RELEASED = 0, + PRESSED = 1, + ADJUSTED = 2; + +//---------------------------- +// Constants for scratching +//---------------------------- + +/* Internal jog-wheel */ +var forwardFinetune = 0; +var backwardFinetune = 0; + +var intervalPerRev = 64; +var rpm = 33 + 1 / 3; +var alpha = 1 / 16; +var beta = (1 / 12) / 32; + +var scratchDisableTime = 100; +var enableAccVal = true; + +/* external jog-wheel */ +// var forwardFinetune = 0; +// var backwardFinetune = 1; + +// var intervalPerRev = 1000; +// var rpm = 33 + 1 / 3; +// var alpha = 1.0 / 8; +// var beta = alpha / 32; + +// var scratchDisableTime = 150; +// var enableAccVal = false; + +//---------------------------- +// Common variable +//---------------------------- +var joystickDelay = false; +var fsrDelay = false; + + + + +//==== Init, Shutdown ======================================================== +joyMIDI.init = function(_id, _debug) { + joyMIDI["[Channel1]"].connBeatIndicator = engine.makeConnection("[Channel1]", "beat_active", joyMIDI.onBeatIndicator); + joyMIDI["[Channel2]"].connBeatIndicator = engine.makeConnection("[Channel2]", "beat_active", joyMIDI.onBeatIndicator); +}; + +joyMIDI.shutdown = function() { + joyMIDI["[Channel1]"].connBeatIndicator.disconnect(); + joyMIDI["[Channel2]"].connBeatIndicator.disconnect(); +}; + +//==== Callback ============================================================== +joyMIDI.onBeatIndicator = function(value, group, _control) { + var fader = engine.getParameter("[Master]", "crossfader"); + if (fader < 0.5) { + // Left + if (group === "[Channel1]") { + midi.sendShortMsg(0x91, 0x00, (value) ? 0x7F : 0x00); + } + } else { + // Right + if (group === "[Channel2]") { + midi.sendShortMsg(0x92, 0x00, (value) ? 0x7F : 0x00); + } + } +}; + +//==== Button ================================================================ +joyMIDI.shiftButton = function(channel, control, value, status, group) { + joyMIDI[group].btnShift = (value > 0) ? PRESSED : RELEASED; +}; + +joyMIDI.syncButton = function(channel, control, value, status, group) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + if (engine.getValue(group, "sync_enabled") > 0) { + engine.setValue(group, "sync_enabled", 0); + } else { + engine.setValue(group, "sync_enabled", 1); + if (joyMIDI[group].syncTimerID !== null) { + engine.stopTimer(joyMIDI[group].syncTimerID); + } + joyMIDI[group].syncLongPress = 0; + joyMIDI[group].syncTimerID = + engine.beginTimer(1000, function() { joyMIDI.syncTimerHandler(group); }, true); + } + } else { + engine.setValue(group, "rate", 0); + } + } else { + // release + if (!joyMIDI[group].btnShift) { + if (joyMIDI[group].syncTimerID !== null) { + if (joyMIDI[group].syncLongPress === 0 && engine.getValue(group, "sync_enabled") === 1) { + engine.stopTimer(joyMIDI[group].syncTimerID); + engine.setValue(group, "sync_enabled", 0); + } + joyMIDI[group].syncTimerID = null; + } + } + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnSync = PRESSED; + } else { + // release + if (joyMIDI[group].btnSync !== ADJUSTED) { + if (!joyMIDI[group].btnShift) { + engine.setValue(group, "beatsync", 1); + } else { + engine.setValue(group, "rate", 0); + } + } + joyMIDI[group].btnSync = RELEASED; + } + } +}; + +joyMIDI.syncTimerHandler = function(group) { + joyMIDI[group].syncLongPress = 1; +}; + +joyMIDI.cueButton = function(channel, control, value, status, group) { + var sft = joyMIDI[group].btnShift; + var cmd = sft ? "start" : "cue_default"; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.playButton = function(channel, control, value, status, group) { + var sft = joyMIDI[group].btnShift; + var cmd = sft ? "reverse" : "play"; + + if (value > 0) { + script.toggleControl(group, cmd); + } +}; + +joyMIDI.scratchButton = function(channel, control, value, status, group) { + if (value > 0) { + joyMIDI[group].isScratchPermanent = !joyMIDI[group].isScratchPermanent; + } +}; + +joyMIDI.keyButton = function(channel, control, value, status, group) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + engine.setValue(group, "sync_key", 1); + } else { + engine.setValue(group, "reset_key", 1); + } + } else { + // release + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnKey = PRESSED; + } else { + // release + if (joyMIDI[group].btnKey !== ADJUSTED) { + if (joyMIDI[group].btnShift === RELEASED) { + engine.setValue(group, "sync_key", 1); + } else { + engine.setValue(group, "reset_key", 1); + } + } + joyMIDI[group].btnKey = RELEASED; + } + } +}; + +joyMIDI.beatgridButton = function(channel, control, value, status, group) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + engine.setValue(group, "beats_translate_curpos", 1); + engine.setValue(group, "beats_translate_curpos", 0); + } else { + engine.setValue(group, "beats_translate_match_alignment", 1); + engine.setValue(group, "beats_translate_match_alignment", 0); + } + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnBeatgrid = PRESSED; + } else { + // release + if (joyMIDI[group].btnBeatgrid !== ADJUSTED) { + if (joyMIDI[group].btnShift === RELEASED) { + engine.setValue(group, "beats_translate_curpos", 1); + engine.setValue(group, "beats_translate_curpos", 0); + } else { + engine.setValue(group, "beats_translate_match_alignment", 1); + engine.setValue(group, "beats_translate_match_alignment", 0); + } + } + joyMIDI[group].btnBeatgrid = RELEASED; + } + } +}; + +joyMIDI.volumeButton = function(channel, control, value, status, group) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + engine.setValue(group, "volume", 1.0); + } + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnVolume = PRESSED; + } else { + // release + if (joyMIDI[group].btnVolume !== ADJUSTED) { + if (joyMIDI[group].btnShift === RELEASED) { + engine.setValue(group, "volume", 1.0); + } + } + joyMIDI[group].btnVolume = RELEASED; + } + } +}; + +joyMIDI.filterLowButton = function(channel, control, value, status, group) { + joyMIDI.filterButton(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "button_parameter1", "low"); +}; + +joyMIDI.filterMiddleButton = function(channel, control, value, status, group) { + joyMIDI.filterButton(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "button_parameter2", "middle"); +}; + +joyMIDI.filterHighButton = function(channel, control, value, status, group) { + joyMIDI.filterButton(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "button_parameter3", "high"); +}; + +joyMIDI.filterButton = function(channel, control, value, status, group, group2, param, select) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + script.toggleControl(group2, param); + } + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnFilter[select] = PRESSED; + } else { + // release + if (joyMIDI[group].btnFilter[select] !== ADJUSTED) { + if (joyMIDI[group].btnShift === RELEASED) { + script.toggleControl(group2, param); + } + } + joyMIDI[group].btnFilter[select] = RELEASED; + } + } +}; + +joyMIDI.hotcueButton = function(channel, control, value, status, group) { + var num = control - ((group === "[Channel1]") ? 0x3B : 0x3F); + var sft = joyMIDI[group].btnShift; + var cmd = "hotcue_" + num + (sft ? "_clear" : "_activate"); + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.reloopToggleButton = function(channel, control, value, status, group) { + var usr = joyMIDI.userSetting.beatLoopRollEnable; + var sft = joyMIDI[group].btnShift; + var cmd = sft ? (usr?"beatlooproll_activate":"beatloop_activate") : "reloop_toggle"; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.loopInButton = function(channel, control, value, status, group) { + var sft = joyMIDI[group].btnShift; + var cmd = sft ? "loop_halve" : "loop_in"; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.loopOutButton = function(channel, control, value, status, group) { + var sft = joyMIDI[group].btnShift; + var cmd = sft ? "loop_double" : "loop_out"; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.loop0p125Button = function(channel, control, value, status, group) { + joyMIDI.loopXButton(channel, control, value, status, group, + ["beatloop_0.125_toggle", "beatloop_2_toggle", + "beatlooproll_0.125_activate", "beatlooproll_2_activate"]); +}; + +joyMIDI.loop0p25Button = function(channel, control, value, status, group) { + joyMIDI.loopXButton(channel, control, value, status, group, + ["beatloop_0.25_toggle", "beatloop_4_toggle", + "beatlooproll_0.25_activate", "beatlooproll_4_activate"]); +}; + +joyMIDI.loop0p5Button = function(channel, control, value, status, group) { + joyMIDI.loopXButton(channel, control, value, status, group, + ["beatloop_0.5_toggle", "beatloop_8_toggle", + "beatlooproll_0.5_activate", "beatlooproll_8_activate"]); +}; + +joyMIDI.loop1Button = function(channel, control, value, status, group) { + joyMIDI.loopXButton(channel, control, value, status, group, + ["beatloop_1_toggle", "beatloop_16_toggle", + "beatlooproll_1_activate", "beatlooproll_16_activate"]); +}; + +joyMIDI.loopXButton = function(channel, control, value, status, group, commands) { + var usr = joyMIDI.userSetting.beatLoopRollEnable; + var sft = joyMIDI[group].btnShift; + var cmd = commands[sft + (usr?2:0)]; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.loadButton = function(channel, control, value, status, group) { + var sft = joyMIDI[group].btnShift; + var cmd = sft ? "eject" : "LoadSelectedTrack"; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.sampler1Button = function(channel, control, value, status, group) { + joyMIDI.samplerButton(channel, control, value, status, group, 1); +}; + +joyMIDI.sampler2Button = function(channel, control, value, status, group) { + joyMIDI.samplerButton(channel, control, value, status, group, 2); +}; + +joyMIDI.sampler3Button = function(channel, control, value, status, group) { + joyMIDI.samplerButton(channel, control, value, status, group, 3); +}; + +joyMIDI.sampler4Button = function(channel, control, value, status, group) { + joyMIDI.samplerButton(channel, control, value, status, group, 4); +}; + +joyMIDI.samplerButton = function(channel, control, value, status, group, number) { + var commands = ["start_play", "start_stop", "cue_gotoandplay", "cue_default"]; + var usr = joyMIDI.userSetting.samplerCueModeEnable; + var sft = joyMIDI["[Channel"+ ((number > 2) ? 2 : 1) +"]"].btnShift; + var cmd = commands[sft + (usr?2:0)]; + var val = (value > 0) ? 1 : 0; + + engine.setValue(group, cmd, val); +}; + +joyMIDI.fx1Button = function(channel, control, value, status, group) { + joyMIDI.fxButton(channel, control, value, status, group, + "[EffectRack1_EffectUnit1]", "group_"+group+"_enable", 1); +}; + +joyMIDI.fx2Button = function(channel, control, value, status, group) { + joyMIDI.fxButton(channel, control, value, status, group, + "[EffectRack1_EffectUnit2]", "group_"+group+"_enable", 2); +}; + +joyMIDI.fxButton = function(channel, control, value, status, group, group2, param, select) { + if (!joyMIDI.userSetting.knobEnable) { + // knob disabled + if (value > 0) { + // press + if (!joyMIDI[group].btnShift) { + script.toggleControl(group2, param); + } + } + } else { + // knob enabled + if (value > 0) { + // press + joyMIDI[group].btnFx[select] = PRESSED; + } else { + // release + if (joyMIDI[group].btnFx[select] !== ADJUSTED) { + if (joyMIDI[group].btnShift === RELEASED) { + script.toggleControl(group2, param); + } + } + joyMIDI[group].btnFx[select] = RELEASED; + } + } +}; + +//==== Wheel ============================================================ +joyMIDI.wheel = function(channel, control, value, status, group) { + if (joyMIDI[group].btnSync >= PRESSED) { + joyMIDI.wheelSync(channel, control, value, status, group); + joyMIDI[group].btnSync = ADJUSTED; + } else if (joyMIDI[group].btnKey >= PRESSED) { + joyMIDI.wheelKey(channel, control, value, status, group); + joyMIDI[group].btnKey = ADJUSTED; + } else if (joyMIDI[group].btnBeatgrid >= PRESSED) { + joyMIDI.wheelBeatgrid(channel, control, value, status, group); + joyMIDI[group].btnBeatgrid = ADJUSTED; + } else if (joyMIDI[group].btnVolume >= PRESSED) { + joyMIDI.wheelVolume(channel, control, value, status, group); + joyMIDI[group].btnVolume = ADJUSTED; + + } else if (joyMIDI[group].btnFilter["low"] >= PRESSED) { + joyMIDI.wheelFilterLow(channel, control, value, status, group); + joyMIDI[group].btnFilter["low"] = ADJUSTED; + } else if (joyMIDI[group].btnFilter["middle"] >= PRESSED) { + joyMIDI.wheelFilterMiddle(channel, control, value, status, group); + joyMIDI[group].btnFilter["middle"] = ADJUSTED; + } else if (joyMIDI[group].btnFilter["high"] >= PRESSED) { + joyMIDI.wheelFilterHigh(channel, control, value, status, group); + joyMIDI[group].btnFilter["high"] = ADJUSTED; + + } else if (joyMIDI[group].btnFx["1"] >= PRESSED) { + joyMIDI.wheelFx1(channel, control, value, status, group); + joyMIDI[group].btnFx["1"] = ADJUSTED; + } else if (joyMIDI[group].btnFx["2"] >= PRESSED) { + joyMIDI.wheelFx2(channel, control, value, status, group); + joyMIDI[group].btnFx["2"] = ADJUSTED; + } else if (joyMIDI[group].btnFx["3"] >= PRESSED) { + joyMIDI.wheelFx3(channel, control, value, status, group); + joyMIDI[group].btnFx["3"] = ADJUSTED; + + } else if (joyMIDI[group].isScratchPermanent) { + joyMIDI.wheelScratch(channel, control, value, status, group); + } else { + joyMIDI.wheelPitchBend(channel, control, value, status, group); + } +}; + +joyMIDI.wheelPitchBend = function(channel, control, value, status, group) { + var newValue = joyMIDI.helperAccel(value - 64); + + engine.setValue(group, "jog", newValue); + print(group + "jog=" + newValue); +}; + +joyMIDI.wheelScratch = function(channel, control, value, status, group) { + var deck = script.deckFromGroup(group); + var newValue = joyMIDI.helperAccel(value - 64); + + if (newValue > 0) newValue = newValue + forwardFinetune; + else newValue = newValue - backwardFinetune; + + if (joyMIDI[group].scratchTimerID) { + engine.stopTimer(joyMIDI[group].scratchTimerID); + } + + // if (!engine.isScratching(deck)) { + engine.scratchEnable(deck, intervalPerRev, rpm, alpha, beta); + // } + + engine.scratchTick(deck, newValue); + + joyMIDI[group].scratchTimerID = + engine.beginTimer(scratchDisableTime, function() { joyMIDI.ScratchTimerHandler(deck, group); }, true); +}; + +joyMIDI.ScratchTimerHandler = function(deck, group) { + engine.scratchDisable(deck); + joyMIDI[group].scratchTimerID = 0; +}; + +joyMIDI.wheelSync = function(channel, control, value, status, group) { + var delta = joyMIDI.helperAccel(value - 64) * 0.01; + var oldValue = engine.getValue(group, "rate"); + var newValue = oldValue + delta; + + newValue = joyMIDI.helperLimit(newValue, 1.0, -1.0); + engine.setValue(group, "rate", newValue); + print(group + "rate=" + newValue); +}; + +joyMIDI.wheelKey = function(channel, control, value, status, group) { + var delta = /*joyMIDI.helperAccel*/(value - 64) * 0.2; + var oldValue = engine.getValue(group, "pitch"); + var newValue = oldValue + delta; + + newValue = joyMIDI.helperLimit(newValue, 6.0, -6.0); + engine.setValue(group, "pitch", newValue); + print(group + "pitch=" + newValue); +}; + +joyMIDI.wheelBeatgrid = function(channel, control, value, status, group) { + var delta = joyMIDI.helperAccel(value - 64); + var count = Math.abs(delta); + + for (var i=0; i 0) { + engine.setValue(group, "beats_translate_earlier", 1); + print(group + "beats_translate_earlier"); + } else { + engine.setValue(group, "beats_translate_later", 1); + print(group + "beats_translate_later"); + } + } +}; + +joyMIDI.wheelVolume = function(channel, control, value, status, group) { + var delta = joyMIDI.helperAccel(value - 64) * 0.01; + var oldValue = engine.getValue(group, "volume"); + var newValue = oldValue + delta; + + newValue = joyMIDI.helperLimit(newValue, 1.0, 0); + engine.setValue(group, "volume", newValue); + print(group + "volume=" + newValue); +}; + +joyMIDI.wheelFilterLow = function(channel, control, value, status, group) { + joyMIDI.wheelFilter(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "parameter1", "low"); +}; + +joyMIDI.wheelFilterMiddle = function(channel, control, value, status, group) { + joyMIDI.wheelFilter(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "parameter2", "middle"); +}; + +joyMIDI.wheelFilterHigh = function(channel, control, value, status, group) { + joyMIDI.wheelFilter(channel, control, value, status, group, + "[EqualizerRack1_" + group + "_Effect1]", "parameter3", "high"); +}; + +joyMIDI.wheelFilter = function(channel, control, value, status, group, group2, param, select) { + var delta = joyMIDI.helperAccel(value - 64) * 0.01; + var oldValue = engine.getParameter(group2, param); + var newValue = oldValue + delta; + + newValue = joyMIDI.helperLimit(newValue, 1.0, 0); + engine.setParameter(group2, param, newValue); + print(group + "EQ_" + select + "=" + newValue); +}; + +joyMIDI.wheelFx1 = function(channel, control, value, status, group) { + if (group === "[Channel1]") { + joyMIDI.wheelFx(channel, control, value, status, group, + "[EffectRack1_EffectUnit1]", "mix", 1); + } else { + joyMIDI.wheelFx(channel, control, value, status, group, + "[EffectRack1_EffectUnit2]", "mix", 1); + } +}; + +joyMIDI.wheelFx2 = function(channel, control, value, status, group) { + if (group === "[Channel1]") { + joyMIDI.wheelFx(channel, control, value, status, group, + "[EffectRack1_EffectUnit1]", "super1", 2); + } else { + joyMIDI.wheelFx(channel, control, value, status, group, + "[EffectRack1_EffectUnit2]", "super1", 2); + } +}; + +joyMIDI.wheelFx = function(channel, control, value, status, group, group2, param, _select) { + var delta = joyMIDI.helperAccel(value - 64) * 0.01; + var oldValue = engine.getParameter(group2, param); + var newValue = oldValue + delta; + + newValue = joyMIDI.helperLimit(newValue, 1.0, 0); + engine.setParameter(group2, param, newValue); +}; + + +//==== Jojstick ============================================================ +joyMIDI.joystick = function(channel, control, _value, _status, _group) { + + if (joystickDelay === false) { + /* Delay a while */ + joystickDelay = true; + engine.beginTimer(300, function() { joystickDelay = false; }, true); + + if (!joyMIDI["[Channel1]"].btnShift) { + /* Joystick only */ + switch (control) { + case 0x10: engine.setValue("[Library]", "MoveLeft", true); break; + case 0x11: engine.setValue("[Library]", "MoveRight", true); break; + case 0x12: engine.setValue("[Library]", "MoveDown", true); break; + case 0x13: engine.setValue("[Library]", "MoveUp", true); break; + } + } else { + /* Joystick + shift */ + switch (control) { + case 0x10: /* Do nothing */ break; + case 0x11: /* Do nothing */ break; + case 0x12: engine.setValue("[Library]", "ScrollDown", true); break; + case 0x13: engine.setValue("[Library]", "ScrollUp", true); break; + } + } + } +}; + + +//==== FSR ============================================================ +joyMIDI.fsr = function(_channel, _control, _value, _status, _group) { + + if (fsrDelay === false) { + /* Delay a while */ + fsrDelay = true; + engine.beginTimer(300, function() { fsrDelay = false; }, true); + + var isShift = joyMIDI["[Channel1]"].btnShift === true || joyMIDI["[Channel2]"].btnShift === true; + if (! isShift) { + /* FSR only */ + engine.setValue("[Library]", "MoveFocusForward", true); + } else { + /* FSR + shift */ + engine.setValue("[Library]", "MoveFocusBackward", true); + } + } +}; + +//==== Helper ============================================================= +joyMIDI.helperLimit = function(input, max, min) { + input = input > max ? max : input; + input = input < min ? min : input; + return input; +}; + +joyMIDI.helperAccel = function(input) { + var acc = 0; + if (enableAccVal === true) { + acc = Math.pow(Math.abs(input), 2); + acc = (input > 0) ? acc : -acc; + } else { + acc = input; + } + return acc; +}; diff -Nru mixxx-2.2.3~dfsg/res/controllers/Stanton-DJC-4.midi.xml mixxx-2.2.4~dfsg/res/controllers/Stanton-DJC-4.midi.xml --- mixxx-2.2.3~dfsg/res/controllers/Stanton-DJC-4.midi.xml 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Stanton-DJC-4.midi.xml 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,3506 @@ + + + + Stanton DJC.4 + Martin Bruset Solberg, Christoph Zimmermann + The Stanton DJC.4 is a 4 deck controller with large, touch-sensitive jog wheels and a built-in audio interface (2 inputs, 2 outputs). It features 4 FX units and a master VU meter. + https://mixxx.org/wiki/doku.php/stanton_djc.4 + + + + + + + + + + [Channel1] + DJC4.deck[0].beatLoopEncoder.input + 0xB0 + 0x01 + + + + + + [Channel1] + beatloop_activate + 0x90 + 0x01 + + + + + + [Channel2] + DJC4.deck[1].beatLoopEncoder.input + 0xB1 + 0x01 + + + + + + [Channel2] + beatloop_activate + 0x91 + 0x01 + + + + + + [Channel3] + DJC4.deck[2].beatLoopEncoder.input + 0xB2 + 0x01 + + + + + + [Channel3] + beatloop_activate + 0x92 + 0x01 + + + + + + [Channel4] + DJC4.deck[3].beatLoopEncoder.input + 0xB3 + 0x01 + + + + + + [Channel4] + beatloop_activate + 0x93 + 0x01 + + + + + + [Channel1] + DJC4.deck[0].wheelTurn + 0xB0 + 0x02 + + + + + + [Channel1] + loop_halve + 0x90 + 0x02 + + + + + + [Channel2] + DJC4.deck[1].wheelTurn + 0xB1 + 0x02 + + + + + + [Channel2] + loop_halve + 0x91 + 0x02 + + + + + + [Channel3] + DJC4.deck[2].wheelTurn + 0xB2 + 0x02 + + + + + + [Channel3] + loop_halve + 0x92 + 0x02 + + + + + + [Channel4] + DJC4.deck[3].wheelTurn + 0xB3 + 0x02 + + + + + + [Channel4] + loop_halve + 0x93 + 0x02 + + + + + + [Channel1] + loop_double + 0x90 + 0x03 + + + + + + [Channel1] + pregain + 0xB0 + 0x03 + + + + + + [Channel2] + loop_double + 0x91 + 0x03 + + + + + + [Channel2] + pregain + 0xB1 + 0x03 + + + + + + [Channel3] + loop_double + 0x92 + 0x03 + + + + + + [Channel3] + pregain + 0xB2 + 0x03 + + + + + + [Channel4] + loop_double + 0x93 + 0x03 + + + + + + [Channel4] + pregain + 0xB3 + 0x03 + + + + + + [Channel1] + loop_in + 0x90 + 0x04 + + + + + + [Channel2] + loop_in + 0x91 + 0x04 + + + + + + [Channel3] + loop_in + 0x92 + 0x04 + + + + + + [Channel4] + loop_in + 0x93 + 0x04 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter3 + 0xB0 + 0x04 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter3 + 0xB1 + 0x04 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter3 + 0xB2 + 0x04 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter3 + 0xB3 + 0x04 + + + + + + [Channel1] + loop_out + 0x90 + 0x05 + + + + + + [Channel2] + loop_out + 0x91 + 0x05 + + + + + + [Channel3] + loop_out + 0x92 + 0x05 + + + + + + [Channel4] + loop_out + 0x93 + 0x05 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter2 + 0xB0 + 0x05 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter2 + 0xB1 + 0x05 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter2 + 0xB2 + 0x05 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter2 + 0xB3 + 0x05 + + + + + + [Channel1] + reloop_toggle + 0x90 + 0x06 + + + + + + [Channel2] + reloop_toggle + 0x91 + 0x06 + + + + + + [Channel3] + reloop_toggle + 0x92 + 0x06 + + + + + + [Channel4] + reloop_toggle + 0x93 + 0x06 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + parameter1 + 0xB0 + 0x06 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + parameter1 + 0xB1 + 0x06 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + parameter1 + 0xB2 + 0x06 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + parameter1 + 0xB3 + 0x06 + + + + + + [Channel1] + volume + 0xB0 + 0x07 + + + + + + [Channel2] + volume + 0xB1 + 0x07 + + + + + + [Channel3] + volume + 0xB2 + 0x07 + + + + + + [Channel4] + volume + 0xB3 + 0x07 + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[0].dryWetKnob.input + 0xB0 + 0x08 + + + + + + [EffectRack1_EffectUnit3] + DJC4.effectUnit[1].dryWetKnob.input + 0xB1 + 0x08 + + + + + + [EffectRack1_EffectUnit3] + DJC4.effectUnit[2].dryWetKnob.input + 0xB2 + 0x08 + + + + + + [EffectRack1_EffectUnit3] + DJC4.effectUnit[3].dryWetKnob.input + 0xB3 + 0x08 + + + + + + [Channel1] + hotcue_1_activate + 0x90 + 0x08 + + + + + + [Channel2] + hotcue_1_activate + 0x91 + 0x08 + + + + + + [Channel3] + hotcue_1_activate + 0x92 + 0x08 + + + + + + [Channel4] + hotcue_1_activate + 0x93 + 0x08 + + + + + + [Channel1] + hotcue_2_activate + 0x90 + 0x09 + + + + + + [Channel2] + hotcue_2_activate + 0x91 + 0x09 + + + + + + [Channel3] + hotcue_2_activate + 0x92 + 0x09 + + + + + + [Channel4] + hotcue_2_activate + 0x93 + 0x09 + + + + + + [EffectRack1_EffectUnit1_Effect1] + DJC4.effectUnit[0].knobs[1].input + 0xB0 + 0x09 + + + + + + [EffectRack1_EffectUnit2_Effect1] + DJC4.effectUnit[1].knobs[1].input + 0xB1 + 0x09 + + + + + + [EffectRack1_EffectUnit1_Effect1] + DJC4.effectUnit[2].knobs[1].input + 0xB2 + 0x09 + + + + + + [EffectRack1_EffectUnit2_Effect1] + DJC4.effectUnit[3].knobs[1].input + 0xB3 + 0x09 + + + + + + [Channel1] + hotcue_3_activate + 0x90 + 0x0A + + + + + + [Channel2] + hotcue_3_activate + 0x91 + 0x0A + + + + + + [Channel3] + hotcue_3_activate + 0x92 + 0x0A + + + + + + [Channel4] + hotcue_3_activate + 0x93 + 0x0A + + + + + + [EffectRack1_EffectUnit1_Effect2] + DJC4.effectUnit[0].knobs[2].input + 0xB0 + 0x0A + + + + + + [EffectRack1_EffectUnit2_Effect2] + DJC4.effectUnit[1].knobs[2].input + 0xB1 + 0x0A + + + + + + [EffectRack1_EffectUnit1_Effect2] + DJC4.effectUnit[2].knobs[2].input + 0xB2 + 0x0A + + + + + + [EffectRack1_EffectUnit2_Effect2] + DJC4.effectUnit[3].knobs[2].input + 0xB3 + 0x0A + + + + + + [Channel1] + hotcue_4_activate + 0x90 + 0x0B + + + + + + [Channel2] + hotcue_4_activate + 0x91 + 0x0B + + + + + + [Channel3] + hotcue_4_activate + 0x92 + 0x0B + + + + + + [Channel4] + hotcue_4_activate + 0x93 + 0x0B + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[0].knobs[3].input + 0xB0 + 0x0B + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[1].knobs[3].input + 0xB1 + 0x0B + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[2].knobs[3].input + 0xB2 + 0x0B + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[3].knobs[3].input + 0xB3 + 0x0B + + + + + + [Sampler1] + DJC4.deck[0].samplerButtons[0].input + 0x90 + 0x0C + + + + + + [Sampler5] + DJC4.deck[1].samplerButtons[0].input + 0x91 + 0x0C + + + + + + [Sampler1] + DJC4.deck[2].samplerButtons[0].input + 0x92 + 0x0C + + + + + + [Sampler5] + DJC4.deck[3].samplerButtons[0].input + 0x93 + 0x0C + + + + + + [Sampler2] + DJC4.deck[0].samplerButtons[1].input + 0x90 + 0x0D + + + + + + [Sampler6] + DJC4.deck[1].samplerButtons[1].input + 0x91 + 0x0D + + + + + + [Sampler2] + DJC4.deck[2].samplerButtons[1].input + 0x92 + 0x0D + + + + + + [Sampler6] + DJC4.deck[3].samplerButtons[1].input + 0x93 + 0x0D + + + + + + [Sampler] + DJC4.samplerVolume + 0xB0 + 0x0D + + + + + + [Library] + DJC4.browseEncoder.input + 0xB0 + 0x0E + + + + + + [Sampler3] + DJC4.deck[0].samplerButtons[2].input + 0x90 + 0x0E + + + + + + [Sampler7] + DJC4.deck[1].samplerButtons[2].input + 0x91 + 0x0E + + + + + + [Sampler3] + DJC4.deck[2].samplerButtons[2].input + 0x92 + 0x0E + + + + + + [Sampler7] + DJC4.deck[3].samplerButtons[2].input + 0x93 + 0x0E + + + + + + [Sampler4] + DJC4.deck[0].samplerButtons[3].input + 0x90 + 0x0F + + + + + + [Sampler8] + DJC4.deck[1].samplerButtons[3].input + 0x91 + 0x0F + + + + + + [Sampler4] + DJC4.deck[2].samplerButtons[3].input + 0x92 + 0x0F + + + + + + [Sampler8] + DJC4.deck[3].samplerButtons[3].input + 0x93 + 0x0F + + + + + + [Channel1] + keylock + 0x90 + 0x10 + + + + + + [Channel2] + keylock + 0x91 + 0x10 + + + + + + [Channel3] + keylock + 0x92 + 0x10 + + + + + + [Channel4] + keylock + 0x93 + 0x10 + + + + + + [Master] + crossfader + 0xB0 + 0x10 + + + + + + [Master] + DJC4.crossfaderCurve + 0xB0 + 0x12 + + + + + + [Channel1] + beatsync + 0x90 + 0x12 + + + + + + [Channel2] + beatsync + 0x91 + 0x12 + + + + + + [Channel3] + beatsync + 0x92 + 0x12 + + + + + + [Channel4] + beatsync + 0x93 + 0x12 + + + + + + [Channel1] + rate_temp_down + 0x90 + 0x13 + + + + + + [Channel2] + rate_temp_down + 0x91 + 0x13 + + + + + + [Channel3] + rate_temp_down + 0x92 + 0x13 + + + + + + [Channel4] + rate_temp_down + 0x93 + 0x13 + + + + + + [Master] + headMix + 0xB0 + 0x13 + + + + + + [Channel1] + rate_temp_up + 0x90 + 0x14 + + + + + + [Channel2] + rate_temp_up + 0x91 + 0x14 + + + + + + [Channel3] + rate_temp_up + 0x92 + 0x14 + + + + + + [Channel4] + rate_temp_up + 0x93 + 0x14 + + + + + + [Master] + headGain + 0xB0 + 0x14 + + + + + + [Channel1] + DJC4.deck[0].toggleScratchMode + 0x90 + 0x15 + + + + + + [Channel2] + DJC4.deck[1].toggleScratchMode + 0x91 + 0x15 + + + + + + [Channel3] + DJC4.deck[2].toggleScratchMode + 0x92 + 0x15 + + + + + + [Channel4] + DJC4.deck[3].toggleScratchMode + 0x93 + 0x15 + + + + + + [Channel1] + bpm_tap + 0x90 + 0x16 + + + + + + [Channel2] + bpm_tap + 0x91 + 0x16 + + + + + + [Channel3] + bpm_tap + 0x92 + 0x16 + + + + + + [Channel4] + bpm_tap + 0x93 + 0x16 + + + + + + [Channel1] + cue_default + 0x90 + 0x17 + + + + + + [Channel2] + cue_default + 0x91 + 0x17 + + + + + + [Channel3] + cue_default + 0x92 + 0x17 + + + + + + [Channel4] + cue_default + 0x93 + 0x17 + + + + + + [Channel1] + play + 0x90 + 0x18 + + + + + + [Channel2] + play + 0x91 + 0x18 + + + + + + [Channel3] + play + 0x92 + 0x18 + + + + + + [Channel4] + play + 0x93 + 0x18 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter3 + 0x90 + 0x19 + + + + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter3 + 0x91 + 0x19 + + + + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter3 + 0x92 + 0x19 + + + + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter3 + 0x93 + 0x19 + + + + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter2 + 0x90 + 0x1A + + + + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter2 + 0x91 + 0x1A + + + + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter2 + 0x92 + 0x1A + + + + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter2 + 0x93 + 0x1A + + + + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter1 + 0x90 + 0x1B + + + + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter1 + 0x91 + 0x1B + + + + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter1 + 0x92 + 0x1B + + + + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter1 + 0x93 + 0x1B + + + + + + [Channel1] + pfl + 0x90 + 0x1C + + + + + + [Channel2] + pfl + 0x91 + 0x1C + + + + + + [Channel3] + pfl + 0x92 + 0x1C + + + + + + [Channel4] + pfl + 0x93 + 0x1C + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[0].effectFocusButton.input + 0x90 + 0x1D + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[1].effectFocusButton.input + 0x91 + 0x1D + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[2].effectFocusButton.input + 0x92 + 0x1D + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[3].effectFocusButton.input + 0x93 + 0x1D + + + + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + 0x90 + 0x1E + + + + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + 0x91 + 0x1E + + + + + + [EffectRack1_EffectUnit3] + group_[Channel3]_enable + 0x92 + 0x1E + + + + + + [EffectRack1_EffectUnit4] + group_[Channel4]_enable + 0x93 + 0x1E + + + + + + [EffectRack1_EffectUnit1_Effect1] + DJC4.effectUnit[0].enableButtons[1].input + 0x90 + 0x1F + + + + + + [EffectRack1_EffectUnit2_Effect1] + DJC4.effectUnit[1].enableButtons[1].input + 0x91 + 0x1F + + + + + + [EffectRack1_EffectUnit3_Effect1] + DJC4.effectUnit[2].enableButtons[1].input + 0x92 + 0x1F + + + + + + [EffectRack1_EffectUnit4_Effect1] + DJC4.effectUnit[3].enableButtons[1].input + 0x93 + 0x1F + + + + + + [EffectRack1_EffectUnit1_Effect2] + DJC4.effectUnit[0].enableButtons[2].input + 0x90 + 0x20 + + + + + + [EffectRack1_EffectUnit2_Effect2] + DJC4.effectUnit[1].enableButtons[2].input + 0x91 + 0x20 + + + + + + [EffectRack1_EffectUnit3_Effect2] + DJC4.effectUnit[2].enableButtons[2].input + 0x92 + 0x20 + + + + + + [EffectRack1_EffectUnit4_Effect2] + DJC4.effectUnit[3].enableButtons[2].input + 0x93 + 0x20 + + + + + + [Channel1] + DJC4.deck[0].wheelTurn + 0xB0 + 0x20 + + + + + + [Channel2] + DJC4.deck[1].wheelTurn + 0xB1 + 0x20 + + + + + + [Channel3] + DJC4.deck[2].wheelTurn + 0xB2 + 0x20 + + + + + + [Channel4] + DJC4.deck[3].wheelTurn + 0xB3 + 0x20 + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[0].enableButtons[3].input + 0x90 + 0x21 + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[1].enableButtons[3].input + 0x91 + 0x21 + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[2].enableButtons[3].input + 0x92 + 0x21 + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[3].enableButtons[3].input + 0x93 + 0x21 + + + + + + [Channel1] + LoadSelectedTrack + 0x90 + 0x22 + + + + + + [Channel3] + LoadSelectedTrack + 0x92 + 0x22 + + + + + + [Channel2] + LoadSelectedTrack + 0x91 + 0x23 + + + + + + [Channel4] + LoadSelectedTrack + 0x93 + 0x23 + + + + + + [QuickEffectRack1_[Channel1]] + super1 + 0xB0 + 0x24 + + + + + + [QuickEffectRack1_[Channel2]] + super1 + 0xB1 + 0x24 + + + + + + [QuickEffectRack1_[Channel3]] + super1 + 0xB2 + 0x24 + + + + + + [QuickEffectRack1_[Channel4]] + super1 + 0xB3 + 0x24 + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[0].dryWetKnob.input + 0xB0 + 0x26 + + + + + + [EffectRack1_EffectUnit2] + DJC4.effectUnit[1].dryWetKnob.input + 0xB1 + 0x26 + + + + + + [EffectRack1_EffectUnit2] + DJC4.effectUnit[2].dryWetKnob.input + 0xB2 + 0x26 + + + + + + [EffectRack1_EffectUnit3] + DJC4.effectUnit[3].dryWetKnob.input + 0xB3 + 0x26 + + + + + + [Channel1] + DJC4.deck[0].wheelTouch + 0x90 + 0x26 + + + + + + [Channel2] + DJC4.deck[1].wheelTouch + 0x91 + 0x26 + + + + + + [Channel3] + DJC4.deck[2].wheelTouch + 0x92 + 0x26 + + + + + + [Channel4] + DJC4.deck[3].wheelTouch + 0x93 + 0x26 + + + + + + [Library] + MoveFocus + 0x90 + 0x27 + + + + + + [Library] + DJC4.browseEncoder.input + 0xB0 + 0x2C + + + + + + [Master] + DJC4.shiftButton + 0x90 + 0x2D + + + + + + [Channel1] + beatlooproll_activate + 0x90 + 0x33 + + + + + + [Channel2] + beatlooproll_activate + 0x91 + 0x33 + + + + + + [Channel3] + beatlooproll_activate + 0x92 + 0x33 + + + + + + [Channel4] + beatlooproll_activate + 0x93 + 0x33 + + + + + + [Channel1] + loop_in_goto + 0x90 + 0x36 + + + + + + [Channel2] + loop_in_goto + 0x91 + 0x36 + + + + + + [Channel3] + loop_in_goto + 0x92 + 0x36 + + + + + + [Channel4] + loop_in_goto + 0x93 + 0x36 + + + + + + [Channel1] + loop_out_goto + 0x90 + 0x37 + + + + + + [Channel2] + loop_out_goto + 0x91 + 0x37 + + + + + + [Channel3] + loop_out_goto + 0x92 + 0x37 + + + + + + [Channel4] + loop_out_goto + 0x93 + 0x37 + + + + + + [Channel1] + reloop_andstop + 0x90 + 0x38 + + + + + + [Channel2] + reloop_andstop + 0x91 + 0x38 + + + + + + [Channel3] + reloop_andstop + 0x92 + 0x38 + + + + + + [Channel4] + reloop_andstop + 0x93 + 0x38 + + + + + + [Channel1] + hotcue_1_clear + 0x90 + 0x3A + + + + + + [Channel2] + hotcue_1_clear + 0x91 + 0x3A + + + + + + [Channel3] + hotcue_1_clear + 0x92 + 0x3A + + + + + + [Channel4] + hotcue_1_clear + 0x93 + 0x3A + + + + + + [Channel1] + hotcue_2_clear + 0x90 + 0x3B + + + + + + [Channel2] + hotcue_2_clear + 0x91 + 0x3B + + + + + + [Channel3] + hotcue_2_clear + 0x92 + 0x3B + + + + + + [Channel4] + hotcue_2_clear + 0x93 + 0x3B + + + + + + [Channel1] + hotcue_3_clear + 0x90 + 0x3C + + + + + + [Channel2] + hotcue_3_clear + 0x91 + 0x3C + + + + + + [Channel3] + hotcue_3_clear + 0x92 + 0x3C + + + + + + [Channel4] + hotcue_3_clear + 0x93 + 0x3C + + + + + + [Channel1] + hotcue_4_clear + 0x90 + 0x3D + + + + + + [Channel2] + hotcue_4_clear + 0x91 + 0x3D + + + + + + [Channel3] + hotcue_4_clear + 0x92 + 0x3D + + + + + + [Channel4] + hotcue_4_clear + 0x93 + 0x3D + + + + + + [Sampler1] + DJC4.deck[0].samplerButtons[0].input + 0x90 + 0x3E + + + + + + [Sampler5] + DJC4.deck[1].samplerButtons[0].input + 0x91 + 0x3E + + + + + + [Sampler1] + DJC4.deck[3].samplerButtons[0].input + 0x92 + 0x3E + + + + + + [Sampler5] + DJC4.deck[3].samplerButtons[0].input + 0x93 + 0x3E + + + + + + [Sampler2] + DJC4.deck[0].samplerButtons[1].input + 0x90 + 0x3F + + + + + + [Sampler6] + DJC4.deck[1].samplerButtons[1].input + 0x91 + 0x3F + + + + + + [Sampler2] + DJC4.deck[2].samplerButtons[1].input + 0x92 + 0x3F + + + + + + [Sampler6] + DJC4.deck[3].samplerButtons[1].input + 0x93 + 0x3F + + + + + + [Sampler3] + DJC4.deck[0].samplerButtons[2].input + 0x90 + 0x40 + + + + + + [Sampler7] + DJC4.deck[1].samplerButtons[2].input + 0x91 + 0x40 + + + + + + [Sampler3] + DJC4.deck[2].samplerButtons[2].input + 0x92 + 0x40 + + + + + + [Sampler7] + DJC4.deck[3].samplerButtons[2].input + 0x93 + 0x40 + + + + + + [Sampler4] + DJC4.deck[0].samplerButtons[3].input + 0x90 + 0x41 + + + + + + [Sampler8] + DJC4.deck[1].samplerButtons[3].input + 0x91 + 0x41 + + + + + + [Sampler4] + DJC4.deck[2].samplerButtons[3].input + 0x92 + 0x41 + + + + + + [Sampler8] + DJC4.deck[3].samplerButtons[3].input + 0x93 + 0x41 + + + + + + [Channel1] + quantize + 0x90 + 0x42 + + + + + + [Channel2] + quantize + 0x91 + 0x42 + + + + + + [Channel3] + quantize + 0x92 + 0x42 + + + + + + [Channel4] + quantize + 0x93 + 0x42 + + + + + + [Channel1] + reverse + 0x90 + 0x44 + + + + + + [Channel2] + reverse + 0x91 + 0x44 + + + + + + [Channel3] + reverse + 0x92 + 0x44 + + + + + + [Channel4] + reverse + 0x93 + 0x44 + + + + + + [Channel1] + cue_gotoandstop + 0x90 + 0x49 + + + + + + [Channel2] + cue_gotoandstop + 0x91 + 0x49 + + + + + + [Channel3] + cue_gotoandstop + 0x92 + 0x49 + + + + + + [Channel4] + cue_gotoandstop + 0x93 + 0x49 + + + + + + [Channel1] + cue_set + 0x90 + 0x4A + + + + + + [Channel2] + cue_set + 0x91 + 0x4A + + + + + + [Channel3] + cue_set + 0x92 + 0x4A + + + + + + [Channel4] + cue_set + 0x93 + 0x4A + + + + + + [QuickEffectRack1_[Channel1]_Effect1] + enabled + 0x90 + 0x4D + + + + + + [QuickEffectRack1_[Channel2]_Effect1] + enabled + 0x91 + 0x4D + + + + + + [QuickEffectRack1_[Channel3]_Effect1] + enabled + 0x92 + 0x4D + + + + + + [QuickEffectRack1_[Channel4]_Effect1] + enabled + 0x93 + 0x4D + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[0].effectFocusButton.input + 0x90 + 0x4F + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[1].effectFocusButton.input + 0x91 + 0x4F + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[2].effectFocusButton.input + 0x92 + 0x4F + + + + + + [EffectRack1_EffectUnit1] + DJC4.effectUnit[3].effectFocusButton.input + 0x93 + 0x4F + + + + + + [EffectRack1_EffectUnit1_Effect1] + DJC4.effectUnit[0].enableButtons[1].input + 0x90 + 0x51 + + + + + + [EffectRack1_EffectUnit2_Effect1] + DJC4.effectUnit[1].enableButtons[1].input + 0x91 + 0x51 + + + + + + [EffectRack1_EffectUnit1_Effect1] + DJC4.effectUnit[2].enableButtons[1].input + 0x92 + 0x51 + + + + + + [EffectRack1_EffectUnit2_Effect1] + DJC4.effectUnit[3].enableButtons[1].input + 0x93 + 0x51 + + + + + + [EffectRack1_EffectUnit1_Effect2] + DJC4.effectUnit[0].enableButtons[2].input + 0x90 + 0x52 + + + + + + [EffectRack1_EffectUnit2_Effect2] + DJC4.effectUnit[1].enableButtons[2].input + 0x91 + 0x52 + + + + + + [EffectRack1_EffectUnit1_Effect2] + DJC4.effectUnit[2].enableButtons[2].input + 0x92 + 0x52 + + + + + + [EffectRack1_EffectUnit2_Effect2] + DJC4.effectUnit[3].enableButtons[2].input + 0x93 + 0x52 + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[0].enableButtons[3].input + 0x90 + 0x53 + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[1].enableButtons[3].input + 0x91 + 0x53 + + + + + + [EffectRack1_EffectUnit1_Effect3] + DJC4.effectUnit[2].enableButtons[3].input + 0x92 + 0x53 + + + + + + [EffectRack1_EffectUnit2_Effect3] + DJC4.effectUnit[3].enableButtons[3].input + 0x93 + 0x53 + + + + + + [Library] + MoveLeft + 0x90 + 0x54 + + + + + + [Library] + MoveRight + 0x91 + 0x55 + + + + + + [Library] + MoveLeft + 0x92 + 0x54 + + + + + + [Library] + MoveRight + 0x93 + 0x55 + + + + + + [Channel1] + DJC4.deck[0].wheelTouch + 0x90 + 0x58 + + + + + + [Channel2] + DJC4.deck[1].wheelTouch + 0x91 + 0x58 + + + + + + [Channel3] + DJC4.deck[2].wheelTouch + 0x92 + 0x58 + + + + + + [Channel4] + DJC4.deck[3].wheelTouch + 0x93 + 0x58 + + + + + + [Master] + maximize_library + 0x90 + 0x59 + + + + + + [Channel1] + rate + 0xE0 + + + + + + [Channel2] + rate + 0xE1 + + + + + + [Channel3] + rate + 0xE2 + + + + + + [Channel4] + rate + 0xE3 + + + + + + + + [Channel1] + loop_halve + 0x90 + 0x02 + 0x7F + 0x00 + 0.5 + + + [Channel2] + loop_halve + 0x91 + 0x02 + 0x7F + 0x00 + 0.5 + + + [Channel3] + loop_halve + 0x92 + 0x02 + 0x7F + 0x00 + 0.5 + + + [Channel4] + loop_halve + 0x93 + 0x02 + 0x7F + 0x00 + 0.5 + + + [Channel1] + loop_double + 0x90 + 0x03 + 0x7F + 0x00 + 0.5 + + + [Channel2] + loop_double + 0x91 + 0x03 + 0x7F + 0x00 + 0.5 + + + [Channel3] + loop_double + 0x92 + 0x03 + 0x7F + 0x00 + 0.5 + + + [Channel4] + loop_double + 0x93 + 0x03 + 0x7F + 0x00 + 0.5 + + + [Channel1] + loop_start_position + 0x90 + 0x04 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel2] + loop_start_position + 0x91 + 0x04 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel3] + loop_start_position + 0x92 + 0x04 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel4] + loop_start_position + 0x93 + 0x04 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel1] + loop_end_position + 0x90 + 0x05 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel2] + loop_end_position + 0x91 + 0x05 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel3] + loop_end_position + 0x92 + 0x05 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel4] + loop_end_position + 0x93 + 0x05 + 0x7F + 0x00 + 0 + 2147483647 + + + [Channel1] + loop_enabled + 0x90 + 0x06 + 0x7F + 0x00 + 0.5 + + + [Channel2] + loop_enabled + 0x91 + 0x06 + 0x7F + 0x00 + 0.5 + + + [Channel3] + loop_enabled + 0x92 + 0x06 + 0x7F + 0x00 + 0.5 + + + [Channel4] + loop_enabled + 0x93 + 0x06 + 0x7F + 0x00 + 0.5 + + + [Channel1] + hotcue_1_enabled + 0x90 + 0x08 + 0x7F + 0x00 + 0.5 + + + [Channel2] + hotcue_1_enabled + 0x91 + 0x08 + 0x7F + 0x00 + 0.5 + + + [Channel3] + hotcue_1_enabled + 0x92 + 0x08 + 0x7F + 0x00 + 0.5 + + + [Channel4] + hotcue_1_enabled + 0x93 + 0x08 + 0x7F + 0x00 + 0.5 + + + [Channel1] + hotcue_2_enabled + 0x90 + 0x09 + 0x7F + 0x00 + 0.5 + + + [Channel2] + hotcue_2_enabled + 0x91 + 0x09 + 0x7F + 0x00 + 0.5 + + + [Channel3] + hotcue_2_enabled + 0x92 + 0x09 + 0x7F + 0x00 + 0.5 + + + [Channel4] + hotcue_2_enabled + 0x93 + 0x09 + 0x7F + 0x00 + 0.5 + + + [Channel1] + hotcue_3_enabled + 0x90 + 0x0A + 0x7F + 0x00 + 0.5 + + + [Channel2] + hotcue_3_enabled + 0x91 + 0x0A + 0x7F + 0x00 + 0.5 + + + [Channel3] + hotcue_3_enabled + 0x92 + 0x0A + 0x7F + 0x00 + 0.5 + + + [Channel4] + hotcue_3_enabled + 0x93 + 0x0A + 0x7F + 0x00 + 0.5 + + + [Channel1] + hotcue_4_enabled + 0x90 + 0x0B + 0x7F + 0x00 + 0.5 + + + [Channel2] + hotcue_4_enabled + 0x91 + 0x0B + 0x7F + 0x00 + 0.5 + + + [Channel3] + hotcue_4_enabled + 0x92 + 0x0B + 0x7F + 0x00 + 0.5 + + + [Channel4] + hotcue_4_enabled + 0x93 + 0x0B + 0x7F + 0x00 + 0.5 + + + [Channel1] + keylock + 0x90 + 0x10 + 0x7F + 0x00 + 0.5 + + + [Channel2] + keylock + 0x91 + 0x10 + 0x7F + 0x00 + 0.5 + + + [Channel3] + keylock + 0x92 + 0x10 + 0x7F + 0x00 + 0.5 + + + [Channel4] + keylock + 0x93 + 0x10 + 0x7F + 0x00 + 0.5 + + + [Channel1] + beatsync + 0x90 + 0x12 + 0x7F + 0x00 + 0.5 + + + [Channel2] + beatsync + 0x91 + 0x12 + 0x7F + 0x00 + 0.5 + + + [Channel3] + beatsync + 0x92 + 0x12 + 0x7F + 0x00 + 0.5 + + + [Channel4] + beatsync + 0x93 + 0x12 + 0x7F + 0x00 + 0.5 + + + [Channel1] + rate_temp_down + 0x90 + 0x13 + 0x7F + 0x00 + 0.5 + + + [Channel2] + rate_temp_down + 0x91 + 0x13 + 0x7F + 0x00 + 0.5 + + + [Channel3] + rate_temp_down + 0x92 + 0x13 + 0x7F + 0x00 + 0.5 + + + [Channel4] + rate_temp_down + 0x93 + 0x13 + 0x7F + 0x00 + 0.5 + + + [Channel1] + rate_temp_up + 0x90 + 0x14 + 0x7F + 0x00 + 0.5 + + + [Channel2] + rate_temp_up + 0x91 + 0x14 + 0x7F + 0x00 + 0.5 + + + [Channel3] + rate_temp_up + 0x92 + 0x14 + 0x7F + 0x00 + 0.5 + + + [Channel4] + rate_temp_up + 0x93 + 0x14 + 0x7F + 0x00 + 0.5 + + + [Channel1] + play_indicator + 0x90 + 0x16 + 0x7F + 0x00 + 0.5 + + + [Channel2] + play_indicator + 0x91 + 0x16 + 0x7F + 0x00 + 0.5 + + + [Channel3] + play_indicator + 0x92 + 0x16 + 0x7F + 0x00 + 0.5 + + + [Channel4] + play_indicator + 0x93 + 0x16 + 0x7F + 0x00 + 0.5 + + + [Channel1] + cue_indicator + 0x90 + 0x17 + 0x7F + 0x00 + 0.5 + + + [Channel2] + cue_indicator + 0x91 + 0x17 + 0x7F + 0x00 + 0.5 + + + [Channel3] + cue_indicator + 0x92 + 0x17 + 0x7F + 0x00 + 0.5 + + + [Channel4] + cue_indicator + 0x93 + 0x17 + 0x7F + 0x00 + 0.5 + + + [Channel1] + play_indicator + 0x90 + 0x18 + 0x7F + 0x00 + 0.5 + + + [Channel2] + play_indicator + 0x91 + 0x18 + 0x7F + 0x00 + 0.5 + + + [Channel3] + play_indicator + 0x92 + 0x18 + 0x7F + 0x00 + 0.5 + + + [Channel4] + play_indicator + 0x93 + 0x18 + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter3 + 0x90 + 0x19 + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter3 + 0x91 + 0x19 + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter3 + 0x92 + 0x19 + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter3 + 0x93 + 0x19 + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter2 + 0x90 + 0x1A + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter2 + 0x91 + 0x1A + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter2 + 0x92 + 0x1A + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter2 + 0x93 + 0x1A + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel1]_Effect1] + button_parameter1 + 0x90 + 0x1B + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel2]_Effect1] + button_parameter1 + 0x91 + 0x1B + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel3]_Effect1] + button_parameter1 + 0x92 + 0x1B + 0x7F + 0x00 + 0.5 + + + [EqualizerRack1_[Channel4]_Effect1] + button_parameter1 + 0x93 + 0x1B + 0x7F + 0x00 + 0.5 + + + [Channel1] + pfl + 0x90 + 0x1C + 0x7F + 0x00 + 0.5 + + + [Channel2] + pfl + 0x91 + 0x1C + 0x7F + 0x00 + 0.5 + + + [Channel3] + pfl + 0x92 + 0x1C + 0x7F + 0x00 + 0.5 + + + [Channel4] + pfl + 0x93 + 0x1C + 0x7F + 0x00 + 0.5 + + + [EffectRack1_EffectUnit1] + group_[Channel1]_enable + 0x90 + 0x1E + 0x7F + 0x00 + 0.5 + + + [EffectRack1_EffectUnit2] + group_[Channel2]_enable + 0x91 + 0x1E + 0x7F + 0x00 + 0.5 + + + [EffectRack1_EffectUnit3] + group_[Channel3]_enable + 0x92 + 0x1E + 0x7F + 0x00 + 0.5 + + + [EffectRack1_EffectUnit4] + group_[Channel4]_enable + 0x93 + 0x1E + 0x7F + 0x00 + 0.5 + + + [Channel1] + play_indicator + 0x90 + 0x22 + 0x7F + 0x00 + 0.5 + 0.0 + + + [Channel3] + play_indicator + 0x92 + 0x22 + 0x7F + 0x00 + 0.5 + 0.0 + + + [Channel2] + play_indicator + 0x91 + 0x23 + 0x7F + 0x00 + 0.5 + 0.0 + + + [Channel4] + play_indicator + 0x93 + 0x23 + 0x7F + 0x00 + 0.5 + 0.0 + + + [QuickEffectRack1_[Channel1]_Effect1] + enabled + 0x90 + 0x27 + 0x7F + 0x00 + 0.5 + 0.0 + + + [QuickEffectRack1_[Channel2]_Effect1] + enabled + 0x91 + 0x27 + 0x7F + 0x00 + 0.5 + 0.0 + + + [QuickEffectRack1_[Channel3]_Effect1] + enabled + 0x92 + 0x27 + 0x7F + 0x00 + 0.5 + 0.0 + + + [QuickEffectRack1_[Channel4]_Effect1] + enabled + 0x93 + 0x27 + 0x7F + 0x00 + 0.5 + 0.0 + + + + diff -Nru mixxx-2.2.3~dfsg/res/controllers/Stanton-DJC-4-scripts.js mixxx-2.2.4~dfsg/res/controllers/Stanton-DJC-4-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Stanton-DJC-4-scripts.js 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Stanton-DJC-4-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,378 @@ +/** + * Stanton DJC.4 controller script v1.0 for Mixxx v2.2.3 + * + * Written by Martin Bruset Solberg + * Adopted for v2.2.3 by Christoph Zimmermann + * + * Based on: + * Denon MC2000 script by Esteban Serrano Roloff, + * Denon MC7000 script by OsZ + * Roland DJ-505 script by Jan Holthuis + * + * TODO: + * Pitch range + * + **/ + +var DJC4 = {}; + +///////////////// +// Tweakables. // +///////////////// + +DJC4.autoShowFourDecks = false; +DJC4.showMasterVu = true; // if set to false, show channel VU meter + +// amount the dryWetKnob changes the value for each increment +DJC4.dryWetAdjustValue = 0.05; + +/////////// +// Code. // +/////////// + +// ---------- Global variables ---------- + +// MIDI Reception commands (from spec) +DJC4.leds = { + loopminus: 2, + loopplus: 3, + loopin: 4, + loopout: 5, + loopon: 6, + loopdel: 7, + hotcue1: 8, + hotcue2: 9, + hotcue3: 10, + hotcue4: 11, + sample1: 12, + sample2: 13, + sample3: 14, + sample4: 15, + keylock: 16, + sync: 18, + pbendminus: 19, + pbendplus: 20, + scratch: 21, + tap: 22, + cue: 23, + play: 24, + highkill: 25, + midkill: 26, + lowkill: 27, + pfl: 28, + fxon: 30, + fxexf1: 31, + fxexf2: 32, + fxexf3: 33, + loadac: 34, + loadbd: 35, + videofx: 36, + xflink: 37, + keyon: 38, + filteron: 39, + tx: 46, + fx: 47 +}; + +// ---------- Functions ---------- + +// Called when the MIDI device is opened & set up. +DJC4.init = function() { + var i; + + // Put all LEDs to default state. + DJC4.allLed2Default(); + + engine.makeConnection("[Channel3]", "track_loaded", DJC4.autoShowDecks); + engine.makeConnection("[Channel4]", "track_loaded", DJC4.autoShowDecks); + + if (engine.getValue("[Master]", "num_samplers") < 8) { + engine.setValue("[Master]", "num_samplers", 8); + } + + DJC4.browseEncoder = new components.Encoder({ + group: "[Library]", + inKey: "Move", + input: function(channel, control, value) { + if (value === 0x41) { + engine.setParameter(this.group, this.inKey + "Down", 1); + } else if (value === 0x3F) { + engine.setParameter(this.group, this.inKey + "Up", 1); + } + }, + unshift: function() { + this.inKey = "Move"; + }, + shift: function() { + this.inKey = "Scroll"; + }, + }); + + DJC4.deck = []; + for (i = 0; i < 4; i++) { + DJC4.deck[i] = new DJC4.Deck(i + 1); + DJC4.deck[i].setCurrentDeck("[Channel" + (i + 1) + "]"); + } + + DJC4.effectUnit = []; + for (i = 0; i <= 3; i++) { + DJC4.effectUnit[i] = new components.EffectUnit([i + 1]); + DJC4.effectUnit[i].shiftOffset = 0x32; + DJC4.effectUnit[i].shiftControl = true; + DJC4.effectUnit[i].enableButtons[1].midi = [0x90 + i, 0x1F]; + DJC4.effectUnit[i].enableButtons[2].midi = [0x90 + i, 0x20]; + DJC4.effectUnit[i].enableButtons[3].midi = [0x90 + i, 0x21]; + DJC4.effectUnit[i].effectFocusButton.midi = [0x90 + i, 0x1D]; + DJC4.effectUnit[i].knobs[1].midi = [0xB0 + i, 0x09]; + DJC4.effectUnit[i].knobs[2].midi = [0xB0 + i, 0x0A]; + DJC4.effectUnit[i].knobs[3].midi = [0xB0 + i, 0x0B]; + DJC4.effectUnit[i].dryWetKnob.midi = [0xB0 + i, 0x08]; + DJC4.effectUnit[i].dryWetKnob.input = function(channel, control, value) { + if (value === 0x41) { + this.inSetParameter(this.inGetParameter() + DJC4.dryWetAdjustValue); + } else if (value === 0x3F) { + this.inSetParameter(this.inGetParameter() - DJC4.dryWetAdjustValue); + } + }; + DJC4.effectUnit[i].init(); + } + + // === Master VU Meter === + if (DJC4.showMasterVu === true) { + DJC4.vuMeter = new components.Component({ + midi: [0xB0, 0x03], + group: "[Master]", + outKey: "VuMeterL", + output: function(value, group) { + // The red LEDs light up with MIDI values greater than 0x60. + // The Red LEDs should only be illuminated if the track is clipping. + if (engine.getValue(group, "PeakIndicator") === 1) { + value = 0x60; + } else { + value = Math.round(value * 0x54); + } + this.send(value); + }, + }); + + DJC4.vuMeter = new components.Component({ + midi: [0xB0, 0x04], + group: "[Master]", + outKey: "VuMeterR", + output: function(value, group) { + // The red LEDs light up with MIDI values greater than 0x60. + // The Red LEDs should only be illuminated if the track is clipping. + if (engine.getValue(group, "PeakIndicator") === 1) { + value = 0x60; + } else { + value = Math.round(value * 0x54); + } + this.send(value); + }, + }); + } +}; + +// Called when the MIDI device is closed +DJC4.shutdown = function() { + // Put all LEDs to default state. + DJC4.allLed2Default(); +}; + +DJC4.Deck = function(deckNumber) { + components.Deck.call(this, deckNumber); + + // === Instantiate controls === + this.beatLoopEncoder = new components.Encoder({ + midi: [0xB0 + deckNumber - 1, 0x01], + group: "[Channel" + deckNumber + "]", + inKey: "loop_move_1", + input: function(channel, control, value) { + if (value === 0x41) { + engine.setParameter(this.group, this.inKey + "_forward", 1); + } else if (value === 0x3F) { + engine.setParameter(this.group, this.inKey + "_backward", 1); + } + }, + }); + + this.samplerButtons = []; + for (var i = 0; i <= 3; i++) { + this.samplerButtons[i] = new components.SamplerButton({ + number: (deckNumber === 1 || deckNumber === 3) ? (i + 1) : (i + 5), + midi: [0x90+deckNumber-1, 0x0C+i], + }); + } + + // === Channel VU Meter === + if (DJC4.showMasterVu === false) { + DJC4.vuMeter = new components.Component({ + midi: [0xB0+deckNumber-1, 0x02], + group: "[Channel" + deckNumber + "]", + outKey: "VuMeter", + output: function(value, group) { + // The red LEDs light up with MIDI values greater than 0x60. + // The Red LEDs should only be illuminated if the track is clipping. + if (engine.getValue(group, "PeakIndicator") === 1) { + value = 0x60; + } else { + value = Math.round(value * 0x54); + } + this.send(value); + }, + }); + } + + // === Scratch control === + this.scratchMode = false; + + this.toggleScratchMode = function(channel, control, value) { + if (value === 0x7F) { + // Toggle setting + this.scratchMode = !this.scratchMode; + DJC4.setLed(script.deckFromGroup(this.currentDeck), DJC4.leds["scratch"], this.scratchMode); + } + }; + + // ============================= JOG WHEELS ============================== + this.wheelTouch = function(channel, control, value, status, group) { + if (engine.getValue(group, "play") === 0) { + // If not playing, do a fast search + if (value === 0x7F) { + var alpha = 1.0 / 8; + var beta = alpha / 32; + var rpm = 40.0; + + engine.scratchEnable(script.deckFromGroup(this.currentDeck), 128, rpm, alpha, beta, true); + } else { // If button up + engine.scratchDisable(script.deckFromGroup(this.currentDeck)); + } + } else if (this.scratchMode === true) { + // If scratch enabled + if (value === 0x7F) { + alpha = 1.0/8; + beta = alpha/32; + rpm = 150.0; + + engine.scratchEnable(script.deckFromGroup(this.currentDeck), 128, rpm, alpha, beta); + } else { // If button up + engine.scratchDisable(script.deckFromGroup(this.currentDeck)); + } + } else { // If button up + engine.scratchDisable(script.deckFromGroup(this.currentDeck)); + } + }; + + this.wheelTurn = function(channel, control, value) { + // When the jog wheel is turned in clockwise direction, value is + // greater than 64 (= 0x40). If it's turned in counter-clockwise + // direction, the value is smaller than 64. + var newValue = value - 64; + var deck = script.deckFromGroup(this.currentDeck); + if (engine.isScratching(deck)) { + engine.scratchTick(deck, newValue); // Scratch! + } else if (this.shifted === true) { // If shift is pressed + var oldPos = engine.getValue(this.currentDeck, "playposition"); + // Since ‘playposition’ is normalized to unity, we need to scale by + // song duration in order for the jog wheel to cover the same amount + // of time given a constant turning angle. + var duration = engine.getValue(this.currentDeck, "duration"); + var newPos = Math.max(0, oldPos + (newValue * DJC4.stripSearchScaling / duration)); + engine.setValue(this.currentDeck, "playposition", newPos); // Strip search + } else { + engine.setValue(this.currentDeck, "jog", newValue); // Pitch bend + } + }; +}; + +// === FOR MANAGING LEDS === + +DJC4.allLed2Default = function() { + // All LEDs OFF for deck 1 to 4 + var i = 0; + for (i = 1; i <= 4; i++) { + for (var led in DJC4.leds) { + DJC4.setLed(i, DJC4.leds[led], 0); + } + // Channel VU meter + midi.sendShortMsg(0xB0 + (i - 1), 2, 0); + } + // Master VU meter + midi.sendShortMsg(0xB0, 3, 0); + midi.sendShortMsg(0xB0, 4, 0); +}; + +// Set leds function +DJC4.setLed = function(deck, led, status) { + var ledStatus = 0x00; // Default OFF + switch (status) { + case 0: + ledStatus = 0x00; + break; // OFF + case false: + ledStatus = 0x00; + break; // OFF + case 1: + ledStatus = 0x7F; + break; // ON + case true: + ledStatus = 0x7F; + break; // ON + default: + break; + } + midi.sendShortMsg(0x90 + (deck - 1), led, ledStatus); +}; + +// === MISC COMMON === + +DJC4.autoShowDecks = function() { + var anyLoaded = engine.getValue("[Channel3]", "track_loaded") || engine.getValue("[Channel4]", "track_loaded"); + if (!DJC4.autoShowFourDecks) { + return; + } + engine.setValue("[Master]", "show_4decks", anyLoaded); +}; + +DJC4.shiftButton = function(channel, control, value) { + var i; + if (value === 0x7F) { + DJC4.browseEncoder.shift(); + for (i = 0; i < 4; i++) { + DJC4.deck[i].shift(); + DJC4.effectUnit[i].shift(); + } + } else { + DJC4.browseEncoder.unshift(); + for (i = 0; i < 4; i++) { + DJC4.deck[i].unshift(); + DJC4.effectUnit[i].unshift(); + } + } +}; + +DJC4.crossfaderCurve = function(channel, control, value) { + script.crossfaderCurve(value, 0, 0x7F); +}; + +// === Sampler Volume Control === +DJC4.samplerVolume = function(channel, control, value) { + // check if the Sampler Volume is at Zero and if so hide the sampler bank + if (value > 0x00) { + engine.setValue("[Samplers]", "show_samplers", true); + } else { + engine.setValue("[Samplers]", "show_samplers", false); + } + // get the Sampler Row opened with its details + engine.setValue("[SamplerRow1]", "expanded", true); + + // control up to 8 sampler volumes with the one knob on the mixer + for (var i = 1; i <= 8; i++) { + engine.setValue("[Sampler" + i + "]", "pregain", + script.absoluteNonLin(value, 0, 1.0, 4.0)); + } +}; + + +// give your custom Deck all the methods of the generic Deck in the Components library +DJC4.Deck.prototype = Object.create(components.Deck.prototype); diff -Nru mixxx-2.2.3~dfsg/res/controllers/Traktor-Kontrol-S2-MK3-hid-scripts.js mixxx-2.2.4~dfsg/res/controllers/Traktor-Kontrol-S2-MK3-hid-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Traktor-Kontrol-S2-MK3-hid-scripts.js 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Traktor-Kontrol-S2-MK3-hid-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,944 @@ +/////////////////////////////////////////////////////////////////////////////////// +// JSHint configuration // +/////////////////////////////////////////////////////////////////////////////////// +/* global engine */ +/* global script */ +/* global HIDDebug */ +/* global HIDPacket */ +/* global HIDController */ +/* jshint -W016 */ +/////////////////////////////////////////////////////////////////////////////////// +/* */ +/* Traktor Kontrol S2 MK3 HID controller script v1.00 */ +/* Last modification: December 2019 */ +/* Author: Michael Schmidt */ +/* https://www.mixxx.org/wiki/doku.php/native_instruments_traktor_kontrol_s2_mk3 */ +/* */ +/////////////////////////////////////////////////////////////////////////////////// + +var TraktorS2MK3 = new function () { + this.controller = new HIDController(); + this.shiftPressed = { "[Channel1]": false, "[Channel2]": false }; + this.fxButtonState = { 1: false, 2: false, 3: false, 4: false }; + this.padModeState = { "[Channel1]": 0, "[Channel2]": 0 }; // 0 = Hotcues Mode, 1 = Samples Mode + + // Knob encoder states (hold values between 0x0 and 0xF) + // Rotate to the right is +1 and to the left is means -1 + this.browseKnobEncoderState = { "[Channel1]": 0, "[Channel2]": 0 }; + this.loopKnobEncoderState = { "[Channel1]": 0, "[Channel2]": 0 }; + this.moveKnobEncoderState = { "[Channel1]": 0, "[Channel2]": 0 }; + + // Microphone button + this.microphonePressedTimer = 0; // Timer to distinguish between short and long press + + // Sync buttons + this.syncPressedTimer = { "[Channel1]": 0, "[Channel2]": 0 }; // Timer to distinguish between short and long press + + // Jog wheels + this.pitchBendMultiplier = 1.1; + this.lastTickVal = [0, 0]; + this.lastTickTime = [0.0, 0.0]; + + // VuMeter + this.vuLeftConnection = {}; + this.vuRightConnection = {}; + this.clipLeftConnection = {}; + this.clipRightConnection = {}; + this.vuMeterThresholds = { "vu-18": (1 / 6), "vu-12": (2 / 6), "vu-6": (3 / 6), "vu0": (4 / 6), "vu6": (5 / 6) }; + + // Sampler callbacks + this.samplerCallbacks = []; + this.samplerHotcuesRelation = { + "[Channel1]": { + 1: 1, 2: 2, 3: 3, 4: 4, 5: 9, 6: 10, 7: 11, 8: 12 + }, "[Channel2]": { + 1: 5, 2: 6, 3: 7, 4: 8, 5: 13, 6: 14, 7: 15, 8: 16 + } + }; +}; + +TraktorS2MK3.init = function (id) { + TraktorS2MK3.registerInputPackets(); + TraktorS2MK3.registerOutputPackets(); + HIDDebug("TraktorS2MK3: Init done!"); +}; + +TraktorS2MK3.registerInputPackets = function () { + var messageShort = new HIDPacket("shortmessage", 0x01, this.messageCallback); + var messageLong = new HIDPacket("longmessage", 0x02, this.messageCallback); + + this.registerInputButton(messageShort, "[Channel1]", "!play", 0x02, 0x08, this.playHandler); + this.registerInputButton(messageShort, "[Channel2]", "!play", 0x05, 0x20, this.playHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!cue_default", 0x02, 0x04, this.cueHandler); + this.registerInputButton(messageShort, "[Channel2]", "!cue_default", 0x05, 0x10, this.cueHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!shift", 0x01, 0x20, this.shiftHandler); + this.registerInputButton(messageShort, "[Channel2]", "!shift", 0x04, 0x80, this.shiftHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!sync", 0x02, 0x01, this.syncHandler); + this.registerInputButton(messageShort, "[Channel2]", "!sync", 0x05, 0x04, this.syncHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!keylock", 0x02, 0x02, this.keylockHandler); + this.registerInputButton(messageShort, "[Channel2]", "!keylock", 0x05, 0x08, this.keylockHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!hotcues", 0x01, 0x40, this.padModeHandler); + this.registerInputButton(messageShort, "[Channel2]", "!hotcues", 0x05, 0x01, this.padModeHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!samples", 0x01, 0x80, this.padModeHandler); + this.registerInputButton(messageShort, "[Channel2]", "!samples", 0x05, 0x02, this.padModeHandler); + + // Number pad buttons (Hotcues or Samplers depending on current mode) + this.registerInputButton(messageShort, "[Channel1]", "!pad_1", 0x02, 0x10, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_2", 0x02, 0x20, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_3", 0x02, 0x40, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_4", 0x02, 0x80, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_5", 0x03, 0x01, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_6", 0x03, 0x02, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_7", 0x03, 0x04, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel1]", "!pad_8", 0x03, 0x08, this.numberButtonHandler); + + this.registerInputButton(messageShort, "[Channel2]", "!pad_1", 0x05, 0x40, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_2", 0x05, 0x80, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_3", 0x06, 0x01, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_4", 0x06, 0x02, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_5", 0x06, 0x04, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_6", 0x06, 0x08, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_7", 0x06, 0x10, this.numberButtonHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pad_8", 0x06, 0x20, this.numberButtonHandler); + + // Headphone buttons + this.registerInputButton(messageShort, "[Channel1]", "!pfl", 0x04, 0x01, this.headphoneHandler); + this.registerInputButton(messageShort, "[Channel2]", "!pfl", 0x04, 0x02, this.headphoneHandler); + + // Track browsing + this.registerInputButton(messageShort, "[Channel1]", "!SelectTrack", 0x09, 0x0F, this.selectTrackHandler); + this.registerInputButton(messageShort, "[Channel2]", "!SelectTrack", 0x0A, 0xF0, this.selectTrackHandler); + this.registerInputButton(messageShort, "[Channel1]", "!LoadSelectedTrack", 0x07, 0x01, this.loadTrackHandler); + this.registerInputButton(messageShort, "[Channel2]", "!LoadSelectedTrack", 0x07, 0x08, this.loadTrackHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!MaximizeLibrary", 0x01, 0x08, this.maximizeLibraryHandler); + this.registerInputButton(messageShort, "[Channel2]", "!MaximizeLibrary", 0x04, 0x20, this.maximizeLibraryHandler); + this.registerInputButton(messageShort, "[Channel1]", "!AddTrack", 0x01, 0x04, this.addTrackHandler); + this.registerInputButton(messageShort, "[Channel2]", "!AddTrack", 0x04, 0x10, this.addTrackHandler); + + // Loop control + this.registerInputButton(messageShort, "[Channel1]", "!SelectLoop", 0x0A, 0x0F, this.selectLoopHandler); + this.registerInputButton(messageShort, "[Channel2]", "!SelectLoop", 0x0B, 0xF0, this.selectLoopHandler); + this.registerInputButton(messageShort, "[Channel1]", "!ActivateLoop", 0x07, 0x04, this.activateLoopHandler); + this.registerInputButton(messageShort, "[Channel2]", "!ActivateLoop", 0x07, 0x20, this.activateLoopHandler); + + // Beatjump + this.registerInputButton(messageShort, "[Channel1]", "!SelectBeatjump", 0x09, 0xF0, this.selectBeatjumpHandler); + this.registerInputButton(messageShort, "[Channel2]", "!SelectBeatjump", 0x0B, 0x0F, this.selectBeatjumpHandler); + this.registerInputButton(messageShort, "[Channel1]", "!ActivateBeatjump", 0x07, 0x02, this.activateBeatjumpHandler); + this.registerInputButton(messageShort, "[Channel2]", "!ActivateBeatjump", 0x07, 0x10, this.activateBeatjumpHandler); + + // There is only one button on the controller, we use to toggle quantization for all channels + this.registerInputButton(messageShort, "[ChannelX]", "!quantize", 0x06, 0x40, this.quantizeHandler); + + // Microphone + this.registerInputButton(messageShort, "[Microphone]", "!talkover", 0x06, 0x80, this.microphoneHandler); + + // Jog wheels + this.registerInputButton(messageShort, "[Channel1]", "!jog_touch", 0x08, 0x40, this.jogTouchHandler); + this.registerInputButton(messageShort, "[Channel2]", "!jog_touch", 0x08, 0x80, this.jogTouchHandler); + this.registerInputJog(messageShort, "[Channel1]", "!jog", 0x0C, 0xFFFFFFFF, this.jogHandler); + this.registerInputJog(messageShort, "[Channel2]", "!jog", 0x10, 0xFFFFFFFF, this.jogHandler); + + // FX Buttons + this.registerInputButton(messageShort, "[ChannelX]", "!fx1", 0x03, 0x10, this.fxHandler); + this.registerInputButton(messageShort, "[ChannelX]", "!fx2", 0x03, 0x20, this.fxHandler); + this.registerInputButton(messageShort, "[ChannelX]", "!fx3", 0x03, 0x40, this.fxHandler); + this.registerInputButton(messageShort, "[ChannelX]", "!fx4", 0x03, 0x80, this.fxHandler); + + // Rev / FLUX / GRID + this.registerInputButton(messageShort, "[Channel1]", "!reverse", 0x01, 0x01, this.reverseHandler); + this.registerInputButton(messageShort, "[Channel2]", "!reverse", 0x04, 0x04, this.reverseHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!slip_enabled", 0x01, 0x02, this.fluxHandler); + this.registerInputButton(messageShort, "[Channel2]", "!slip_enabled", 0x04, 0x08, this.fluxHandler); + + this.registerInputButton(messageShort, "[Channel1]", "!grid", 0x01, 0x10, this.beatgridHandler); + this.registerInputButton(messageShort, "[Channel2]", "!grid", 0x04, 0x40, this.beatgridHandler); + + this.controller.registerInputPacket(messageShort); + + this.registerInputScaler(messageLong, "[Channel1]", "rate", 0x01, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Channel2]", "rate", 0x09, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[Channel1]", "volume", 0x03, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Channel2]", "volume", 0x07, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[Channel1]", "pregain", 0x0B, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Channel2]", "pregain", 0x1D, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel1]_Effect1]", "parameter3", 0x0D, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel1]_Effect1]", "parameter2", 0x0F, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel1]_Effect1]", "parameter1", 0x11, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel2]_Effect1]", "parameter3", 0x1F, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel2]_Effect1]", "parameter2", 0x21, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[EqualizerRack1_[Channel2]_Effect1]", "parameter1", 0x23, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[QuickEffectRack1_[Channel1]]", "super1", 0x13, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[QuickEffectRack1_[Channel2]]", "super1", 0x25, 0xFFFF, this.parameterHandler); + + this.registerInputScaler(messageLong, "[Master]", "crossfader", 0x05, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Master]", "gain", 0x15, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Sampler]", "pregain", 0x17, 0xFFFF, this.samplerPregainHandler); + this.registerInputScaler(messageLong, "[Master]", "headMix", 0x19, 0xFFFF, this.parameterHandler); + this.registerInputScaler(messageLong, "[Master]", "headGain", 0x1B, 0xFFFF, this.parameterHandler); + + this.controller.registerInputPacket(messageLong); + + // Soft takeover for all knobs + engine.softTakeover("[Channel1]", "rate", true); + engine.softTakeover("[Channel2]", "rate", true); + + engine.softTakeover("[Channel1]", "volume", true); + engine.softTakeover("[Channel2]", "volume", true); + + engine.softTakeover("[Channel1]", "pregain", true); + engine.softTakeover("[Channel2]", "pregain", true); + + engine.softTakeover("[EqualizerRack1_[Channel1]_Effect1]", "parameter3", true); + engine.softTakeover("[EqualizerRack1_[Channel1]_Effect1]", "parameter2", true); + engine.softTakeover("[EqualizerRack1_[Channel1]_Effect1]", "parameter1", true); + + engine.softTakeover("[EqualizerRack1_[Channel1]_Effect1]", "parameter3", true); + engine.softTakeover("[EqualizerRack1_[Channel2]_Effect1]", "parameter2", true); + engine.softTakeover("[EqualizerRack1_[Channel3]_Effect1]", "parameter1", true); + + engine.softTakeover("[QuickEffectRack1_[Channel1]]", "super1", true); + engine.softTakeover("[QuickEffectRack1_[Channel2]]", "super1", true); + + engine.softTakeover("[Master]", "crossfader", true); + engine.softTakeover("[Master]", "gain", true); + engine.softTakeover("[Master]", "headMix", true); + engine.softTakeover("[Master]", "headGain", true); + + for (var i = 1; i <= 16; ++i) { + engine.softTakeover("[Sampler" + i + "]", "pregain", true); + } + + // Dirty hack to set initial values in the packet parser + var data = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + TraktorS2MK3.incomingData(data); +}; + +TraktorS2MK3.registerInputJog = function (message, group, name, offset, bitmask, callback) { + // Jog wheels have 4 byte input + message.addControl(group, name, offset, "I", bitmask); + message.setCallback(group, name, callback); +}; + +TraktorS2MK3.registerInputScaler = function (message, group, name, offset, bitmask, callback) { + message.addControl(group, name, offset, "H", bitmask); + message.setCallback(group, name, callback); +}; + +TraktorS2MK3.registerInputButton = function (message, group, name, offset, bitmask, callback) { + message.addControl(group, name, offset, "B", bitmask); + message.setCallback(group, name, callback); +}; + +TraktorS2MK3.playHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "start_stop", field.value); + } else if (field.value === 1) { + script.toggleControl(field.group, "play"); + } +}; + +TraktorS2MK3.cueHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "cue_gotoandstop", field.value); + } else { + engine.setValue(field.group, "cue_default", field.value); + } +}; + +TraktorS2MK3.shiftHandler = function (field) { + TraktorS2MK3.shiftPressed[field.group] = field.value; + engine.setValue("[Controls]", "touch_shift", field.value); + TraktorS2MK3.outputHandler(field.value, field.group, "shift"); +}; + +TraktorS2MK3.keylockHandler = function (field) { + if (field.value === 0) { + return; + } + + script.toggleControl(field.group, "keylock"); +}; + +TraktorS2MK3.syncHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "beatsync_phase", field.value); + // Light LED while pressed + TraktorS2MK3.outputHandler(field.value, field.group, "sync_enabled"); + } else { + if (field.value) { + if (engine.getValue(field.group, 'sync_enabled') === 0) { + script.triggerControl(field.group, "beatsync"); + // Start timer to measure how long button is pressed + TraktorS2MK3.syncPressedTimer[field.group] = engine.beginTimer(300, function () { + engine.setValue(field.group, "sync_enabled", 1); + // Reset sync button timer state if active + if (TraktorS2MK3.syncPressedTimer[field.group] !== 0) { + TraktorS2MK3.syncPressedTimer[field.group] = 0; + } + }, true); + + // Light corresponding LED when button is pressed + TraktorS2MK3.outputHandler(1, field.group, "sync_enabled"); + } else { + // Deactivate sync lock + // LED is turned off by the callback handler for sync_enabled + engine.setValue(field.group, "sync_enabled", 0); + } + } else { + if (TraktorS2MK3.syncPressedTimer[field.group] !== 0) { + // Timer still running -> stop it and unlight LED + engine.stopTimer(TraktorS2MK3.syncPressedTimer[field.group]); + TraktorS2MK3.outputHandler(0, field.group, "sync_enabled"); + } + } + } +}; + +TraktorS2MK3.padModeHandler = function (field) { + if (field.value === 0) { + return; + } + + if (TraktorS2MK3.padModeState[field.group] === 0 && field.name === "!samples") { + // If we are in hotcues mode and samples mode is activated + engine.setValue("[Samplers]", "show_samplers", 1); + TraktorS2MK3.padModeState[field.group] = 1; + TraktorS2MK3.outputHandler(0, field.group, "hotcues"); + TraktorS2MK3.outputHandler(1, field.group, "samples"); + + // Light LEDs for all slots with loaded samplers + for (var key in TraktorS2MK3.samplerHotcuesRelation[field.group]) { + if (TraktorS2MK3.samplerHotcuesRelation[field.group].hasOwnProperty(key)) { + var loaded = engine.getValue("[Sampler" + TraktorS2MK3.samplerHotcuesRelation[field.group][key] + "]", "track_loaded"); + TraktorS2MK3.outputHandler(loaded, field.group, "pad_" + key); + } + } + } else if (field.name === "!hotcues") { + // If we are in samples mode and hotcues mode is activated + TraktorS2MK3.padModeState[field.group] = 0; + TraktorS2MK3.outputHandler(1, field.group, "hotcues"); + TraktorS2MK3.outputHandler(0, field.group, "samples"); + + // Light LEDs for all enabled hotcues + for (var i = 1; i <= 8; ++i) { + var active = engine.getValue(field.group, "hotcue_" + i + "_enabled"); + TraktorS2MK3.outputHandler(active, field.group, "pad_" + i); + } + } +}; + +TraktorS2MK3.numberButtonHandler = function (field) { + var padNumber = parseInt(field.id[field.id.length - 1]); + if (TraktorS2MK3.padModeState[field.group] === 0) { + // Hotcues mode + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "hotcue_" + padNumber + "_clear", field.value); + } else { + engine.setValue(field.group, "hotcue_" + padNumber + "_activate", field.value); + } + } else { + // Samples mode + var sampler = TraktorS2MK3.samplerHotcuesRelation[field.group][padNumber]; + if (TraktorS2MK3.shiftPressed[field.group]) { + var playing = engine.getValue("[Sampler" + sampler + "]", "play"); + if (playing) { + engine.setValue("[Sampler" + sampler + "]", "cue_default", field.value); + } else { + engine.setValue("[Sampler" + sampler + "]", "eject", field.value); + } + } else { + var loaded = engine.getValue("[Sampler" + sampler + "]", "track_loaded"); + if (loaded) { + engine.setValue("[Sampler" + sampler + "]", "cue_gotoandplay", field.value); + } else { + engine.setValue("[Sampler" + sampler + "]", "LoadSelectedTrack", field.value); + } + } + } +}; + +TraktorS2MK3.headphoneHandler = function (field) { + if (field.value === 0) { + return; + } + + script.toggleControl(field.group, "pfl"); +}; + +TraktorS2MK3.selectTrackHandler = function (field) { + var delta = 1; + if ((field.value + 1) % 16 === TraktorS2MK3.browseKnobEncoderState[field.group]) { + delta = -1; + } + + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue("[Library]", "MoveHorizontal", delta); + } else { + engine.setValue("[Library]", "MoveVertical", delta); + } + + TraktorS2MK3.browseKnobEncoderState[field.group] = field.value; +}; + +TraktorS2MK3.loadTrackHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "eject", field.value); + } else { + engine.setValue(field.group, "LoadSelectedTrack", field.value); + } +}; + +TraktorS2MK3.addTrackHandler = function (field) { + TraktorS2MK3.outputHandler(field.value, field.group, "addTrack"); + + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue("[Library]", "AutoDjAddTop", field.value); + } else { + engine.setValue("[Library]", "AutoDjAddBottom", field.value); + } +}; + +TraktorS2MK3.maximizeLibraryHandler = function (field) { + if (field.value === 0) { + return; + } + + script.toggleControl("[Master]", "maximize_library"); +}; + +TraktorS2MK3.selectLoopHandler = function (field) { + if ((field.value + 1) % 16 === TraktorS2MK3.loopKnobEncoderState[field.group]) { + script.triggerControl(field.group, "loop_halve"); + } else { + script.triggerControl(field.group, "loop_double"); + } + + TraktorS2MK3.loopKnobEncoderState[field.group] = field.value; +}; + +TraktorS2MK3.activateLoopHandler = function (field) { + if (field.value === 0) { + return; + } + + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "reloop_toggle", field.value); + } else { + engine.setValue(field.group, "beatloop_activate", field.value); + } +}; + +TraktorS2MK3.selectBeatjumpHandler = function (field) { + var delta = 1; + if ((field.value + 1) % 16 === TraktorS2MK3.moveKnobEncoderState[field.group]) { + delta = -1; + } + + if (TraktorS2MK3.shiftPressed[field.group]) { + var beatjump_size = engine.getValue(field.group, "beatjump_size"); + if (delta > 0) { + engine.setValue(field.group, "beatjump_size", beatjump_size * 2); + } else { + engine.setValue(field.group, "beatjump_size", beatjump_size / 2); + } + } else { + if (delta < 0) { + script.triggerControl(field.group, "beatjump_backward"); + } else { + script.triggerControl(field.group, "beatjump_forward"); + } + } + + TraktorS2MK3.moveKnobEncoderState[field.group] = field.value; +}; + +TraktorS2MK3.activateBeatjumpHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "reloop_andstop", field.value); + } else { + engine.setValue(field.group, "beatlooproll_activate", field.value); + } +}; + +TraktorS2MK3.quantizeHandler = function (field) { + if (field.value === 0) { + return; + } + + var res = !(engine.getValue("[Channel1]", "quantize") && engine.getValue("[Channel2]", "quantize")); + engine.setValue("[Channel1]", "quantize", res); + engine.setValue("[Channel2]", "quantize", res); + TraktorS2MK3.outputHandler(res, field.group, "quantize"); +}; + +TraktorS2MK3.microphoneHandler = function (field) { + if (field.value) { + if (TraktorS2MK3.microphonePressedTimer === 0) { + // Start timer to measure how long button is pressed + TraktorS2MK3.microphonePressedTimer = engine.beginTimer(300, function () { + // Reset microphone button timer status if active + if (TraktorS2MK3.microphonePressedTimer !== 0) { + TraktorS2MK3.microphonePressedTimer = 0; + } + }, true); + } + + script.toggleControl("[Microphone]", "talkover"); + } else { + // Button is released, check if timer is still running + if (TraktorS2MK3.microphonePressedTimer !== 0) { + // short klick -> permanent activation + TraktorS2MK3.microphonePressedTimer = 0; + } else { + engine.setValue("[Microphone]", "talkover", 0); + } + } +}; + +TraktorS2MK3.parameterHandler = function (field) { + engine.setParameter(field.group, field.name, field.value / 4095); +}; + +TraktorS2MK3.samplerPregainHandler = function (field) { + // Map sampler gain knob of all sampler together. + // Dirty hack, but the best we can do for now. + for (var i = 1; i <= 16; ++i) { + engine.setParameter("[Sampler" + i + "]", field.name, field.value / 4095); + } +}; + +TraktorS2MK3.jogTouchHandler = function (field) { + var deckNumber = TraktorS2MK3.controller.resolveDeck(field.group); + if (field.value > 0) { + engine.scratchEnable(deckNumber, 1024, 33 + 1 / 3, 0.125, 0.125 / 8, true); + } else { + engine.scratchDisable(deckNumber); + } +}; + +TraktorS2MK3.jogHandler = function (field) { + var deckNumber = TraktorS2MK3.controller.resolveDeck(field.group); + var deltas = TraktorS2MK3.wheelDeltas(deckNumber, field.value); + var tickDelta = deltas[0]; + var timeDelta = deltas[1]; + + if (engine.isScratching(deckNumber)) { + engine.scratchTick(deckNumber, tickDelta); + } else { + var velocity = (tickDelta / timeDelta) * TraktorS2MK3.pitchBendMultiplier; + engine.setValue(field.group, "jog", velocity); + } +}; + +TraktorS2MK3.wheelDeltas = function (deckNumber, value) { + // When the wheel is touched, four bytes change, but only the first behaves predictably. + // It looks like the wheel is 1024 ticks per revolution. + var tickval = value & 0xFF; + var timeval = value >>> 16; + var prevTick = 0; + var prevTime = 0; + + // Group 1 and 2 -> Array index 0 and 1 + prevTick = this.lastTickVal[deckNumber - 1]; + prevTime = this.lastTickTime[deckNumber - 1]; + this.lastTickVal[deckNumber - 1] = tickval; + this.lastTickTime[deckNumber - 1] = timeval; + + if (prevTime > timeval) { + // We looped around. Adjust current time so that subtraction works. + timeval += 0x10000; + } + var timeDelta = timeval - prevTime; + if (timeDelta === 0) { + // Spinning too fast to detect speed! By not dividing we are guessing it took 1ms. + timeDelta = 1; + } + + var tickDelta = 0; + if (prevTick >= 200 && tickval <= 100) { + tickDelta = tickval + 256 - prevTick; + } else if (prevTick <= 100 && tickval >= 200) { + tickDelta = tickval - prevTick - 256; + } else { + tickDelta = tickval - prevTick; + } + + return [tickDelta, timeDelta]; +}; + +TraktorS2MK3.fxHandler = function (field) { + if (field.value === 0) { + return; + } + + var fxNumber = parseInt(field.id[field.id.length - 1]); + var group = "[EffectRack1_EffectUnit" + fxNumber + "]"; + + // Toggle effect unit + TraktorS2MK3.fxButtonState[fxNumber] = !TraktorS2MK3.fxButtonState[fxNumber]; + + engine.setValue(group, "group_[Channel1]_enable", TraktorS2MK3.fxButtonState[fxNumber]); + engine.setValue(group, "group_[Channel2]_enable", TraktorS2MK3.fxButtonState[fxNumber]); + TraktorS2MK3.outputHandler(TraktorS2MK3.fxButtonState[fxNumber], field.group, "fxButton" + fxNumber); +}; + +TraktorS2MK3.reverseHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "reverseroll", field.value); + } else { + engine.setValue(field.group, "reverse", field.value); + } + + TraktorS2MK3.outputHandler(field.value, field.group, "reverse"); +}; + +TraktorS2MK3.fluxHandler = function (field) { + if (field.value === 0) { + return; + } + + script.toggleControl(field.group, "slip_enabled"); +}; + +TraktorS2MK3.beatgridHandler = function (field) { + if (TraktorS2MK3.shiftPressed[field.group]) { + engine.setValue(field.group, "beats_translate_match_alignment", field.value); + } else { + engine.setValue(field.group, "beats_translate_curpos", field.value); + } + + TraktorS2MK3.outputHandler(field.value, field.group, "grid"); +}; + +TraktorS2MK3.registerOutputPackets = function () { + var output = new HIDPacket("output", 0x80); + + output.addOutput("[Channel1]", "play_indicator", 0x0C, "B"); + output.addOutput("[Channel2]", "play_indicator", 0x33, "B"); + + output.addOutput("[Channel1]", "cue_indicator", 0x0B, "B"); + output.addOutput("[Channel2]", "cue_indicator", 0x32, "B"); + + output.addOutput("[Channel1]", "shift", 0x06, "B"); + output.addOutput("[Channel2]", "shift", 0x2D, "B"); + + output.addOutput("[Channel1]", "hotcues", 0x07, "B"); + output.addOutput("[Channel2]", "hotcues", 0x2E, "B"); + + output.addOutput("[Channel1]", "samples", 0x08, "B"); + output.addOutput("[Channel2]", "samples", 0x2F, "B"); + + output.addOutput("[Channel1]", "sync_enabled", 0x09, "B"); + output.addOutput("[Channel2]", "sync_enabled", 0x30, "B"); + + output.addOutput("[Channel1]", "keylock", 0x0A, "B"); + output.addOutput("[Channel2]", "keylock", 0x31, "B"); + + output.addOutput("[Channel1]", "pad_1", 0x0D, "B"); + output.addOutput("[Channel1]", "pad_2", 0x0E, "B"); + output.addOutput("[Channel1]", "pad_3", 0x0F, "B"); + output.addOutput("[Channel1]", "pad_4", 0x10, "B"); + output.addOutput("[Channel1]", "pad_5", 0x11, "B"); + output.addOutput("[Channel1]", "pad_6", 0x12, "B"); + output.addOutput("[Channel1]", "pad_7", 0x13, "B"); + output.addOutput("[Channel1]", "pad_8", 0x14, "B"); + + output.addOutput("[Channel2]", "pad_1", 0x34, "B"); + output.addOutput("[Channel2]", "pad_2", 0x35, "B"); + output.addOutput("[Channel2]", "pad_3", 0x36, "B"); + output.addOutput("[Channel2]", "pad_4", 0x37, "B"); + output.addOutput("[Channel2]", "pad_5", 0x38, "B"); + output.addOutput("[Channel2]", "pad_6", 0x39, "B"); + output.addOutput("[Channel2]", "pad_7", 0x3A, "B"); + output.addOutput("[Channel2]", "pad_8", 0x3B, "B"); + + output.addOutput("[Channel1]", "pfl", 0x1A, "B"); + output.addOutput("[Channel2]", "pfl", 0x1B, "B"); + + output.addOutput("[Channel1]", "vu-18", 0x1C, "B"); + output.addOutput("[Channel1]", "vu-12", 0x1D, "B"); + output.addOutput("[Channel1]", "vu-6", 0x1E, "B"); + output.addOutput("[Channel1]", "vu0", 0x1F, "B"); + output.addOutput("[Channel1]", "vu6", 0x20, "B"); + output.addOutput("[Channel1]", "PeakIndicator", 0x21, "B"); + + output.addOutput("[Channel2]", "vu-18", 0x22, "B"); + output.addOutput("[Channel2]", "vu-12", 0x23, "B"); + output.addOutput("[Channel2]", "vu-6", 0x24, "B"); + output.addOutput("[Channel2]", "vu0", 0x25, "B"); + output.addOutput("[Channel2]", "vu6", 0x26, "B"); + output.addOutput("[Channel2]", "PeakIndicator", 0x27, "B"); + + output.addOutput("[ChannelX]", "fxButton1", 0x16, "B"); + output.addOutput("[ChannelX]", "fxButton2", 0x17, "B"); + output.addOutput("[ChannelX]", "fxButton3", 0x18, "B"); + output.addOutput("[ChannelX]", "fxButton4", 0x19, "B"); + + output.addOutput("[Channel1]", "reverse", 0x01, "B"); + output.addOutput("[Channel2]", "reverse", 0x28, "B"); + + output.addOutput("[Channel1]", "slip_enabled", 0x02, "B"); + output.addOutput("[Channel2]", "slip_enabled", 0x29, "B"); + + output.addOutput("[Channel1]", "addTrack", 0x03, "B"); + output.addOutput("[Channel2]", "addTrack", 0x2A, "B"); + + output.addOutput("[Channel1]", "grid", 0x05, "B"); + output.addOutput("[Channel2]", "grid", 0x2C, "B"); + + output.addOutput("[Channel1]", "MaximizeLibrary", 0x04, "B"); + output.addOutput("[Channel2]", "MaximizeLibrary", 0x2B, "B"); + + output.addOutput("[ChannelX]", "quantize", 0x3C, "B"); + output.addOutput("[Microphone]", "talkover", 0x3D, "B"); + + this.controller.registerOutputPacket(output); + + this.linkOutput("[Channel1]", "play_indicator", this.outputHandler); + this.linkOutput("[Channel2]", "play_indicator", this.outputHandler); + + this.linkOutput("[Channel1]", "cue_indicator", this.outputHandler); + this.linkOutput("[Channel2]", "cue_indicator", this.outputHandler); + + this.linkOutput("[Channel1]", "sync_enabled", this.outputHandler); + this.linkOutput("[Channel2]", "sync_enabled", this.outputHandler); + + this.linkOutput("[Channel1]", "keylock", this.outputHandler); + this.linkOutput("[Channel2]", "keylock", this.outputHandler); + + for (var i = 1; i <= 8; ++i) { + TraktorS2MK3.controller.linkOutput("[Channel1]", "pad_" + i, "[Channel1]", "hotcue_" + i + "_enabled", this.hotcueOutputHandler); + TraktorS2MK3.controller.linkOutput("[Channel2]", "pad_" + i, "[Channel2]", "hotcue_" + i + "_enabled", this.hotcueOutputHandler); + } + + this.linkOutput("[Channel1]", "pfl", this.outputHandler); + this.linkOutput("[Channel2]", "pfl", this.outputHandler); + + this.linkOutput("[Channel1]", "slip_enabled", this.outputHandler); + this.linkOutput("[Channel2]", "slip_enabled", this.outputHandler); + + this.linkOutput("[Microphone]", "talkover", this.outputHandler); + + // VuMeter + this.vuLeftConnection = engine.makeConnection("[Channel1]", "VuMeter", this.vuMeterHandler); + this.vuRightConnection = engine.makeConnection("[Channel2]", "VuMeter", this.vuMeterHandler); + this.clipLeftConnection = engine.makeConnection("[Channel1]", "PeakIndicator", this.peakOutputHandler); + this.clipRightConnection = engine.makeConnection("[Channel2]", "PeakIndicator", this.peakOutputHandler); + + // Sampler callbacks + for (i = 1; i <= 16; ++i) { + this.samplerCallbacks.push(engine.makeConnection("[Sampler" + i + "]", "track_loaded", this.samplesOutputHandler)); + this.samplerCallbacks.push(engine.makeConnection("[Sampler" + i + "]", "play", this.samplesOutputHandler)); + } + + TraktorS2MK3.lightDeck(false); +}; + +/* Helper function to link output in a short form */ +TraktorS2MK3.linkOutput = function (group, name, callback) { + TraktorS2MK3.controller.linkOutput(group, name, group, name, callback); +}; + +TraktorS2MK3.vuMeterHandler = function (value, group, key) { + var vuKeys = Object.keys(TraktorS2MK3.vuMeterThresholds); + for (var i = 0; i < vuKeys.length; ++i) { + // Avoid spamming HID by only sending last LED update + var last = (i === (vuKeys.length - 1)); + if (TraktorS2MK3.vuMeterThresholds[vuKeys[i]] > value) { + TraktorS2MK3.controller.setOutput(group, vuKeys[i], 0x00, last); + } else { + TraktorS2MK3.controller.setOutput(group, vuKeys[i], 0x7E, last); + } + } +}; + +TraktorS2MK3.peakOutputHandler = function (value, group, key) { + var ledValue = 0x00; + if (value) { + ledValue = 0x7E; + } + + TraktorS2MK3.controller.setOutput(group, key, ledValue, true); +}; + +TraktorS2MK3.outputHandler = function (value, group, key) { + // Custom value for multi-colored LEDs + var ledValue = value; + if (value === 0 || value === false) { + // Off value + ledValue = 0x7C; + } else if (value === 1 || value === true) { + // On value + ledValue = 0x7E; + } + + TraktorS2MK3.controller.setOutput(group, key, ledValue, true); +}; + +TraktorS2MK3.hotcueOutputHandler = function (value, group, key) { + // Light button LED only when we are in hotcue mode + if (TraktorS2MK3.padModeState[group] === 0) { + TraktorS2MK3.outputHandler(value, group, key); + } +}; + +TraktorS2MK3.samplesOutputHandler = function (value, group, key) { + // Sampler 1-4, 9-12 -> Channel1 + // Samples 5-8, 13-16 -> Channel2 + var sampler = TraktorS2MK3.resolveSampler(group); + var deck = "[Channel1]"; + var num = sampler; + if (sampler === undefined) { + return; + } else if (sampler > 4 && sampler < 9) { + deck = "[Channel2]"; + num = sampler - 4; + } else if (sampler > 8 && sampler < 13) { + num = sampler - 4; + } else if (sampler > 12 && sampler < 17) { + deck = "[Channel2]"; + num = sampler - 8; + } + + // If we are in samples modes light corresponding LED + if (TraktorS2MK3.padModeState[deck] === 1) { + if (key === "play" && engine.getValue(group, "track_loaded")) { + if (value) { + // Green light on play + TraktorS2MK3.outputHandler(0x9E, deck, "pad_" + num); + } else { + // Reset LED to full white light + TraktorS2MK3.outputHandler(1, deck, "pad_" + num); + } + } else if (key === "track_loaded") { + TraktorS2MK3.outputHandler(value, deck, "pad_" + num); + } + } +}; + +TraktorS2MK3.resolveSampler = function (group) { + if (group === undefined) { + return undefined; + } + + var result = group.match(script.samplerRegEx); + + if (result === null) { + return undefined; + } + + // Return sample number + return result[1]; +}; + +TraktorS2MK3.lightDeck = function (switchOff) { + var softLight = 0x7C; + var fullLight = 0x7E; + if (switchOff) { + softLight = 0x00; + fullLight = 0x00; + } + + var current = (!!engine.getValue("[Channel1]", "play_indicator") ? fullLight : softLight); + TraktorS2MK3.controller.setOutput("[Channel1]", "play_indicator", current, false); + current = (!!engine.getValue("[Channel2]", "play_indicator")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "play_indicator", current, false); + + current = (!!engine.getValue("[Channel1]", "cue_indicator")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "cue_indicator", current, false); + current = (!!engine.getValue("[Channel2]", "cue_indicator")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "cue_indicator", current, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "shift", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "shift", softLight, false); + + current = (!!engine.getValue("[Channel1]", "sync_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "sync_enabled", current, false); + current = (!!engine.getValue("[Channel1]", "sync_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "sync_enabled", current, false); + + // Hotcues mode is default start value + TraktorS2MK3.controller.setOutput("[Channel1]", "hotcues", fullLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "hotcues", fullLight, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "samples", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "samples", softLight, false); + + current = (!!engine.getValue("[Channel1]", "keylock")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "keylock", current, false); + current = (!!engine.getValue("[Channel2]", "keylock")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "keylock", current, false); + + for (var i = 1; i <= 8; ++i) { + current = (!!engine.getValue("[Channel1]", "hotcue_" + i + "_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "pad_" + i, current, false); + current = (!!engine.getValue("[Channel2]", "hotcue_" + i + "_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "pad_" + i, current, false); + } + + current = (!!engine.getValue("[Channel1]", "pfl")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "pfl", current, false); + current = (!!engine.getValue("[Channel2]", "pfl")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "pfl", current, false); + + TraktorS2MK3.controller.setOutput("[ChannelX]", "fxButton1", softLight, false); + TraktorS2MK3.controller.setOutput("[ChannelX]", "fxButton2", softLight, false); + TraktorS2MK3.controller.setOutput("[ChannelX]", "fxButton3", softLight, false); + TraktorS2MK3.controller.setOutput("[ChannelX]", "fxButton4", softLight, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "reverse", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "reverse", softLight, false); + + current = (!!engine.getValue("[Channel1]", "slip_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel1]", "slip_enabled", current, false); + current = (!!engine.getValue("[Channel2]", "slip_enabled")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Channel2]", "slip_enabled", current, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "addTrack", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "addTrack", softLight, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "grid", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "grid", softLight, false); + + TraktorS2MK3.controller.setOutput("[Channel1]", "MaximizeLibrary", softLight, false); + TraktorS2MK3.controller.setOutput("[Channel2]", "MaximizeLibrary", softLight, false); + + TraktorS2MK3.controller.setOutput("[ChannelX]", "quantize", softLight, false); + + // For the last output we should send the packet finally + current = (!!engine.getValue("[Microphone]", "talkover")) ? fullLight : softLight; + TraktorS2MK3.controller.setOutput("[Microphone]", "talkover", current, true); +}; + +TraktorS2MK3.messageCallback = function (packet, data) { + for (var name in data) { + if (data.hasOwnProperty(name)) { + TraktorS2MK3.controller.processButton(data[name]); + } + } +}; + +TraktorS2MK3.shutdown = function () { + // Deactivate all LEDs + TraktorS2MK3.lightDeck(true); + + HIDDebug("TraktorS2MK3: Shutdown done!"); +}; + +TraktorS2MK3.incomingData = function (data, length) { + TraktorS2MK3.controller.parsePacket(data, length); +}; diff -Nru "/tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/controllers/Traktor Kontrol S2 MK3.hid.xml" "/tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/controllers/Traktor Kontrol S2 MK3.hid.xml" --- "/tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/controllers/Traktor Kontrol S2 MK3.hid.xml" 1970-01-01 00:00:00.000000000 +0000 +++ "/tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/controllers/Traktor Kontrol S2 MK3.hid.xml" 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,20 @@ + + + + Traktor Kontrol S2 MK3 + Michael Schmidt + HID Mapping for Traktor Kontrol S2 MK3 + https://www.mixxx.org/wiki/doku.php/native_instruments_traktor_s2_mk3 + https://www.mixxx.org/forums/viewtopic.php?f=7&t=12999 + + + + + + + + + + + + diff -Nru mixxx-2.2.3~dfsg/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js mixxx-2.2.4~dfsg/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js --- mixxx-2.2.3~dfsg/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/controllers/Traktor-Kontrol-S4-MK2-hid-scripts.js 2020-05-15 21:26:10.000000000 +0000 @@ -1405,7 +1405,7 @@ engine.setValue("[Playlist]", "SelectPlaylist", delta); } else { - engine.setValue("[Playlist]", "SelectTrackKnob", delta); + engine.setValue("[Library]", "MoveVertical", delta); } } diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ar.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ar.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ar.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ar.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ الدي جي الأوتوماتيكي - + Add Crate as Track Source اضافة صندوق كمصدر للمقاطع @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist قائمة تشغيل جديدة @@ -110,7 +110,7 @@ - + Create New Playlist أنشاء مجموعه مقاطع جديده @@ -156,82 +156,82 @@ تحليل كل المجموعة - + Enter new name for playlist: ادخال اسم جديد للمجموعة - + Duplicate Playlist تكرير قائمة التشغيل - - + + Enter name for new playlist: إدخل اسم جديد لقائمة التشغيل - + Export Playlist تصدير قائمة التشغيل - + Rename Playlist إعادة تسمية قائمة التشغيل - - + + Renaming Playlist Failed فشلت إعادة تسمية قائمة التشغيل - - - + + + A playlist by that name already exists. توجد قائمة تشغيل بهذا الاسم - - - + + + A playlist cannot have a blank name. لا يمكن لقائمة التشغيل أن تحوي اسماً فارغاً. - + _copy [noun] Appendix to default name when duplicating a playlist _نسخ - - - - - - + + + + + + Playlist Creation Failed فشل إنشاء قائمة التشغيل. - - + + An unknown error occurred while creating playlist: حدث خطأ غير معروف أثناء إنشاء قائمة التشغيل. - + M3U Playlist (*.m3u) قائمة تشغيل M3U (*.M3U) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U قائمة التشغيل (* .m3u ) ؛؛ M3U8 قائمة التشغيل (* .m3u8) ؛؛ PLS التشغيل (* .pls) ؛؛ CSV نص (* CSV.) ؛؛ نص مقروء (* txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. لا يمكنك تحميل المقطع @@ -2768,7 +2768,7 @@ - + Lock أقفِل @@ -2793,7 +2793,7 @@ - + Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate تصدير صندوق - + Unlock فك القفل - + An unknown error occurred while creating crate: خطأ غير معلوم حدث عند انشاء الصندوق - + Rename Crate اعادة تسمية الصندوق - - + + Renaming Crate Failed اعادة تسمية الصندوق فشلت - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U قائمة التشغيل (* .m3u ) ؛؛ M3U8 قائمة التشغيل (* .m3u8) ؛؛ PLS التشغيل (* .pls) ؛؛ CSV نص (* CSV.) ؛؛ نص مقروء (* txt) @@ -2862,12 +2862,12 @@ - + A crate cannot have a blank name. الصندوق لا يمكن ان يكون الاسم فارغ - + A crate by that name already exists. صندوق بهذا الاسم موجود من قبل @@ -2886,50 +2886,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed انشاء الصندوق فشل - + A crate cannot have a blank name. الصندوق لا يمكن ان يكون الاسم فارغ - - + + A crate by that name already exists. صندوق بهذا الاسم موجود من قبل - - + + An unknown error occurred while creating crate: خطأ غير معلوم حدث عند انشاء الصندوق - + copy [noun] نسخ - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist استيراد قائمة تشغيل - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) ملفات قائمة التشغيل (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists @@ -7786,27 +7799,27 @@ فك القفل - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist أنشاء مجموعه مقاطع جديده @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ أقفِل - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11691,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12493,68 +12506,68 @@ - + Remove حذف - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist أنشاء مجموعه مقاطع جديده - + Create New Crate - + Enter name for new playlist: إدخل اسم جديد لقائمة التشغيل @@ -12584,144 +12597,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist قائمة تشغيل جديدة - - - + + + Playlist Creation Failed فشل إنشاء قائمة التشغيل. - + A playlist by that name already exists. توجد قائمة تشغيل بهذا الاسم - + A playlist cannot have a blank name. لا يمكن لقائمة التشغيل أن تحوي اسماً فارغاً. - + An unknown error occurred while creating playlist: حدث خطأ غير معروف أثناء إنشاء قائمة التشغيل. - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ast.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ast.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ast.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ast.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto-DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Llista de reproducción nueva @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist Esportar llista de reproducción - + Rename Playlist Renomar llista de reproducción - - + + Renaming Playlist Failed Falló renomar la llista de reproducción - - - + + + A playlist by that name already exists. Yá esiste una llista de reproducción con esi nome. - - - + + + A playlist cannot have a blank name. Una llista de reproducción nun pue tener un nome baleru. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Falló crear llista de reproducción - - + + An unknown error occurred while creating playlist: Hebo un error desconocíu mentanto se creaba la llista de reproducción: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista M3U (*.m3u);;Llista M3U8 (*.m3u8);;Llista PLS (*.pls);;Testu CSV (*.csv);;Testu lleíble (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nun se pudo cargar la pista. @@ -2766,7 +2766,7 @@ - + Lock Bloquiar @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Esportar caxa - + Unlock Desbloquiar - + An unknown error occurred while creating crate: Hebo un error desconocíu al crear la caxa: - + Rename Crate Renomar caxa - - + + Renaming Crate Failed Falló renomar la caxa - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista M3U (*.m3u);;Llista M3U8 (*.m3u8);;Llista PLS (*.pls);;Testu CSV (*.csv);;Testu lleíble (*.txt) @@ -2860,12 +2860,12 @@ ¡Los caxones te permiten organizar la to música como quieras! - + A crate cannot have a blank name. Les caxes nun puen tener un nome baleru. - + A crate by that name already exists. Yá esiste una caxa con esi nome. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Falló crear caxa - + A crate cannot have a blank name. Les caxes nun puen tener un nome baleru. - - + + A crate by that name already exists. Yá esiste una caxa con esi nome. - - + + An unknown error occurred while creating crate: Hebo un error desconocíu al crear la caxa: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Nengunu - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Activáu - + Stereo Estéreo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Fallu de configuración @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importar llista de reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Ficheros de llista de reproducción (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Desbloquiar - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Bloquiar - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device un preséu - + An unknown error occurred Hebo un fallu desconocíu - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Desaniciar - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All Too - + Deck %1 - + New Playlist Llista de reproducción nueva - - - + + + Playlist Creation Failed Falló crear llista de reproducción - + A playlist by that name already exists. Yá esiste una llista de reproducción con esi nome. - + A playlist cannot have a blank name. Una llista de reproducción nun pue tener un nome baleru. - + An unknown error occurred while creating playlist: Hebo un error desconocíu mentanto se creaba la llista de reproducción: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_bg.ts mixxx-2.2.4~dfsg/res/translations/mixxx_bg.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_bg.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_bg.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Авто-DJ (Автодиджей) - + Add Crate as Track Source Добави Колекция като Пистов Източник @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Нов списък с песни @@ -108,7 +108,7 @@ - + Create New Playlist Създаване на нов списък с песни @@ -154,82 +154,82 @@ Анализирай целия списък с песни - + Enter new name for playlist: Въведи ново име за списък с песни: - + Duplicate Playlist Копиране на списъка с песни - - + + Enter name for new playlist: Въведете име за нов списък с песни - + Export Playlist Изнасяне на списъка с песни - + Rename Playlist Преименуване на списъка с песни - - + + Renaming Playlist Failed Преименуването на списъка с песни не бе успепно - - - + + + A playlist by that name already exists. Вече съществува списък с песни с това име - - - + + + A playlist cannot have a blank name. Списъка с песни не може да бъде без име. - + _copy [noun] Appendix to default name when duplicating a playlist _копие - - - - - - + + + + + + Playlist Creation Failed Създаването на списъка за изпъленине се провали - - + + An unknown error occurred while creating playlist: По време на създаването на списъка за изпълнение възникна неизвестна грешка: - + M3U Playlist (*.m3u) M3U Списък с песни (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Списък за изпълнение M3U (*.m3u);;Списък за изпълнение M3U8 (*.m3u8);;Списък за изпълнение PLS (*.pls);;Текст в CSV (*.csv);;Четим текст (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Песента не може да бъде заредена. @@ -2766,7 +2766,7 @@ - + Lock Заключване @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Изнасяне на колекция - + Unlock Отключване - + An unknown error occurred while creating crate: Неочаквана грешка при създаване на колекция: - + Rename Crate Преименуване на колекция - - + + Renaming Crate Failed Колекцията не бе преименувана успешно. - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Списък за изпълнение M3U (*.m3u);;Списък за изпълнение M3U8 (*.m3u8);;Списък за изпълнение PLS (*.pls);;Текст в CSV (*.csv);;Четим текст (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Колекцията не може да има празно име. - + A crate by that name already exists. Съществува друга колекция с това име. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Колекцията не бе създадена успешно. - + A crate cannot have a blank name. Колекцията не може да има празно име. - - + + A crate by that name already exists. Съществува друга колекция с това име. - - + + An unknown error occurred while creating crate: Неочаквана грешка при създаване на колекция: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Без - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Включено - + Stereo Стерео - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Грешка в настройките @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Внасяне на списък за изпълнение - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Списъци за изпълнение (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7668,39 +7681,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Потвърждане на излизането - + A deck is currently playing. Exit Mixxx? В момента свири дек. Изход от Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists Списъци с песни @@ -7789,27 +7802,27 @@ Отключване - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Създаване на нов списък с песни @@ -9274,7 +9287,7 @@ - + History @@ -9289,22 +9302,22 @@ Заключване - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device устройство - + An unknown error occurred Възникна неочаквана грешка - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove Премахване - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Създаване на нов списък с песни - + Create New Crate - + Enter name for new playlist: Въведете име за нов списък с песни @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All Всички - + Deck %1 Дек %1 - + New Playlist Нов списък с песни - - - + + + Playlist Creation Failed Създаването на списъка за изпъленине се провали - + A playlist by that name already exists. Вече съществува списък с песни с това име - + A playlist cannot have a blank name. Списъка с песни не може да бъде без име. - + An unknown error occurred while creating playlist: По време на създаването на списъка за изпълнение възникна неизвестна грешка: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Смесител %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_br.ts mixxx-2.2.4~dfsg/res/translations/mixxx_br.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_br.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_br.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_bs.ts mixxx-2.2.4~dfsg/res/translations/mixxx_bs.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_bs.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_bs.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nije u mogućnosti pustiti pjesmu. @@ -2766,7 +2766,7 @@ - + Lock Zaključaj @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Izvezi sanduk - + Unlock Otključaj - + An unknown error occurred while creating crate: Došlo je do nepoznate greške prilikom pravljenja sanduka: - + Rename Crate Preimenuj sanduk - - + + Renaming Crate Failed Preimenovanje sanduka neuspješno - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Sanduk ne može imati prazno ime. - + A crate by that name already exists. Sanduk sa tim imenom već postoji. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. Sanduk ne može imati prazno ime. - - + + A crate by that name already exists. Sanduk sa tim imenom već postoji. - - + + An unknown error occurred while creating crate: Došlo je do nepoznate greške prilikom pravljenja sanduka: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Uključen - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Uvezi listu - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Otključaj - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Zaključaj - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Ukloni - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ca-ES.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ca-ES.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ca-ES.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ca-ES.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ automàtic - + Add Crate as Track Source Afegeix la caixa com a font de pistes @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Llista de reproducció nova @@ -110,7 +110,7 @@ - + Create New Playlist Crea una nova llista de reproducció @@ -156,82 +156,82 @@ Analitza tota la llista de reproducció - + Enter new name for playlist: Inseriu un nom nou per a la llista de reproducció: - + Duplicate Playlist Duplica la llista de reproducció - - + + Enter name for new playlist: Inseriu el nom de la llista nova de reproducció: - + Export Playlist Exporta la llista de reproducció - + Rename Playlist Canvia el nom a la llista de reproducció - - + + Renaming Playlist Failed Ha fallat el canvi de nom de la llista de reproducció - - - + + + A playlist by that name already exists. Ja existeix una llista de reproducció amb aquest nom. - - - + + + A playlist cannot have a blank name. El nom de la llista de reproducció no pot quedar en blanc - + _copy [noun] Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallat la creació de la llista de reproducció - - + + An unknown error occurred while creating playlist: S'ha produït un error desconegut en crear la llista de reproducció: - + M3U Playlist (*.m3u) Llista de reproducció M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No s'ha pogut carregar la pista. @@ -2768,7 +2768,7 @@ - + Lock Bloca els canvis @@ -2793,7 +2793,7 @@ Font de pistes per a DJ automàtic - + Enter new name for crate: Introdueix un nom nou per a la caixa: @@ -2811,38 +2811,38 @@ - + Export Crate Exporta la caixa - + Unlock Permet els canvis - + An unknown error occurred while creating crate: Hi ha hagut un error desconegut a l'hora de crear la caixa: - + Rename Crate Canvia el nom a la caixa - - + + Renaming Crate Failed El canvi de nom de la caixa ha fallat - + Crate Creation Failed No s'ha pogut crear la caixa - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) @@ -2862,12 +2862,12 @@ Les caixes us permeten organitzar la vostra música al vostre gust! - + A crate cannot have a blank name. Una caixa no pot tenir un nom en blanc. - + A crate by that name already exists. Ja existeix una caixa amb aquest nom @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Introdueix el nom de la nova caixa: - - + + Creating Crate Failed No s'ha pogut crear la caixa - + A crate cannot have a blank name. Una caixa no pot tenir un nom en blanc. - - + + A crate by that name already exists. Ja existeix una caixa amb aquest nom - - + + An unknown error occurred while creating crate: Hi ha hagut un error desconegut a l'hora de crear la caixa: - + copy [noun] Duplica - + Duplicate Crate Duplica la caixa - - - + + + Duplicating Crate Failed La còpia de la caixa ha fallat @@ -5615,7 +5615,7 @@ DlgPrefRecord - + Choose recordings directory Seleccioneu la carpeta d'enregistraments @@ -5832,113 +5832,113 @@ DlgPrefSound - + None Cap - + %1 Hz %1 Hz - + Default (long delay) Per defecte (retard llarg) - + Experimental (no delay) Experimental (sense retard) - + Disabled (short delay) Desactivat (retard curt) - + Soundcard Clock Rellotge de la targeta de so - + Network Clock Rellotge de xarxa - + Master output only Només la sortida mestra - + Master and booth outputs Sortida de màster i de cabina - + Direct monitor (recording and broadcasting only) Monitor directe (només gravació i retransmissió) - + Disabled Desactivat - + Enabled Activat - + Stereo Estèreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. L'entrada de micròfon queda desincronitzada al gravar o retransmetre comparat amb el que es sent. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mesureu la latència total i introduiu-la en la Compensació de la latència del micròfon per tal de sincronitzar el micròfon. - - + + Refer to the Mixxx User Manual for details. Consulteu el Manual d'usuari del Mixxx per a més informació. - + Configured latency has changed. La latència configurada ha canviat - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Torneu a mesurar la latència total i introduiu-la en la Compensació de la matència del micròfon per tal de sincronitzar el micròfon. - + Realtime scheduling is enabled. La planificació en temps real està activada - + %1 ms %1 ms - + Configuration error Hi ha un error en la configuració @@ -7414,15 +7414,28 @@ LibraryFeature - + Import Playlist Importa la llista de reproducció - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Llistes de reproducció (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7714,39 +7727,39 @@ No es pot carregar l'aparença seleccionada. - + OpenGL Direct Rendering OpenGL Renderització Directa - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirma la sortida - + A deck is currently playing. Exit Mixxx? Un plat està reproduint encara. Voleu sortir del Mixxx? - + A sampler is currently playing. Exit Mixxx? Hi ha un reproductor de mostres que està reproduint. Segur que voleu sortir del Mixxx? - + The preferences window is still open. La finestra de preferències està oberta encara. - + Discard any changes and exit Mixxx? Descartar els canvis i sortir del Mixxx? @@ -7825,7 +7838,7 @@ - + Playlists Llistes de reproducció @@ -7835,27 +7848,27 @@ Permet els canvis - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Les llistes de reproducció són llistes ordenades de cançons que permeten planificar les vostres sessions de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJ preparen llistes de reproducció abans d'actuar, però altres prefereixen fer-les en viu. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quan utilitzeu una llista de reproducció durant una sessió en viu, recordeu parar atenció a com reacciona l'audiència a la música que heu decidit reproduir. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Pot ser necessari saltar algunes cançons preparades, o afegir-ne algunes de diferents per a mantenir la energia de la vostra audiència. - + Create New Playlist Crea una nova llista de reproducció @@ -9353,7 +9366,7 @@ - + History Historial @@ -9368,22 +9381,22 @@ Bloca els canvis - + The history section automatically keeps a list of tracks you play in your DJ sets. La secció d'històric manté automàticament una llista de les pistes que reproduïu en les vostres sessions de DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Això és útil per a recordar què va anar bé en les vostres sessions de DJ, compartir la llista de cançons de la sessió, o informar les reproduccions a les organizacions de drets d'autor. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada cop que inicieu Mixxx, es crea una nova entrada d'històric. Podeu esportar-la com a llista de reproducció en diferents formats, o reproduir-la de nou amb el DJ automàtic. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Podeu unir l'històric de la sessió actual amb l'anterior fent clic al botó dret del ratolí i seleccionant "Uneix amb l'anterior" @@ -9573,23 +9586,23 @@ SoundManager - - + + a device un dispositiu - + An unknown error occurred S'ha produït un error desconegut - + Two outputs cannot share channels on "%1" Dues sortides no poden compartir els mateixos canals de %1 - + Error opening "%1" Error obrint "%1" @@ -11775,12 +11788,12 @@ TrackCollection - + Hiding tracks Amagant les pistes - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Les pistes seleccionades estan a les llistes:%1Si les amagueu, s'eliminaran de les llistes. Voleu continuar? @@ -12577,68 +12590,68 @@ ESC - + Remove Suprimeix - + Remove from Playlist Elimina de la llista - + Remove from Crate Elimina de la caixa - + Hide from Library No ho mostris a la biblioteca - + Unhide from Library Torna a mostrar a la biblioteca - + Purge from Library Suprimeix de la biblioteca - + Properties Propietats - + Open in File Browser Obre en l'explorador de fitxers - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crea una nova llista de reproducció - + Create New Crate Crea una nova caixa - + Enter name for new playlist: Inseriu el nom de la llista nova de reproducció: @@ -12668,144 +12681,144 @@ Canvia el Tempo - + Add to Auto DJ Queue (Bottom) Afegeix a la cua del DJ automàtic (al final) - + Add to Auto DJ Queue (Top) Afegeix a la cua del DJ automàtic (al principi) - + Add to Auto DJ Queue (Replace) Afegeix a la cua del DJ automàtic (reemplaça) - + Import From File Tags Importa des de les metadades del fitxer - + Import From MusicBrainz Importa des del MusicBrainz - + Export To File Tags Exporta les metadades al fitxer - + Preview Deck Reproductor de pre-escolta - + BPM and Beatgrid BPM i graella de ritme - + Play Count Comptador de reproduccions - + Cue Point Punt d'inici - + Hotcues Marca directa - + Loop Bucle - + ReplayGain ReplayGain - + Waveform Ona - + All Tot - + Deck %1 Plat %1 - + New Playlist Llista de reproducció nova - - - + + + Playlist Creation Failed Ha fallat la creació de la llista de reproducció - + A playlist by that name already exists. Ja existeix una llista de reproducció amb aquest nom. - + A playlist cannot have a blank name. El nom de la llista de reproducció no pot quedar en blanc - + An unknown error occurred while creating playlist: S'ha produït un error desconegut en crear la llista de reproducció: - + Lock BPM Bloca els BPM - + Unlock BPM Desbloca els BPM - + Double BPM Augmenta el tempo al doble - + Halve BPM Redueix el tempo a la meitat - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Reproductor de mostres %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_ca.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_ca.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ca.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ca.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ca.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ca.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ automàtic - + Add Crate as Track Source Afegeix la caixa com a font de pistes @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Llista de reproducció nova @@ -110,7 +110,7 @@ - + Create New Playlist Crea una nova llista de reproducció @@ -156,82 +156,82 @@ Analitza tota la llista de reproducció - + Enter new name for playlist: Inseriu un nom nou per a la llista de reproducció: - + Duplicate Playlist Duplica la llista de reproducció - - + + Enter name for new playlist: Inseriu el nom de la llista nova de reproducció: - + Export Playlist Exporta la llista de reproducció - + Rename Playlist Canvia el nom a la llista de reproducció - - + + Renaming Playlist Failed Ha fallat el canvi de nom de la llista de reproducció - - - + + + A playlist by that name already exists. Ja existeix una llista de reproducció amb aquest nom. - - - + + + A playlist cannot have a blank name. El nom de la llista de reproducció no pot quedar en blanc - + _copy [noun] Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallat la creació de la llista de reproducció - - + + An unknown error occurred while creating playlist: S'ha produït un error desconegut en crear la llista de reproducció: - + M3U Playlist (*.m3u) Llista de reproducció M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No s'ha pogut carregar la pista. @@ -2768,7 +2768,7 @@ - + Lock Bloca els canvis @@ -2793,7 +2793,7 @@ Font de pistes per a DJ automàtic - + Enter new name for crate: Introdueix un nom nou per a la caixa: @@ -2811,38 +2811,38 @@ - + Export Crate Exporta la caixa - + Unlock Permet els canvis - + An unknown error occurred while creating crate: Hi ha hagut un error desconegut a l'hora de crear la caixa: - + Rename Crate Canvia el nom a la caixa - - + + Renaming Crate Failed El canvi de nom de la caixa ha fallat - + Crate Creation Failed No s'ha pogut crear la caixa - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Llista de repr. M3U (*.m3u);;Llista de repr. M3U8 (*.m3u8);;Llista de repr. PLS (*.pls);;Text CSV (*.csv);;Text llegible (*.txt) @@ -2862,12 +2862,12 @@ Les caixes us permeten organitzar la vostra música al vostre gust! - + A crate cannot have a blank name. Una caixa no pot tenir un nom en blanc. - + A crate by that name already exists. Ja existeix una caixa amb aquest nom @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Introdueix el nom de la nova caixa: - - + + Creating Crate Failed No s'ha pogut crear la caixa - + A crate cannot have a blank name. Una caixa no pot tenir un nom en blanc. - - + + A crate by that name already exists. Ja existeix una caixa amb aquest nom - - + + An unknown error occurred while creating crate: Hi ha hagut un error desconegut a l'hora de crear la caixa: - + copy [noun] Duplica - + Duplicate Crate Duplica la caixa - - - + + + Duplicating Crate Failed La còpia de la caixa ha fallat @@ -5615,7 +5615,7 @@ DlgPrefRecord - + Choose recordings directory Seleccioneu la carpeta d'enregistraments @@ -5832,113 +5832,113 @@ DlgPrefSound - + None Cap - + %1 Hz %1 Hz - + Default (long delay) Per defecte (retard llarg) - + Experimental (no delay) Experimental (sense retard) - + Disabled (short delay) Desactivat (retard curt) - + Soundcard Clock Rellotge de la targeta de so - + Network Clock Rellotge de xarxa - + Master output only Només la sortida mestra - + Master and booth outputs Sortida de màster i de cabina - + Direct monitor (recording and broadcasting only) Monitor directe (només gravació i retransmissió) - + Disabled Desactivat - + Enabled Activat - + Stereo Estèreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. L'entrada de micròfon queda desincronitzada al gravar o retransmetre comparat amb el que es sent. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mesureu la latència total i introduiu-la en la Compensació de la latència del micròfon per tal de sincronitzar el micròfon. - - + + Refer to the Mixxx User Manual for details. Consulteu el Manual d'usuari del Mixxx per a més informació. - + Configured latency has changed. La latència configurada ha canviat - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Torneu a mesurar la latència total i introduiu-la en la Compensació de la matència del micròfon per tal de sincronitzar el micròfon. - + Realtime scheduling is enabled. La planificació en temps real està activada - + %1 ms %1 ms - + Configuration error Hi ha un error en la configuració @@ -7414,15 +7414,28 @@ LibraryFeature - + Import Playlist Importa la llista de reproducció - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Llistes de reproducció (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7714,39 +7727,39 @@ No es pot carregar l'aparença seleccionada. - + OpenGL Direct Rendering OpenGL Renderització Directa - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + La Renderizació Directa no està activada a la vostra màquina.<br><br> Això significa que els gràfics d'ona seran molt <br><b>lent i poden fer anar molta CPU</b>. Prove de canviar la<br> configuració per activar la renderització directa, o desactiveu<br>els gràfics d'ona a les preferències del Mixxx selecionant<br>"Buit" al tipus deforma d'ona local, en la secció de "Gràfics d'ona". - - - + + + Confirm Exit Confirma la sortida - + A deck is currently playing. Exit Mixxx? Un plat està reproduint encara. Voleu sortir del Mixxx? - + A sampler is currently playing. Exit Mixxx? Hi ha un reproductor de mostres que està reproduint. Segur que voleu sortir del Mixxx? - + The preferences window is still open. La finestra de preferències està oberta encara. - + Discard any changes and exit Mixxx? Descartar els canvis i sortir del Mixxx? @@ -7825,7 +7838,7 @@ - + Playlists Llistes de reproducció @@ -7835,27 +7848,27 @@ Permet els canvis - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Les llistes de reproducció són llistes ordenades de cançons que permeten planificar les vostres sessions de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJ preparen llistes de reproducció abans d'actuar, però altres prefereixen fer-les en viu. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quan utilitzeu una llista de reproducció durant una sessió en viu, recordeu parar atenció a com reacciona l'audiència a la música que heu decidit reproduir. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Pot ser necessari saltar algunes cançons preparades, o afegir-ne algunes de diferents per a mantenir la energia de la vostra audiència. - + Create New Playlist Crea una nova llista de reproducció @@ -9353,7 +9366,7 @@ - + History Historial @@ -9368,22 +9381,22 @@ Bloca els canvis - + The history section automatically keeps a list of tracks you play in your DJ sets. La secció d'històric manté automàticament una llista de les pistes que reproduïu en les vostres sessions de DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Això és útil per a recordar què va anar bé en les vostres sessions de DJ, compartir la llista de cançons de la sessió, o informar les reproduccions a les organizacions de drets d'autor. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada cop que inicieu Mixxx, es crea una nova entrada d'històric. Podeu esportar-la com a llista de reproducció en diferents formats, o reproduir-la de nou amb el DJ automàtic. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Podeu unir l'històric de la sessió actual amb l'anterior fent clic al botó dret del ratolí i seleccionant "Uneix amb l'anterior" @@ -9573,23 +9586,23 @@ SoundManager - - + + a device un dispositiu - + An unknown error occurred S'ha produït un error desconegut - + Two outputs cannot share channels on "%1" Dues sortides no poden compartir els mateixos canals de %1 - + Error opening "%1" Error obrint "%1" @@ -11775,12 +11788,12 @@ TrackCollection - + Hiding tracks Amagant les pistes - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Les pistes seleccionades estan a les llistes:%1Si les amagueu, s'eliminaran de les llistes. Voleu continuar? @@ -12577,68 +12590,68 @@ ESC - + Remove Suprimeix - + Remove from Playlist Suprimeix de la llista de reproducció - + Remove from Crate Suprimeix de la caixa - + Hide from Library No ho mostris a la biblioteca - + Unhide from Library Torna a mostrar a la biblioteca - + Purge from Library Suprimeix de la biblioteca - + Properties Propietats - + Open in File Browser Obre en l'explorador de fitxers - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crea una nova llista de reproducció - + Create New Crate Crea una nova caixa - + Enter name for new playlist: Inseriu el nom de la llista nova de reproducció: @@ -12668,144 +12681,144 @@ Canvia el Tempo - + Add to Auto DJ Queue (Bottom) Afegeix a la cua del DJ automàtic (al final) - + Add to Auto DJ Queue (Top) Afegeix a la cua del DJ automàtic (al principi) - + Add to Auto DJ Queue (Replace) Afegeix a la cua del DJ automàtic (reemplaça) - + Import From File Tags Importa des de les metadades del fitxer - + Import From MusicBrainz Importa des del MusicBrainz - + Export To File Tags Exporta les metadades al fitxer - + Preview Deck Reproductor de pre-escolta - + BPM and Beatgrid BPM i graella de ritme - + Play Count Comptador de reproduccions - + Cue Point Punt d'inici - + Hotcues Marca directa - + Loop Bucle - + ReplayGain ReplayGain - + Waveform Ona - + All Tot - + Deck %1 Plat %1 - + New Playlist Llista de reproducció nova - - - + + + Playlist Creation Failed Ha fallat la creació de la llista de reproducció - + A playlist by that name already exists. Ja existeix una llista de reproducció amb aquest nom. - + A playlist cannot have a blank name. El nom de la llista de reproducció no pot quedar en blanc - + An unknown error occurred while creating playlist: S'ha produït un error desconegut en crear la llista de reproducció: - + Lock BPM Bloca els BPM - + Unlock BPM Desbloca els BPM - + Double BPM Augmenta el tempo al doble - + Halve BPM Redueix el tempo a la meitat - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Reproductor de mostres %1 @@ -12833,12 +12846,12 @@ (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_cs.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_cs.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_cs.ts mixxx-2.2.4~dfsg/res/translations/mixxx_cs.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_cs.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_cs.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Automatický diskžokej - + Add Crate as Track Source Přidat přepravku na desky jako zdroj skladeb @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nový seznam skladeb @@ -110,7 +110,7 @@ - + Create New Playlist Vytvořit nový seznam skladeb @@ -156,82 +156,82 @@ Rozebrat celý seznam skladeb - + Enter new name for playlist: Zadat nový název pro seznam skladeb: - + Duplicate Playlist Zdvojit seznam skladeb - - + + Enter name for new playlist: Zadat název pro nový seznam skladeb: - + Export Playlist Uložit seznam skladeb - + Rename Playlist Přejmenovat seznam skladeb - - + + Renaming Playlist Failed Seznam skladeb se nepodařilo přejmenovat - - - + + + A playlist by that name already exists. Seznam skladeb s tímto názvem již existuje. - - - + + + A playlist cannot have a blank name. Seznam skladeb musí mít název. - + _copy [noun] Appendix to default name when duplicating a playlist _kopie - - - - - - + + + + + + Playlist Creation Failed Seznam skladeb se nepodařilo vytvořit - - + + An unknown error occurred while creating playlist: Při vytváření seznamu skladeb došlo k neznámé chybě: - + M3U Playlist (*.m3u) Seznam skladeb M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Seznam skladeb M3U (*.m3u);;Seznam skladeb M3U8 (*.m3u8);;Seznam skladeb PLS (*.pls);;Text CSV (*.csv);;Prostý text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nepodařilo se nahrát skladbu. @@ -988,7 +988,7 @@ Set cue point - Nastavit bod označení + Nastavit bod značky @@ -2768,7 +2768,7 @@ - + Lock Zamknout @@ -2793,7 +2793,7 @@ Zdroj skladeb pro automatického diskžokeje - + Enter new name for crate: Zadat nový název pro přepravku: @@ -2811,38 +2811,38 @@ - + Export Crate Uložit přepravku - + Unlock Odemknout - + An unknown error occurred while creating crate: Při vytváření přepravky na desky nastala neznámá chyba: - + Rename Crate Přejmenovat přepravku - - + + Renaming Crate Failed Přejmenování přepravky se nezdařilo - + Crate Creation Failed Vytvoření přepravky se nezdařilo - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Seznam skladeb M3U (*.m3u);;Seznam skladeb M3U8 (*.m3u8);;Seznam skladeb PLS (*.pls);;Text CSV (*.csv);;Prostý text (*.txt) @@ -2862,12 +2862,12 @@ Přepravky na desky vám umožní uspořádat si svou sbírku skladeb po svém! - + A crate cannot have a blank name. Název přepravky nemůže být prázdný. - + A crate by that name already exists. Přepravka s tímto názvem již existuje. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Zadat název pro novou přepravku: - - + + Creating Crate Failed Vytvoření přepravky se nezdařilo - + A crate cannot have a blank name. Název přepravky nemůže být prázdný. - - + + A crate by that name already exists. Přepravka s tímto názvem již existuje. - - + + An unknown error occurred while creating crate: Při vytváření přepravky na desky nastala neznámá chyba: - + copy [noun] Kopírovat - + Duplicate Crate Zdvojit přepravku - - - + + + Duplicating Crate Failed Zdvojení přepravky se nezdařilo @@ -5614,7 +5614,7 @@ DlgPrefRecord - + Choose recordings directory Vybrat adresář pro nahrávání @@ -5831,115 +5831,115 @@ DlgPrefSound - + None Žádný - + %1 Hz %1 Hz - + Default (long delay) Výchozí (dlouhé zpoždění) - + Experimental (no delay) Pokusné (žádné zpoždění) - + Disabled (short delay) Zakázáno (krátké zpoždění) - + Soundcard Clock Hodiny zvukové karty - + Network Clock Hodiny sítě - + Master output only Pouze hlavní výstup - + Master and booth outputs Hlavní výstup a výstup kukaně - + Direct monitor (recording and broadcasting only) Přímý dohled (pouze nahrávání a vysílání) - + Disabled Zakázáno - + Enabled Povoleno - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofonní vstupy jsou při nahrávání a vysílaní zpožděny v porovnání s tím, co slyšíte. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Změřte prodlevu zpoždění a zadejte ji výše pro prodlevu mikrofonu. Kompenzace pro přizpůsobení načasování mikrofonu. - - + + Refer to the Mixxx User Manual for details. Nahlédněte do uživatelské příručky k Mixxxu, kde jsou podrobnosti. - + Configured latency has changed. Nastavená prodleva se změnila. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Opakujte nastavení zpoždění a zadejte ji výše pro latenci mikrofonu Kompenzace pro přizpůsobení načasování mikrofonu. - + Realtime scheduling is enabled. Je povoleno zařazování do rozvrhu ve skutečném čase. - + %1 ms %1 ms - + Configuration error Chyba nastavení @@ -7415,15 +7415,28 @@ LibraryFeature - + Import Playlist Nahrát seznam skladeb - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Soubory se seznamy skladeb (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7715,39 +7728,39 @@ Nelze nahrát vybraný vzhled. - + OpenGL Direct Rendering Přímé vykreslování OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Potvrdit ukončení - + A deck is currently playing. Exit Mixxx? Některá z přehrávacích mechanik hraje. Ukončit Mixxx? - + A sampler is currently playing. Exit Mixxx? Vzorkovač nyní hraje. Ukončit Mixxx? - + The preferences window is still open. Okno s nastavením je stále otevřené. - + Discard any changes and exit Mixxx? Zahodit všechny změny a ukončit Mixxx? @@ -7826,7 +7839,7 @@ - + Playlists Seznamy skladeb @@ -7836,27 +7849,27 @@ Odemknout - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Seznamy skladeb jsou uspořádané seznamy skladeb, které vám umožňují plánovat vaše seznamy skladeb při míchání. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Někteří diskžokejové sestavují seznamy skladeb, předtím než vystoupí živě, ale jiní upřednostňují jejich tvoření bez rozmýšlení. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Když používáte seznam skladeb během míchání, dávejte vždy obzvláštní pozor na to, jak hudba, kterou hrajete, účinkuje na posluchačstvo. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Může být nezbytné přeskočit některé skladby v předpřipraveném seznamu skladeb nebo přidat několik nových skladeb pro udržení posluchačů při síle. - + Create New Playlist Vytvořit nový seznam skladeb @@ -8447,7 +8460,7 @@ Synchronizes the BPM with the track if it can be retrieved - + Seřídí údery za minutu se stopou, pokud lze údaj získat @@ -8503,7 +8516,7 @@ Emulates the sound of the signal bouncing off the walls of a room - + Napodobí zvuk odrážení signálu od stěn místnosti @@ -8526,7 +8539,7 @@ How much of the signal to send in to the effect - + Podíl signálu, který se má poslat do efektu @@ -8760,7 +8773,7 @@ Number of stages - + Počet stupňů @@ -9335,7 +9348,7 @@ - + History Historie @@ -9350,22 +9363,22 @@ Zamknout - + The history section automatically keeps a list of tracks you play in your DJ sets. Historie automaticky uchovává seznam skladeb, které jste hrál během míchání. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. To je šikovné na zapamatování, co se hrálo při vašich sezeních, kdy jste míchal, ke zveřejnění seznamů v sezení hraných skladeb, nebo k nahlášení obsahu vysílání organizacím spravujícím autorská práva. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Při každém spuštění Mixxxu je v nové složce vytvořena nová historie sezení. Můžete ji vyvést jako seznam skladeb v různých formátech nebo znovu přehrát pomocí automatického diskžokeje. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Klepnutím pravého tlačítka myši a vybráním Spojit s předchozím můžete složku s historií nynějšího sezení sloučit se složkou předchozího sezení. @@ -9555,23 +9568,23 @@ SoundManager - - + + a device zařízení - + An unknown error occurred Došlo k neznámé chybě - + Two outputs cannot share channels on "%1" Dva výstupy nemohou sdílet kanály na "%1" - + Error opening "%1" Chyba při otevírání "%1" @@ -10537,17 +10550,17 @@ Route the left crossfader bus through this effect unit. - + Vést sběrnici levého prolínače skrze tuto efektovou jednotku. Route the right crossfader bus through this effect unit. - + Vést sběrnici pravého prolínače skrze tuto efektovou jednotku. Right side active: parameter moves with right half of Meta Knob turn - + Pravá strana činná: parametr se pohybuje pomocí pravé poloviny otočení otočného řízení. @@ -10567,7 +10580,7 @@ Save the collection of samples loaded in the samplers. - + Uložit sbírku vzorků nahranou do vzorkovačů. @@ -10577,7 +10590,7 @@ Load a previously saved collection of samples into the samplers. - + Nahrát předtím uloženou sbírku vzorků do vzorkovačů. @@ -10667,7 +10680,7 @@ Show/hide parameters for effects in this unit. - + Ukázat/Skrýt parametry pro efekty v této jednotce. @@ -10682,22 +10695,22 @@ Controls the Meta Knob of all effects in this unit together. - + Ovládá otočné řízení všech efektů v této jednotce společně. Load next effect chain preset into this effect unit. - + Nahrát další přednastavení efektového řetězce do této efektové jednotky. Load previous effect chain preset into this effect unit. - + Nahrát předchozí přednastavení efektového řetězce do této efektové jednotky. Load next or previous effect chain preset into this effect unit. - + Nahrát další nebo předchozí přednastavení efektového řetězce do této efektové jednotky. @@ -10715,37 +10728,37 @@ Assign this effect unit to the channel output. - + Přiřadit tuto efektovou jednotku výstupu kanálu. Route the headphone channel through this effect unit. - + Vést kanál sluchátek skrze tuto efektovou jednotku. Route the master mix through this effect unit. - + Vést hlavní míchání skrze tuto efektovou jednotku. Route this deck through the indicated effect unit. - + Vést tento přehrávač skrze označenou efektovou jednotku. Route this sampler through the indicated effect unit. - + Vést tento vzorkovač skrze označenou efektovou jednotku. Route this microphone through the indicated effect unit. - + Vést tento mikrofon skrze označenou efektovou jednotku. Route this auxiliary input through the indicated effect unit. - + Vést tento pomocný vstup skrze označenou efektovou jednotku. @@ -10825,17 +10838,17 @@ Active: parameter moves with Meta Knob - + Činné: parametr se pohybuje pomocí otočného řízení Left side active: parameter moves with left half of Meta Knob turn - + Levá strana činná: parametr se pohybuje po polovině otočení otočného řízení vlevo Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - + Levá a pravá strana činná: parametr se pohybuje v celé šířce pásma pomocí jedné poloviny otočení otočného řízení a zpět pomocí druhé @@ -11447,17 +11460,17 @@ Crossfader Orientation - + Nasměrování prolínání Set the channel's crossfader orientation. - + Nastavit nasměrování prolínání kanálu. Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Buď na levou stranu prolínání, na pravou stranu nebo na střed (neovlivněno prolínačem) @@ -11755,12 +11768,12 @@ TrackCollection - + Hiding tracks Skrytí skladeb - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Vybrané skladby jsou v následujících seznamech skladeb: %1 Jejich skrytí je odstraní z těchto seznamů skladeb. Pokračovat? @@ -12557,75 +12570,75 @@ ESC - + Remove Odstranit - + Remove from Playlist Odstranit ze seznamu skladeb - + Remove from Crate Odstranit z přepravky - + Hide from Library Skrýt z knihovny - + Unhide from Library Ukázat v knihovně - + Purge from Library Odstranit z knihovny - + Properties Vlastnosti - + Open in File Browser Otevřít v prohlížeči souborů - + 4/3 BPM 4/3 ÚZM - + 3/2 BPM 3/2 ÚZM - - + + Create New Playlist Vytvořit nový seznam skladeb - + Create New Crate Vytvořit novou přepravku - + Enter name for new playlist: Zadat název pro nový seznam skladeb: Load to - + Nahrát do @@ -12645,147 +12658,147 @@ Change BPM - + Změnit ÚZM - + Add to Auto DJ Queue (Bottom) - + Přidat do řady automatického diskžokeje (dolů) - + Add to Auto DJ Queue (Top) - + Přidat do řady automatického diskžokeje (nahoru) - + Add to Auto DJ Queue (Replace) - + Přidat do řady automatického diskžokeje (nahradit) - + Import From File Tags Nahrát ze značek souboru - + Import From MusicBrainz Import z MusicBrainz - + Export To File Tags Uložit do značek souboru - + Preview Deck Náhled přehrávače - + BPM and Beatgrid - + ÚZM a rytmická mřížka - + Play Count Počet přehrání - + Cue Point - + Nastavit bod označení - + Hotcues Rychlé značky - + Loop Skok - + ReplayGain Vyrovnání hlasitosti - + Waveform Průběhová křivka - + All Vše - + Deck %1 Přehrávač %1 - + New Playlist Nový seznam skladeb - - - + + + Playlist Creation Failed Seznam skladeb se nepodařilo vytvořit - + A playlist by that name already exists. Seznam skladeb s tímto názvem již existuje. - + A playlist cannot have a blank name. Seznam skladeb musí mít název. - + An unknown error occurred while creating playlist: Při vytváření seznamu skladeb došlo k neznámé chybě: - + Lock BPM Zamknout - + Unlock BPM Odemknout ÚZM - + Double BPM Zdvojit - + Halve BPM Snížit na polovinu - + 2/3 BPM 2/3 - + 3/4 BPM 3/4 - + Sampler %1 Vzorkovač %1 @@ -12813,12 +12826,12 @@ (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_da.ts mixxx-2.2.4~dfsg/res/translations/mixxx_da.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_da.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_da.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Ny afspilningsliste @@ -108,7 +108,7 @@ - + Create New Playlist Opret ny afspilningsliste @@ -154,82 +154,82 @@ Analyser hele afspilningslisten - + Enter new name for playlist: Indtast nyt navn til afspilningslisten: - + Duplicate Playlist Kopier afspilningsliste - - + + Enter name for new playlist: Indtast navn til ny afspilningsliste: - + Export Playlist Eksportér afspilningsliste - + Rename Playlist Omdøb afspilningsliste - - + + Renaming Playlist Failed Omdøbningen af afspilningslisten fejlede - - - + + + A playlist by that name already exists. En afspillingsliste med samme navn eksisterer allerede. - - - + + + A playlist cannot have a blank name. En afspillingsliste kan ikke have et tomt navn. - + _copy [noun] Appendix to default name when duplicating a playlist _kopier - - - - - - + + + + + + Playlist Creation Failed Afspilningsliste-oprettelsen fejlede - - + + An unknown error occurred while creating playlist: En ukendt fejl opstod under oprettelsen af afspilningslisten: - + M3U Playlist (*.m3u) M3U-afspilningsliste (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kunne ikke læse spor. @@ -2766,7 +2766,7 @@ - + Lock Lås @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock Lås op - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Aktiv - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importér afspilningsliste - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Afspillingsliste Filer (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Lås op - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Opret ny afspilningsliste @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Lås - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Fjern - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Opret ny afspilningsliste - + Create New Crate - + Enter name for new playlist: Indtast navn til ny afspilningsliste: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 Pladespiller 1 - + New Playlist Ny afspilningsliste - - - + + + Playlist Creation Failed Afspilningsliste-oprettelsen fejlede - + A playlist by that name already exists. En afspillingsliste med samme navn eksisterer allerede. - + A playlist cannot have a blank name. En afspillingsliste kan ikke have et tomt navn. - + An unknown error occurred while creating playlist: En ukendt fejl opstod under oprettelsen af afspilningslisten: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_de.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_de.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_de.ts mixxx-2.2.4~dfsg/res/translations/mixxx_de.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_de.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_de.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto-DJ - + Add Crate as Track Source Plattenkiste als Track-Quelle hinzufügen @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Neue Wiedergabeliste @@ -110,7 +110,7 @@ - + Create New Playlist Neue Wiedergabeliste erstellen @@ -156,82 +156,82 @@ Gesamte Wiedergabeliste analysieren - + Enter new name for playlist: Einen neuen Namen für Wiedergabeliste eingeben: - + Duplicate Playlist Wiedergabeliste duplizieren - - + + Enter name for new playlist: Einen Namen für neue Wiedergabeliste eingeben: - + Export Playlist Wiedergabeliste exportieren - + Rename Playlist Wiedergabeliste umbenennen - - + + Renaming Playlist Failed Umbenennen der Wiedergabeliste fehlgeschlagen - - - + + + A playlist by that name already exists. Eine Wiedergabeliste mit diesem Namen gibt es bereits. - - - + + + A playlist cannot have a blank name. Eine Wiedergabeliste muss einen Namen haben. - + _copy [noun] Appendix to default name when duplicating a playlist _Kopie - - - - - - + + + + + + Playlist Creation Failed Erstellung der Wiedergabeliste fehlgeschlagen - - + + An unknown error occurred while creating playlist: Beim Erstellen der Wiedergabeliste ist ein Fehler aufgetreten: - + M3U Playlist (*.m3u) M3U-Wiedergabeliste (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U-Wiedergabeliste (*.m3u);;M3U8-Wiedergabeliste (*.m3u8);;PLS-Wiedergabeliste (*.pls);;Text-CSV (*.csv);;Lesbarer Text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Track konnte nicht geladen werden. @@ -2768,7 +2768,7 @@ - + Lock Sperren @@ -2793,7 +2793,7 @@ Auto-DJ Track-Quelle - + Enter new name for crate: Einen neuen Namen für Plattenkiste eingeben: @@ -2811,38 +2811,38 @@ - + Export Crate Plattenkiste exportieren - + Unlock Entsperren - + An unknown error occurred while creating crate: Bei der Erstellung der Plattenkiste ist ein unbekannter Fehler aufgetreten: - + Rename Crate Plattenkiste umbenennen - - + + Renaming Crate Failed Umbenennen der Plattenkiste fehlgeschlagen - + Crate Creation Failed Erstellung der Plattenkiste fehlgeschlagen - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U-Wiedergabeliste (*.m3u);;M3U8-Wiedergabeliste (*.m3u8);;PLS-Wiedergabeliste (*.pls);;Text-CSV (*.csv);;Lesbarer Text (*.txt) @@ -2862,12 +2862,12 @@ Plattenkisten ermöglichen es Ihre Musik so zu organisieren wie Sie möchten! - + A crate cannot have a blank name. Der Name einer Plattenkiste darf nicht leer sein. - + A crate by that name already exists. Eine Plattenkiste mit diesem Namen existiert bereits. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Einen Namen für neue Plattenkiste eingeben: - - + + Creating Crate Failed Erstellung der Plattenkiste fehlgeschlagen - + A crate cannot have a blank name. Der Name einer Plattenkiste darf nicht leer sein. - - + + A crate by that name already exists. Eine Plattenkiste mit diesem Namen existiert bereits. - - + + An unknown error occurred while creating crate: Bei der Erstellung der Plattenkiste ist ein unbekannter Fehler aufgetreten: - + copy [noun] Kopie - + Duplicate Crate Plattenkiste duplizieren - - - + + + Duplicating Crate Failed Duplizieren der Plattenkiste fehlgeschlagen @@ -5614,7 +5614,7 @@ DlgPrefRecord - + Choose recordings directory Aufnahmen-Verzeichnis auswählen @@ -5831,113 +5831,113 @@ DlgPrefSound - + None Keine - + %1 Hz %1 Hz - + Default (long delay) Standard (lange Verzögerung) - + Experimental (no delay) Experimentell (keine Verzögerung) - + Disabled (short delay) Deaktiviert (kurze Verzögerung) - + Soundcard Clock Soundkarten-Taktgeber - + Network Clock Netzwerk-Taktgeber - + Master output only Nur Master-Ausgang - + Master and booth outputs Master und Booth-Ausgänge - + Direct monitor (recording and broadcasting only) Direkter Monitor (nur Aufzeichnung und Liveübertragung) - + Disabled Deaktiviert - + Enabled Aktiviert - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofon-Eingänge sind nicht synchron im Aufnahmen- und Liveübertragungssignal, verglichen mit dem was Sie hören. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Messen Sie die Round-Trip-Latenzzeit und geben diese für die Mikrofon-Latenzkompensation ein, um das Mikrofon-Timing auszurichten. - - + + Refer to the Mixxx User Manual for details. Details dazu findet man im Mixxx Benutzerhandbuch. - + Configured latency has changed. Konfigurierte Latenz hat sich geändert. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Messen Sie erneut die Round-Trip-Latenzzeit und geben diese für die Mikrofon-Latenzkompensation ein, um das Mikrofon-Timing auszurichten. - + Realtime scheduling is enabled. Echtzeit-Scheduling ist aktiviert. - + %1 ms %1 ms - + Configuration error Konfigurationsfehler @@ -7413,15 +7413,31 @@ LibraryFeature - + Import Playlist Wiedergabeliste importieren - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Wiedergabeliste-Dateien (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + Datei überschreiben? + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + Eine Wiedergabelistendatei mit dem Namen "%1" ist bereits vorhanden +Die Standarderweiterung "m3u" wurde hinzugefügt, da keine angegeben wurde. + +Möchten Sie es wirklich überschreiben? + LibraryScannerDlg @@ -7713,39 +7729,39 @@ Das gewählte Skin kann nicht geladen werden. - + OpenGL Direct Rendering Direktes Rendern mit OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + Direktes Rendern ist auf Ihrem System nicht aktiviert.<br><br>Dies bedeutet, dass die Wellenform-Anzeige sehr langsam sein wird <br><b>und möglicherweise Ihre CPU stark belastet</b>. Entweder aktualisieren Sie Ihre<br>Konfiguration, um direktes Rendern zu aktivieren oder deaktivieren<br>die Wellenform-Anzeige in den Mixxx-Einstellungen durch die Auswahl von<br>"Leer" als Wellenform-Anzeige im Bereich 'Benutzeroberfläche'. - - - + + + Confirm Exit Beenden bestätigen - + A deck is currently playing. Exit Mixxx? Ein Deck spielt derzeit. Mixxx beenden? - + A sampler is currently playing. Exit Mixxx? Ein Sampler spielt derzeit. Mixxx beenden? - + The preferences window is still open. Das Einstellungen-Fenster ist noch geöffnet. - + Discard any changes and exit Mixxx? Alle Änderungen verwerfen und Mixxx schließen? @@ -7824,7 +7840,7 @@ - + Playlists Wiedergabelisten @@ -7834,27 +7850,27 @@ Entsperren - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Wiedergabelisten sind geordnete Listen Ihrer Tracks die es ermöglichen Ihre DJ-Sets zu planen. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Einige DJs stellen Wiedergabelisten zusammen bevor sie live auftreten, während andere es bevorzugen sie nebenbei zu erstellen. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Achten Sie bei der Verwendung einer Wiedergabeliste während einer Live-DJ-Set immer darauf wie das Publikum auf die von Ihnen gespielte Musik reagiert. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Es kann notwendig sein bestimmte Tracks aus der vorbereiteten Wiedergabeliste zu überspringen oder einige neue Tracks hinzuzufügen um die Energie des Publikums aufrecht zu erhalten. - + Create New Playlist Neue Wiedergabeliste erstellen @@ -9352,7 +9368,7 @@ - + History Verlauf @@ -9367,22 +9383,22 @@ Sperren - + The history section automatically keeps a list of tracks you play in your DJ sets. Der Verlauf führt automatisch eine Liste der Tracks welche Sie in Ihrem DJ-Set spielen. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Das ist praktisch um sich zu erinnern was in Ihren DJ-Sets funktionierte, um Set-Listen zu veröffentlichen oder um Ihre Wiedergaben an Lizensierungsorganisation zu melden. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Bei jedem Start von Mixxx wird ein neuer Ordner im Verlauf erstellt. Diesen können Sie als Wiedergabeliste in verschiedenen Formaten exportieren oder erneut mit dem Auto-DJ wiedergeben. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Durch Recht-Klick und Auswahl von "Mit vorherigem verbinden" können Sie den Verlaufsordner der aktuellen Sitzung mit einem früheren Ordner zusammenführen. @@ -9572,23 +9588,23 @@ SoundManager - - + + a device ein Gerät - + An unknown error occurred Es ist ein unbekannter Fehler aufgetreten - + Two outputs cannot share channels on "%1" Zwei Ausgänge können sich keine Kanäle an "%1" teilen - + Error opening "%1" Fehler beim Öffnen von "%1" @@ -11774,12 +11790,12 @@ TrackCollection - + Hiding tracks Tracks verbergen - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Die ausgewählten Tracks sind in den folgenden Wiedergabelisten enthalten:%1 Ein Verbergen wird sie von diesen Wiedergabelisten entfernen. Weiter? @@ -12576,68 +12592,68 @@ ESC - + Remove Entfernen - + Remove from Playlist Von Wiedergabeliste entfernen - + Remove from Crate Aus Plattenkiste entfernen - + Hide from Library In der Bibliothek ausblenden - + Unhide from Library In der Bibliothek einblenden - + Purge from Library Aus der Bibliothek entfernen - + Properties Eigenschaften - + Open in File Browser Im Dateibrowser öffnen - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Neue Wiedergabeliste erstellen - + Create New Crate Neue Plattenkiste erstellen - + Enter name for new playlist: Einen Namen für neue Wiedergabeliste eingeben: @@ -12667,144 +12683,144 @@ BPM ändern - + Add to Auto DJ Queue (Bottom) Zur Auto-DJ Warteschlange hinzufügen (Ende) - + Add to Auto DJ Queue (Top) Zur Auto-DJ Warteschlange hinzufügen (Anfang) - + Add to Auto DJ Queue (Replace) Zur Auto-DJ Warteschlange hinzufügen (Ersetzen) - + Import From File Tags Aus Datei-Tags importieren - + Import From MusicBrainz Von MusicBrainz importieren - + Export To File Tags In Datei-Tags exportieren - + Preview Deck Vorhör-Deck - + BPM and Beatgrid BPM und Beatgrid - + Play Count Wiedergabezähler - + Cue Point Cue-Punkt - + Hotcues Hotcues - + Loop Loop - + ReplayGain ReplayGain - + Waveform Wellenform - + All Alle - + Deck %1 Deck %1 - + New Playlist Neue Wiedergabeliste - - - + + + Playlist Creation Failed Erstellung der Wiedergabeliste fehlgeschlagen - + A playlist by that name already exists. Eine Wiedergabeliste mit diesem Namen gibt es bereits. - + A playlist cannot have a blank name. Eine Wiedergabeliste muss einen Namen haben. - + An unknown error occurred while creating playlist: Beim Erstellen der Wiedergabeliste ist ein Fehler aufgetreten: - + Lock BPM BPM sperren - + Unlock BPM BPM entsperren - + Double BPM BPM verdoppeln - + Halve BPM BPM halbieren - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 @@ -12832,12 +12848,12 @@ (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_el-GR.ts mixxx-2.2.4~dfsg/res/translations/mixxx_el-GR.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_el-GR.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_el-GR.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Αυτόματος DJ - + Add Crate as Track Source Πρόσεθεσε το πακέτο στις πηγές ήχου @@ -100,7 +100,7 @@ BasePlaylistFeature - + New Playlist Νέα λίστα Αναπαραγωγής - Playlist @@ -112,7 +112,7 @@ - + Create New Playlist Δημιουργία Νέας λίστας Αναπαραγωγής - Playlist @@ -158,82 +158,82 @@ Ανάλυση Ολόκληρης της λίστας Αναπαραγωγής - + Enter new name for playlist: Δώσε το νέο όνομα της λίστας αναπαραγωγής: - + Duplicate Playlist Διπλότυπη λίστα Αναπαραγωγής - - + + Enter name for new playlist: Δώσε το όνομα για νέα λιστα αναπαραγωγής: - + Export Playlist Εξαγωγή της λίστας Αναπαργωγής - + Rename Playlist Μετονομασία της λίστας Αναπαραγωγής - - + + Renaming Playlist Failed Απέτυχε η Μετονομασία της λίστας Αναπαραγωγής - - - + + + A playlist by that name already exists. Μία λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - - - + + + A playlist cannot have a blank name. Μια λίστα αναπαραγωγής δεν μπορεί να εχει κενό όνομα. - + _copy [noun] Appendix to default name when duplicating a playlist _αντιγραφή - - - - - - + + + + + + Playlist Creation Failed Απέτυχε η κατασκευή λίστας Αναπαραγωγής. - - + + An unknown error occurred while creating playlist: Ενα αγνωστο λάθος παρουσιάστηκε κατα την κατασκευή της λιστας αναπαραγωγής - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -369,7 +369,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Αδύνατο να φόρτωθεί το συγκεκριμένο κομμάτι. @@ -2771,7 +2771,7 @@ - + Lock Κλείδωμα @@ -2796,7 +2796,7 @@ - + Enter new name for crate: @@ -2814,38 +2814,38 @@ - + Export Crate Εξαγωγή Κιβωτίου - + Unlock Ξεκλείδωμα - + An unknown error occurred while creating crate: Ένα άγνωστο λάθος προκλήθηκε κατά την δημιουργία του κιβωτίου: - + Rename Crate Μετονομασία Κιβωτίου - - + + Renaming Crate Failed Η Μετονομασία του Κιβωτίου Απέτυχε. - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2865,12 +2865,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2889,50 +2889,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: Ένα άγνωστο λάθος προκλήθηκε κατά την δημιουργία του κιβωτίου: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5585,7 +5585,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5800,113 +5800,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Ενεργοποιημένο - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7377,15 +7377,28 @@ LibraryFeature - + Import Playlist Εισαγωγή λίστας Αναπαραγωγής - Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7670,39 +7683,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists @@ -7789,27 +7802,27 @@ Ξεκλείδωμα - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Δημιουργία Νέας λίστας Αναπαραγωγής - Playlist @@ -9274,7 +9287,7 @@ - + History @@ -9289,22 +9302,22 @@ Κλείδωμα - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove Διαγραφή - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Δημιουργία Νέας λίστας Αναπαραγωγής - Playlist - + Create New Crate - + Enter name for new playlist: Δώσε το όνομα για νέα λιστα αναπαραγωγής: @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Νέα λίστα Αναπαραγωγής - Playlist - - - + + + Playlist Creation Failed Απέτυχε η κατασκευή λίστας Αναπαραγωγής. - + A playlist by that name already exists. Μία λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - + A playlist cannot have a blank name. Μια λίστα αναπαραγωγής δεν μπορεί να εχει κενό όνομα. - + An unknown error occurred while creating playlist: Ενα αγνωστο λάθος παρουσιάστηκε κατα την κατασκευή της λιστας αναπαραγωγής - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_el.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_el.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_el.ts mixxx-2.2.4~dfsg/res/translations/mixxx_el.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_el.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_el.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Αυτόματος DJ - + Add Crate as Track Source Προσθήκη κιβωτίου ως πηγή μουσικού κομματιού @@ -99,9 +99,9 @@ BasePlaylistFeature - + New Playlist - Νέα λίστα αναπαραγωγής + Νέα Λίστα Αναπαραγωγής @@ -110,7 +110,7 @@ - + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής @@ -156,82 +156,82 @@ Ανάλυση ολόκληρης της λίστας αναπαραγωγής - + Enter new name for playlist: Εισάγετε νέο όνομα για τη λίστα αναπαραγωγής: - + Duplicate Playlist Κλωνοποίηση λίστας αναπαραγωγής - - + + Enter name for new playlist: Εισάγετε όνομα για τη νέα λίστα αναπαραγωγής: - + Export Playlist Εξαγωγή λίστας αναπαραγωγής - + Rename Playlist Μετονομασία λίστας αναπαραγωγής - - + + Renaming Playlist Failed Η μετονομασία της λίστας αναπαραγωγής απέτυχε - - - + + + A playlist by that name already exists. Μια λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - - - + + + A playlist cannot have a blank name. Η λίστα αναπαραγωγής δεν μπορεί να έχει κενό όνομα. - + _copy [noun] Appendix to default name when duplicating a playlist _αντίγραφο - - - - - - + + + + + + Playlist Creation Failed Η δημιουργία λίστας αναπαραγωγής απέτυχε - - + + An unknown error occurred while creating playlist: Προέκυψε άγνωστο σφάλμα κατά τη δημιουργία λίστας: - + M3U Playlist (*.m3u) Λίστα Αναπαραγωγής M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Λίστα M3U (*.m3u);;Λίστα M3U8 (*.m3u8);;Λίστα PLS (*.pls);;Κείμενο CSV (*.csv);;Απλό κείμενο (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. H φόρτωση του κομματιού απέτυχε. @@ -382,7 +382,7 @@ Please enable at least one connection to use Live Broadcasting. - + Παρακαλούμε ενεργοποιήστε τουλάχιστον μία σύνδεση για τη λειτουργία Ζωντανής Μετάδοσης. @@ -405,7 +405,7 @@ <b>Error with settings for '%1':</b><br> - + <b>Σφάλμα στις ρυθμίσεις του '%1':</b><br> @@ -428,7 +428,7 @@ Disconnected - + Αποσυνδεδεμένο @@ -438,7 +438,7 @@ Connected - + Συνδεδεμένο @@ -1090,7 +1090,7 @@ 1/2 - + 1/2 @@ -1100,32 +1100,32 @@ 2 - + 2 4 - + 4 8 - + 8 16 - + 16 32 - + 32 64 - + 64 @@ -1461,7 +1461,7 @@ Sync - + Συγχρονισμός @@ -1528,7 +1528,7 @@ Speed (Pitch/Tempo) - + Ταχύτητα (Τόνος/Ρυθμός) @@ -1538,12 +1538,12 @@ Pitch control (does not affect tempo), center is original pitch - + Έλεγχος τόνου (δεν επηρεάζει το ρυθμό), το κέντρο αντιστοιχεί στον αρχικό τόνο Pitch Adjust - + Ρύθμιση Τόνου @@ -2769,7 +2769,7 @@ - + Lock Κλείδωμα @@ -2794,7 +2794,7 @@ - + Enter new name for crate: @@ -2812,38 +2812,38 @@ - + Export Crate Εξαγωγή Κιβωτίου - + Unlock Ξεκλείδωμα - + An unknown error occurred while creating crate: Προκλήθηκε άγνωστο σφάλμα κατά την δημιουργία του κιβωτίου: - + Rename Crate Μετονομασία Κιβωτίου - - + + Renaming Crate Failed Η Μετονομασία του Κιβωτίου Απέτυχε - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Λίστα M3U (*.m3u);;Λίστα M3U8 (*.m3u8);;Λίστα PLS (*.pls);;Κείμενο CSV (*.csv);;Απλό κείμενο (*.txt) @@ -2863,12 +2863,12 @@ Τα κιβώτια σας επιτρέπουν να οργανώσετε τη μουσική σας όπως σας αρέσει! - + A crate cannot have a blank name. Το όνομα ενός Κιβωτίου δε μπορεί να είναι Κενό - + A crate by that name already exists. Υπάρχει ήδη κιβώτιο με αυτό το όνομα. @@ -2887,50 +2887,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Η Δημιουργία του Κιβωτίου Απέτυχε - + A crate cannot have a blank name. Το όνομα ενός Κιβωτίου δε μπορεί να είναι Κενό - - + + A crate by that name already exists. Υπάρχει ήδη κιβώτιο με αυτό το όνομα. - - + + An unknown error occurred while creating crate: Προκλήθηκε άγνωστο σφάλμα κατά την δημιουργία του κιβωτίου: - + copy [noun] - + Duplicate Crate Υπάρχον Κιβώτιο - - - + + + Duplicating Crate Failed @@ -3013,7 +3013,7 @@ All - + Όλα @@ -3084,7 +3084,7 @@ Add Random - + Προσθήκη Τυχαίου @@ -5304,12 +5304,12 @@ Add track to Auto DJ Queue (top) - + Προσθήκη στην Λίστα του Αυτόματου DJ (στην αρχή) Add track to Auto DJ Queue (bottom) - + Προσθήκη στην Λίστα του Αυτόματου DJ (στο τέλος) @@ -5447,7 +5447,7 @@ 16 - + 16 @@ -5587,7 +5587,7 @@ DlgPrefRecord - + Choose recordings directory Διαλέψτε κατάλογο εγγραφής @@ -5802,113 +5802,113 @@ DlgPrefSound - + None Κανένα - + %1 Hz %1 Hz - + Default (long delay) Αρχική (μακρά καθυστέρηση) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Απενεργοποιημένο - + Enabled Ενεργοποιημένο - + Stereo Στεροφωνία - + Mono Μονοφωνία - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Σφάλμα ρυθμίσεων @@ -7368,7 +7368,7 @@ Add Directory to Library - + Προσθήκη Φακέλου στη Βιβλιοθήκη @@ -7379,15 +7379,28 @@ LibraryFeature - + Import Playlist Εισαγωγή λίστας αναπαραγωγής - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Αρχεία Λίστας (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7675,39 +7688,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Επιβεβαίωση εξόδου - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. Το παράθυρο επιλογών είναι ακόμα ανοιχτό - + Discard any changes and exit Mixxx? Απαλοιφή αλλαγών και έξοδος του Mixxx; @@ -7784,7 +7797,7 @@ - + Playlists Λίστες Αναπαραγωγής @@ -7794,27 +7807,27 @@ Ξεκλείδωμα - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής @@ -8352,7 +8365,7 @@ Mix - + Μείξη @@ -8387,7 +8400,7 @@ Sync - + Συγχρονισμός @@ -9095,7 +9108,7 @@ Waveform - + Κυματομορφή @@ -9279,7 +9292,7 @@ - + History Ιστορικό @@ -9294,22 +9307,22 @@ Κλείδωμα - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Κάθε φορά που εκκινείται το Mixxx, ένας νέος τομέας ιστορικού δημιουργείται. Μπορείτε να το εξάγετε ώς λίστα αναπαραγωγής σε διάφορους τύπους αρχείου ή να το αναπαράξετε ξανά με το Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9499,23 +9512,23 @@ SoundManager - - + + a device μια συσκευή - + An unknown error occurred Προέκυψε ένα άγνωστο σφάλμα - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -10274,7 +10287,7 @@ Recording Duration - + Διάρκεια Ηχογράφησης @@ -10439,7 +10452,7 @@ Mix - + Μείξη @@ -11236,7 +11249,7 @@ Pitch Adjust - + Ρύθμιση τόνου @@ -11699,12 +11712,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -11990,7 +12003,7 @@ Open - + Άνοιγμα @@ -12005,7 +12018,7 @@ Ctrl+q - + Ctrl+q @@ -12050,7 +12063,7 @@ Ctrl+Shift+N - + Ctrl+Shift+N @@ -12501,68 +12514,68 @@ - + Remove Αφαίρεση - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Ιδιότητες - + Open in File Browser Άνοιξε το στο πρόγραμμα περιήγησης αρχείων - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Δημιουργία νέας λίστας αναπαραγωγής - + Create New Crate - + Enter name for new playlist: Εισάγετε όνομα για τη νέα λίστα αναπαραγωγής: @@ -12592,144 +12605,144 @@ - + Add to Auto DJ Queue (Bottom) - + Προσθήκη στη λίστα του Αυτόματου DJ (στο τέλος) - + Add to Auto DJ Queue (Top) - + Προσθήκη στην Λίστα του Αυτόματου DJ (στην αρχή) - + Add to Auto DJ Queue (Replace) - + Προσθήκη στην Λίστα του Αυτόματου DJ (Αντικατάσταση) - + Import From File Tags - + Εισαγωγή Από Ετικέτες Αρχείου - + Import From MusicBrainz - + Εισαγωγή από MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain ReplayGain - + Waveform - + Κυματομορφή - + All - + Όλα - + Deck %1 Deck %1 - + New Playlist Νέα λίστα αναπαραγωγής - - - + + + Playlist Creation Failed Η δημιουργία λίστας αναπαραγωγής απέτυχε - + A playlist by that name already exists. Μια λίστα αναπαραγωγής με αυτό το όνομα υπάρχει ήδη. - + A playlist cannot have a blank name. Η λίστα αναπαραγωγής δεν μπορεί να έχει κενό όνομα. - + An unknown error occurred while creating playlist: Προέκυψε άγνωστο σφάλμα κατά τη δημιουργία λίστας: - + Lock BPM Kλείδωμα BPM - + Unlock BPM Ξεκλείδωμα BPM - + Double BPM Διπλασιασμός BPM - + Halve BPM Υποδιπλασιασμός BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_en_GB.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_en_GB.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_en_GB.ts mixxx-2.2.4~dfsg/res/translations/mixxx_en_GB.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_en_GB.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_en_GB.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Add Crate as Track Source @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist New Playlist @@ -110,7 +110,7 @@ - + Create New Playlist Create New Playlist @@ -148,7 +148,7 @@ Export Track Files - + Esporta Track Files @@ -156,82 +156,82 @@ Analyze entire Playlist - + Enter new name for playlist: Enter new name for playlist: - + Duplicate Playlist Duplicate Playlist - - + + Enter name for new playlist: Enter name for new playlist: - + Export Playlist Export Playlist - + Rename Playlist Rename Playlist - - + + Renaming Playlist Failed Renaming Playlist Failed - - - + + + A playlist by that name already exists. A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Playlist Creation Failed - - + + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Couldn't load track. @@ -2768,14 +2768,14 @@ - + Lock Lock Export Track Files - + Esporta Track Files @@ -2793,7 +2793,7 @@ Auto DJ Track Source - + Enter new name for crate: Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate Export Crate - + Unlock Unlock - + An unknown error occurred while creating crate: An unknown error occurred while creating crate: - + Rename Crate Rename Crate - - + + Renaming Crate Failed Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);; M3U8 Playlist (*.m3u8);; PLS Playlist (*.pls);; Text CSV (*.csv);; Readable Text (*.txt) @@ -2862,12 +2862,12 @@ Crates let you organize your music however you'd like! - + A crate cannot have a blank name. A crate cannot have a blank name. - + A crate by that name already exists. A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Enter name for new crate: - - + + Creating Crate Failed Creating Crate Failed - + A crate cannot have a blank name. A crate cannot have a blank name. - - + + A crate by that name already exists. A crate by that name already exists. - - + + An unknown error occurred while creating crate: An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5594,7 +5594,7 @@ DlgPrefRecord - + Choose recordings directory Choose recordings directory @@ -5811,113 +5811,113 @@ DlgPrefSound - + None None - + %1 Hz %1 Hz - + Default (long delay) Default (long delay) - + Experimental (no delay) Experimental (no delay) - + Disabled (short delay) Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Disabled - + Enabled Enabled - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Configuration error @@ -7391,15 +7391,28 @@ LibraryFeature - + Import Playlist Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7691,39 +7704,39 @@ The selected skin cannot be loaded. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirm Exit - + A deck is currently playing. Exit Mixxx? A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. The preferences window is still open. - + Discard any changes and exit Mixxx? Discard any changes and exit Mixxx? @@ -7802,7 +7815,7 @@ - + Playlists Playlists @@ -7812,27 +7825,27 @@ Unlock - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Create New Playlist @@ -9304,7 +9317,7 @@ - + History History @@ -9319,22 +9332,22 @@ Lock - + The history section automatically keeps a list of tracks you play in your DJ sets. The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9524,23 +9537,23 @@ SoundManager - - + + a device a device - + An unknown error occurred An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11724,12 +11737,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12526,68 +12539,68 @@ ESC - + Remove Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library Hide from Library - + Unhide from Library Unhide from Library - + Purge from Library Purge from Library - + Properties Properties - + Open in File Browser Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Create New Playlist - + Create New Crate Create New Crate - + Enter name for new playlist: Enter name for new playlist: @@ -12617,144 +12630,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcues - + Loop - + ReplayGain - + Waveform - + All All - + Deck %1 Deck %1 - + New Playlist New Playlist - - - + + + Playlist Creation Failed Playlist Creation Failed - + A playlist by that name already exists. A playlist by that name already exists. - + A playlist cannot have a blank name. A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Lock BPM Lock BPM - + Unlock BPM Unlock BPM - + Double BPM Double BPM - + Halve BPM Halve BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_en.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_en.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_en.ts mixxx-2.2.4~dfsg/res/translations/mixxx_en.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_en.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_en.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Add Crate as Track Source @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist New Playlist @@ -110,7 +110,7 @@ - + Create New Playlist Create New Playlist @@ -156,82 +156,82 @@ Analyze entire Playlist - + Enter new name for playlist: Enter new name for playlist: - + Duplicate Playlist Duplicate Playlist - - + + Enter name for new playlist: Enter name for new playlist: - + Export Playlist Export Playlist - + Rename Playlist Rename Playlist - - + + Renaming Playlist Failed Renaming Playlist Failed - - - + + + A playlist by that name already exists. A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Playlist Creation Failed - - + + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Couldn't load track. @@ -2768,7 +2768,7 @@ - + Lock Lock @@ -2793,7 +2793,7 @@ Auto DJ Track Source - + Enter new name for crate: Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate Export Crate - + Unlock Unlock - + An unknown error occurred while creating crate: An unknown error occurred while creating crate: - + Rename Crate Rename Crate - - + + Renaming Crate Failed Renaming Crate Failed - + Crate Creation Failed Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2862,12 +2862,12 @@ Crates let you organize your music however you'd like! - + A crate cannot have a blank name. A crate cannot have a blank name. - + A crate by that name already exists. A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Enter name for new crate: - - + + Creating Crate Failed Creating Crate Failed - + A crate cannot have a blank name. A crate cannot have a blank name. - - + + A crate by that name already exists. A crate by that name already exists. - - + + An unknown error occurred while creating crate: An unknown error occurred while creating crate: - + copy [noun] copy - + Duplicate Crate Duplicate Crate - - - + + + Duplicating Crate Failed Duplicating Crate Failed @@ -5615,7 +5615,7 @@ DlgPrefRecord - + Choose recordings directory Choose recordings directory @@ -5832,113 +5832,113 @@ DlgPrefSound - + None None - + %1 Hz %1 Hz - + Default (long delay) Default (long delay) - + Experimental (no delay) Experimental (no delay) - + Disabled (short delay) Disabled (short delay) - + Soundcard Clock Soundcard Clock - + Network Clock Network Clock - + Master output only Master output only - + Master and booth outputs Master and booth outputs - + Direct monitor (recording and broadcasting only) Direct monitor (recording and broadcasting only) - + Disabled Disabled - + Enabled Enabled - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. Refer to the Mixxx User Manual for details. - + Configured latency has changed. Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Configuration error @@ -7414,15 +7414,31 @@ LibraryFeature - + Import Playlist Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + Overwrite File? + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + LibraryScannerDlg @@ -7714,39 +7730,39 @@ The selected skin cannot be loaded. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirm Exit - + A deck is currently playing. Exit Mixxx? A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. The preferences window is still open. - + Discard any changes and exit Mixxx? Discard any changes and exit Mixxx? @@ -7825,7 +7841,7 @@ - + Playlists Playlists @@ -7835,27 +7851,27 @@ Unlock - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Create New Playlist @@ -9353,7 +9369,7 @@ - + History History @@ -9368,22 +9384,22 @@ Lock - + The history section automatically keeps a list of tracks you play in your DJ sets. The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9573,23 +9589,23 @@ SoundManager - - + + a device a device - + An unknown error occurred An unknown error occurred - + Two outputs cannot share channels on "%1" Two outputs cannot share channels on "%1" - + Error opening "%1" Error opening "%1" @@ -11775,12 +11791,12 @@ TrackCollection - + Hiding tracks Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12577,68 +12593,68 @@ ESC - + Remove Remove - + Remove from Playlist Remove from Playlist - + Remove from Crate Remove from Crate - + Hide from Library Hide from Library - + Unhide from Library Unhide from Library - + Purge from Library Purge from Library - + Properties Properties - + Open in File Browser Open in File Browser - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Create New Playlist - + Create New Crate Create New Crate - + Enter name for new playlist: Enter name for new playlist: @@ -12668,144 +12684,144 @@ Change BPM - + Add to Auto DJ Queue (Bottom) Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) Add to Auto DJ Queue (Replace) - + Import From File Tags Import From File Tags - + Import From MusicBrainz Import From MusicBrainz - + Export To File Tags Export To File Tags - + Preview Deck Preview Deck - + BPM and Beatgrid BPM and Beatgrid - + Play Count Play Count - + Cue Point Cue Point - + Hotcues Hotcues - + Loop Loop - + ReplayGain ReplayGain - + Waveform Waveform - + All All - + Deck %1 Deck %1 - + New Playlist New Playlist - - - + + + Playlist Creation Failed Playlist Creation Failed - + A playlist by that name already exists. A playlist by that name already exists. - + A playlist cannot have a blank name. A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: An unknown error occurred while creating playlist: - + Lock BPM Lock BPM - + Unlock BPM Unlock BPM - + Double BPM Double BPM - + Halve BPM Halve BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_eo.ts mixxx-2.2.4~dfsg/res/translations/mixxx_eo.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_eo.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_eo.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Aŭtomata DĴ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Oni ne povis ŝargi la kanton. @@ -2766,7 +2766,7 @@ - + Lock Ŝlosi @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock Malŝlosi - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importi ludliston - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Malŝlosi - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Ŝlosi - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Forigi - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Propraĵoj - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_es-ES.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_es-ES.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_es-ES.ts mixxx-2.2.4~dfsg/res/translations/mixxx_es-ES.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_es-ES.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_es-ES.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Usar cajón como fuente de pistas @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -110,7 +110,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -156,82 +156,82 @@ Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - + Export Playlist Exportar lista de reproducción - + Rename Playlist Renombrar lista de reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - - - + + + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + _copy [noun] Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -2410,7 +2410,7 @@ Quick Effect Enable Button - + Activación de efecto rápido @@ -2430,7 +2430,7 @@ Toggle effect unit between D/W and D+W modes - + Alternar control de efectos entre los modos D/W y D+W @@ -2768,7 +2768,7 @@ - + Lock Bloquear @@ -2793,7 +2793,7 @@ Fuente de pistas para Auto DJ - + Enter new name for crate: Escriba un nuevo nombre para el cajón: @@ -2811,38 +2811,38 @@ - + Export Crate Exportar cajón - + Unlock Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: - + Rename Crate Renombrar cajón - - + + Renaming Crate Failed No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -2862,12 +2862,12 @@ Los cajones permiten organizar tu música como tu quieras! - + A crate cannot have a blank name. Los cajones no pueden carecer de nombre. - + A crate by that name already exists. Ya existe un cajón con ese nombre. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Escriba un nombre para el cajón: - - + + Creating Crate Failed No se pudo crear el cajón - + A crate cannot have a blank name. Los cajones no pueden carecer de nombre. - - + + A crate by that name already exists. Ya existe un cajón con ese nombre. - - + + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: - + copy [noun] copia - + Duplicate Crate Duplicar Cajón - - - + + + Duplicating Crate Failed La copia del cajón ha fallado @@ -5615,7 +5615,7 @@ DlgPrefRecord - + Choose recordings directory Elegir la carpeta para las grabaciones @@ -5832,113 +5832,113 @@ DlgPrefSound - + None Ningún - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Master output only Solo salida maestra - + Master and booth outputs Salidas maestra y de cabina - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7414,15 +7414,28 @@ LibraryFeature - + Import Playlist Importar lista de reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7714,39 +7727,39 @@ No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -7825,7 +7838,7 @@ - + Playlists Listas de reproducción @@ -7835,27 +7848,27 @@ Desbloquear - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Las listas de reproducción son listas ordenadas de canciones que te permiten planear tus sesiones de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Puede ser necesario saltar algunas canciones de la lista de reproducción o agregar otras diferentes para mantener la energía de la audiencia. - + Create New Playlist Crear nueva lista de reproducción @@ -9353,7 +9366,7 @@ - + History Historial @@ -9368,22 +9381,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. La sección de historial mantiene automáticamente una lista de las pistas que reproduce en sus sesiones. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Esto es útil para recordar lo que funcionó bien en sus sesiones, publicar la lista de canciones de sus sesiones, o informar a los organismos de concesión de licencias sobre que canciones ha reproducido. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada vez que ejecutas Mixxx, se crea una nueva sección en el historial. Puede exportar cada una de estas secciones como una lista de reproducción en varios formatos o reproducirla nuevamente con Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Puede unir la actual sesión de historial con una anterior, haciendo clic derecho y seleccionando "Unir con anterior". @@ -9573,23 +9586,23 @@ SoundManager - - + + a device un dispositivo - + An unknown error occurred Ocurrió un error desconocido - + Two outputs cannot share channels on "%1" Dos salidas no pueden usar los mismos canales de %1 - + Error opening "%1" Error al abrir "%1" @@ -11773,12 +11786,12 @@ TrackCollection - + Hiding tracks Escondiendo las pistas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Las pistas seleccionadas se encuentran en estas listas:%1Al esconderlas, se quitarán de dichas listas. Desea continuar? @@ -12575,68 +12588,68 @@ ESC - + Remove Quitar - + Remove from Playlist Eliminar de la lista de reproducción - + Remove from Crate Eliminar de la caja - + Hide from Library Ocultar de la biblioteca - + Unhide from Library Volver a mostrar en la biblioteca - + Purge from Library Eliminar de la biblioteca - + Properties Propiedades - + Open in File Browser Abrir en el explorador de archivos - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crear nueva lista de reproducción - + Create New Crate Crear un nuevo cajón - + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: @@ -12666,144 +12679,144 @@ Cambiar BPM - + Add to Auto DJ Queue (Bottom) Añadir a la cola de DJ automático (al final) - + Add to Auto DJ Queue (Top) Añadir a la cola de DJ automático (al principio) - + Add to Auto DJ Queue (Replace) Añadir a la cola de DJ automático (reemplazar) - + Import From File Tags Importar de los metadatos del fichero - + Import From MusicBrainz Importar de MusicBrainz - + Export To File Tags Exportar a metadatos del fichero - + Preview Deck Reproductor de preescucha - + BPM and Beatgrid BPM y cuadrícula de tempo - + Play Count Reproducciones - + Cue Point Punto CUE - + Hotcues Hotcues - + Loop Bucle - + ReplayGain Ganancia de reproducción - + Waveform Forma de onda - + All Todos - + Deck %1 Plato %1 - + New Playlist Nueva lista de reproducción - - - + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Lock BPM Bloquear BPM - + Unlock BPM Desbloquear BPM - + Double BPM Duplicar BPM - + Halve BPM Reducir a la mitad los BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Reproductor de muestras %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_es-MX.ts mixxx-2.2.4~dfsg/res/translations/mixxx_es-MX.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_es-MX.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_es-MX.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ Automatico - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -108,7 +108,7 @@ - + Create New Playlist Crear una nueva lista de reproducción @@ -154,82 +154,82 @@ Analizar toda la lista de reproducción - + Enter new name for playlist: Introducir nuevo nombre de Lista de Repoducción - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Introducir nuevo nombre de lista de reproducción - + Export Playlist Exportar lista de reproducción - + Rename Playlist Renombrar Lista de Reproducción - - + + Renaming Playlist Failed Renombrando lista de reproducción fallida - - - + + + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - - - + + + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + _copy [noun] Appendix to default name when duplicating a playlist Copiar - - - - - - + + + + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - - + + An unknown error occurred while creating playlist: Un error desconocido ocurrio mientras la creacion de la lista de reproducción - + M3U Playlist (*.m3u) Lista de Reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -366,7 +366,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se puede cargar la pista @@ -2767,7 +2767,7 @@ - + Lock Bloquear @@ -2792,7 +2792,7 @@ - + Enter new name for crate: @@ -2810,38 +2810,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2862,12 +2862,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Habilitado - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist Importar Lista de Reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists @@ -7786,27 +7799,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Crear una nueva lista de reproducción @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11691,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12493,68 +12506,68 @@ - + Remove Quitar - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Crear una nueva lista de reproducción - + Create New Crate - + Enter name for new playlist: Introducir nuevo nombre de lista de reproducción @@ -12584,144 +12597,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain Reproducir otra vez - + Waveform - + All - + Deck %1 - + New Playlist Nueva lista de reproducción - - - + + + Playlist Creation Failed Fallo la creación de lista de Reproducción - + A playlist by that name already exists. Una lista de reproducción ya existe con el mismo nombre - + A playlist cannot have a blank name. El nombre de una lista de reproduccion no puede estar vacío - + An unknown error occurred while creating playlist: Un error desconocido ocurrio mientras la creacion de la lista de reproducción - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_es.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_es.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_es.ts mixxx-2.2.4~dfsg/res/translations/mixxx_es.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_es.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_es.ts 2020-05-15 21:26:10.000000000 +0000 @@ -21,7 +21,7 @@ Crates - Cajones + Cajas @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Usar cajón como fuente de pistas @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nueva lista de reproducción @@ -110,7 +110,7 @@ - + Create New Playlist Crear nueva lista de reproducción @@ -156,82 +156,82 @@ Analizar toda la lista de reproducción - + Enter new name for playlist: Escriba un nuevo nombre para la lista de reproducción: - + Duplicate Playlist Duplicar lista de reproducción - - + + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: - + Export Playlist Exportar lista de reproducción - + Rename Playlist Renombrar lista de reproducción - - + + Renaming Playlist Failed Ha fallado el renombrado de la lista de reproducción - - - + + + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - - - + + + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + _copy [noun] Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - - + + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + M3U Playlist (*.m3u) Lista de reproducción M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. No se ha podido cargar la pista. @@ -2057,12 +2057,12 @@ Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + toca para sincronizar el tempo (y fase con cuantización habilitada) mantenga para sincronizar permanentemente One-time beat sync tempo (and phase with quantize enabled) - + toque para sincronizar solo una vez (el tempo y fase) @@ -2768,7 +2768,7 @@ - + Lock Bloquear @@ -2793,7 +2793,7 @@ Fuente de pistas para Auto DJ - + Enter new name for crate: Escriba un nuevo nombre para el cajón: @@ -2811,38 +2811,38 @@ - + Export Crate Exportar cajón - + Unlock Desbloquear - + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: - + Rename Crate Renombrar cajón - - + + Renaming Crate Failed No se pudo renombrar el cajón - + Crate Creation Failed Falló la creación del cajón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reproducción M3U (*.m3u);;Lista de reproducción M3U8 (*.m3u8);;Lista de reproducción PLS (*.pls);;Texto CSV (*.csv);;Texto legible (*.txt) @@ -2862,12 +2862,12 @@ Los cajones permiten organizar tu música como tu quieras! - + A crate cannot have a blank name. Los cajones no pueden carecer de nombre. - + A crate by that name already exists. Ya existe un cajón con ese nombre. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Escriba un nombre para el cajón: - - + + Creating Crate Failed No se pudo crear el cajón - + A crate cannot have a blank name. Los cajones no pueden carecer de nombre. - - + + A crate by that name already exists. Ya existe un cajón con ese nombre. - - + + An unknown error occurred while creating crate: Ocurrió un error desconocido al crear el cajón: - + copy [noun] copia - + Duplicate Crate Duplicar Cajón - - - + + + Duplicating Crate Failed La copia del cajón ha fallado @@ -5615,7 +5615,7 @@ DlgPrefRecord - + Choose recordings directory Elegir la carpeta para las grabaciones @@ -5832,113 +5832,113 @@ DlgPrefSound - + None Ningún - + %1 Hz %1 Hz - + Default (long delay) Por Defecto (mas retardo) - + Experimental (no delay) Experimental (sin retardo) - + Disabled (short delay) Desactivado (poco retardo) - + Soundcard Clock Reloj de la tarjeta de sonido - + Network Clock Reloj de red - + Master output only Solo salida maestra - + Master and booth outputs Salidas maestra y de cabina - + Direct monitor (recording and broadcasting only) Monitorización directa (solo grabación y emisión en vivo) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. La entrada de micrófono está desincronizada respecto la grabación y emisión comparado con la señal que se oye. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mide la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - - + + Refer to the Mixxx User Manual for details. Para más detalles, lea el manual de usuario de Mixxx. - + Configured latency has changed. La latencia configurada ha cambiado. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Vuelve a medir la latencia total e introducela en la Compensacion de latencia del micrófono para sincronizar el micrófono. - + Realtime scheduling is enabled. La planificación en Tiempo Real está activada. - + %1 ms %1 ms - + Configuration error Error de configuración @@ -7414,15 +7414,28 @@ LibraryFeature - + Import Playlist Importar lista de reproducción - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Archivos de lista de reproducción (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7714,39 +7727,39 @@ No se ha podido cargar la apariencia seleccionada. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar salida - + A deck is currently playing. Exit Mixxx? Un plato está reproduciendo. ¿Salir de Mixxx? - + A sampler is currently playing. Exit Mixxx? Un reproductor de muestras está en reproducción. ¿Salir de Mixxx? - + The preferences window is still open. La ventana de preferencias todavía está abierta. - + Discard any changes and exit Mixxx? ¿Descartar cambios y salir de Mixxx? @@ -7825,7 +7838,7 @@ - + Playlists Listas de reproducción @@ -7835,27 +7848,27 @@ Desbloquear - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Las listas de reproducción son listas ordenadas de canciones que te permiten planear tus sesiones de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algunos DJ preparan listas de reproducción antes de tocar en vivo, pero otros prefieren hacerlo en el momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cuando uses una lista de reproducción en una actuación en vivo, recuerda siempre prestar mucha atención a cómo reacciona la audiencia con la música que has elegido reproducir. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Puede ser necesario saltar algunas canciones de la lista de reproducción o agregar otras diferentes para mantener la energía de la audiencia. - + Create New Playlist Crear nueva lista de reproducción @@ -9353,7 +9366,7 @@ - + History Historial @@ -9368,22 +9381,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. La sección de historial mantiene automáticamente una lista de las pistas que reproduce en sus sesiones. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Esto es útil para recordar lo que funcionó bien en sus sesiones, publicar la lista de canciones de sus sesiones, o informar a los organismos de concesión de licencias sobre que canciones ha reproducido. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada vez que ejecutas Mixxx, se crea una nueva sección en el historial. Puede exportar cada una de estas secciones como una lista de reproducción en varios formatos o reproducirla nuevamente con Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Puede unir la actual sesión de historial con una anterior, haciendo clic derecho y seleccionando "Unir con anterior". @@ -9573,23 +9586,23 @@ SoundManager - - + + a device un dispositivo - + An unknown error occurred Ocurrió un error desconocido - + Two outputs cannot share channels on "%1" Dos salidas no pueden usar los mismos canales de %1 - + Error opening "%1" Error al abrir "%1" @@ -11773,12 +11786,12 @@ TrackCollection - + Hiding tracks Escondiendo las pistas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Las pistas seleccionadas se encuentran en estas listas:%1Al esconderlas, se quitarán de dichas listas. Desea continuar? @@ -12575,68 +12588,68 @@ ESC - + Remove Quitar - + Remove from Playlist Quitar de la lista de reproducción - + Remove from Crate - + Hide from Library Ocultar de la biblioteca - + Unhide from Library Volver a mostrar en la biblioteca - + Purge from Library Eliminar de la biblioteca - + Properties Propiedades - + Open in File Browser Abrir en el explorador de archivos - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crear nueva lista de reproducción - + Create New Crate Crear un nuevo cajón - + Enter name for new playlist: Escriba un nombre para la nueva lista de reproducción: @@ -12666,144 +12679,144 @@ Cambiar el BPM - + Add to Auto DJ Queue (Bottom) Añadir a la cola de DJ automático (al final) - + Add to Auto DJ Queue (Top) Añadir a la cola de DJ automático (al principio) - + Add to Auto DJ Queue (Replace) Añadir a la cola de DJ automático (reemplazar) - + Import From File Tags Importar de los metadatos del fichero - + Import From MusicBrainz Importar de MusicBrainz - + Export To File Tags Exportar a metadatos del fichero - + Preview Deck Reproductor de preescucha - + BPM and Beatgrid BPM y cuadrícula de tempo - + Play Count Reproducciones - + Cue Point Punto CUE - + Hotcues Hotcues - + Loop Bucle - + ReplayGain Ganancia de reproducción - + Waveform Forma de onda - + All Todos - + Deck %1 Plato %1 - + New Playlist Nueva lista de reproducción - - - + + + Playlist Creation Failed Ha fallado la creación de la lista de reproducción - + A playlist by that name already exists. Ya existe una lista de reproducción con ese nombre. - + A playlist cannot have a blank name. El nombre de la lista de reproducción no puede quedar en blanco. - + An unknown error occurred while creating playlist: Se ha producido un error desconocido al crear la lista de reproducción: - + Lock BPM Bloquear BPM - + Unlock BPM Desbloquear BPM - + Double BPM Duplicar BPM - + Halve BPM Reducir a la mitad los BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Reproductor de muestras %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_et.ts mixxx-2.2.4~dfsg/res/translations/mixxx_et.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_et.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_et.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Automaatne DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Uus esitusnimekiri @@ -108,7 +108,7 @@ - + Create New Playlist Loo uus esitusloend @@ -154,82 +154,82 @@ Analüüsi terve esitusloend - + Enter new name for playlist: Sisesta uus nimi esitusloendile: - + Duplicate Playlist - - + + Enter name for new playlist: Sisesta uue esitusloendi nimi: - + Export Playlist Ekspordi esitusloend - + Rename Playlist Muuda esitusloendi nime - - + + Renaming Playlist Failed Esitusloendi ümbernimetamine nurjus - - - + + + A playlist by that name already exists. Selle nimega esitusloend juba eksisteerib. - - - + + + A playlist cannot have a blank name. Esitusloend ei saa olla nimeta. - + _copy [noun] Appendix to default name when duplicating a playlist _kopeeri - - - - - - + + + + + + Playlist Creation Failed Esitusloendi loomine nurjus - - + + An unknown error occurred while creating playlist: Teadmatu viga tekkis esitusloendi tegemisel: - + M3U Playlist (*.m3u) M3U Esitusloend (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Esitusloend (*.m3u);;M3U8 Esitusloend (*.m3u8);;PLSEsitusloend (*.pls);;Tekst CSV (*.csv);;Loetav tekst (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ei suuda lugu laadida. @@ -2766,7 +2766,7 @@ - + Lock Lukus @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Ekspordi kast - + Unlock Võta lukust lahti - + An unknown error occurred while creating crate: Plaadikasti loomisel esines tundmatu viga: - + Rename Crate Nimeta plaadikast ümber - - + + Renaming Crate Failed Plaadikasti ümbernimetamine ebaõnnestus - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Esitusloend (*.m3u);;M3U8 Esitusloend (*.m3u8);;PLSEsitusloend (*.pls);;Tekst CSV (*.csv);;Loetav tekst (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Plaadikasti nimi ei saa olla tühi. - + A crate by that name already exists. Sellise nimega kast on juba olemas. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Kasti loomine ebaõnnestus - + A crate cannot have a blank name. Plaadikasti nimi ei saa olla tühi. - - + + A crate by that name already exists. Sellise nimega kast on juba olemas. - - + + An unknown error occurred while creating crate: Plaadikasti loomisel esines tundmatu viga: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Pole - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Lubatud - + Stereo Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Seadistamise viga @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Impordi esitusloend - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Esitusloendi failid (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Kinnita väljumine - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists Esitusloendid @@ -7784,27 +7797,27 @@ Võta lukust lahti - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Loo uus esitusloend @@ -9269,7 +9282,7 @@ - + History Ajalugu @@ -9284,22 +9297,22 @@ Lukus - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred Esines tundmatu tõrge - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Eemalda - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Seaded - + Open in File Browser Ava failisirvias - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Loo uus esitusloend - + Create New Crate - + Enter name for new playlist: Sisesta uue esitusloendi nimi: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All Kõik - + Deck %1 Rada %1 - + New Playlist Uus esitusnimekiri - - - + + + Playlist Creation Failed Esitusloendi loomine nurjus - + A playlist by that name already exists. Selle nimega esitusloend juba eksisteerib. - + A playlist cannot have a blank name. Esitusloend ei saa olla nimeta. - + An unknown error occurred while creating playlist: Teadmatu viga tekkis esitusloendi tegemisel: - + Lock BPM Lukusta BPM - + Unlock BPM Eemalda BMP lukk - + Double BPM Topelt BPM - + Halve BPM Pool BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_eu.ts mixxx-2.2.4~dfsg/res/translations/mixxx_eu.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_eu.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_eu.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Erreprodukzio-zerrenda berria @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist Bikoiztu erreprodukzio-zerrenda - - + + Enter name for new playlist: - + Export Playlist Esportatu erreprodukzio-zerrenda - + Rename Playlist Berrizendatu erreprodukzio-zerrenda - - + + Renaming Playlist Failed Ezin izan da erreprodukzio-zerrenda berrizendatu - - - + + + A playlist by that name already exists. Badago izen bereko beste erreproduzkio-zerrenda bat - - - + + + A playlist cannot have a blank name. Erreprodukzio-Zerrenda batek ezin du izen hutsik izan - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Ezin izan da erreprodukzio-zerrenda sortu - - + + An unknown error occurred while creating playlist: Errore ezezagun bat gertatu da erreprodukzio zerrenda sortzean: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U erreprodukzio-zerrenda (*.m3u);;M3U8 erreprodukzio-zerrenda (*.m3u8);;PLS erreprodukzio-zerrenda (*.pls);;CSV testua (*.csv);;Testu hutsa (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ezin izan da pista kargatu @@ -2766,7 +2766,7 @@ - + Lock Blokeatu @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Esportatu kaxa - + Unlock Desblokeatu - + An unknown error occurred while creating crate: Errore ezezagun bat gertatu da kaxa sortzean: - + Rename Crate Berrizendatu kaxa - - + + Renaming Crate Failed Ezin inan da kaxa berrizendatu - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U erreprodukzio-zerrenda (*.m3u);;M3U8 erreprodukzio-zerrenda (*.m3u8);;PLS erreprodukzio-zerrenda (*.pls);;CSV testua (*.csv);;Testu hutsa (*.txt) @@ -2860,12 +2860,12 @@ Kaxak zure musika nahieran antolatzea baimentzen dizute! - + A crate cannot have a blank name. Kaxa batek ezin du izena hutsik izan - + A crate by that name already exists. Izen hori duen beste kaxa bat bada @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Ezin izan da kaxa sortu - + A crate cannot have a blank name. Kaxa batek ezin du izena hutsik izan - - + + A crate by that name already exists. Izen hori duen beste kaxa bat bada - - + + An unknown error occurred while creating crate: Errore ezezagun bat gertatu da kaxa sortzean: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Bat ere ez - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Gaitua - + Stereo Estereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Konfigurazio-errorea @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Inportatu erreprodukzio-zerrenda - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Erreprodukzio-zerrenda fitxategiak (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Irtetzea konfirmatu - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7775,7 +7788,7 @@ - + Playlists Erreprodukzio-zerrendak @@ -7785,27 +7798,27 @@ Desblokeatu - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9270,7 +9283,7 @@ - + History Historia @@ -9285,22 +9298,22 @@ Blokeatu - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9490,23 +9503,23 @@ SoundManager - - + + a device - + An unknown error occurred Errore ezezaguna gertatu da - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11690,12 +11703,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12492,68 +12505,68 @@ - + Remove Kendu - + Remove from Playlist - + Remove from Crate - + Hide from Library Liburutegitik ezkutatu - + Unhide from Library Liburutegitik ezkutatzeari utzi - + Purge from Library Kendu liburutegitik - + Properties Propietateak - + Open in File Browser Ireki fitxategi kudeatzailean - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12583,144 +12596,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcue - + Loop - + ReplayGain - + Waveform - + All Guztiak - + Deck %1 - + New Playlist Erreprodukzio-zerrenda berria - - - + + + Playlist Creation Failed Ezin izan da erreprodukzio-zerrenda sortu - + A playlist by that name already exists. Badago izen bereko beste erreproduzkio-zerrenda bat - + A playlist cannot have a blank name. Erreprodukzio-Zerrenda batek ezin du izen hutsik izan - + An unknown error occurred while creating playlist: Errore ezezagun bat gertatu da erreprodukzio zerrenda sortzean: - + Lock BPM - + Unlock BPM - + Double BPM Bikoiztu BPMa - + Halve BPM Erdibitu BPMa - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_fa.ts mixxx-2.2.4~dfsg/res/translations/mixxx_fa.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_fa.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_fa.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ دی‌جی خودکار - + Add Crate as Track Source افزودن کلکسیون @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist فهرست‌پخش جدید @@ -108,7 +108,7 @@ - + Create New Playlist ساخت فهرست پخش جدید @@ -154,82 +154,82 @@ تحلیل فهرست‌پخش جاری - + Enter new name for playlist: نام جدید برای فهرست‌پخش - + Duplicate Playlist کپی همسان از فهرست‌پخش - - + + Enter name for new playlist: نام جدید برای فهرست‌پخش - + Export Playlist برون ریزی فهرست پخش - + Rename Playlist نام‌گذاری دوباره فهرست‌پخش - - + + Renaming Playlist Failed خطا در نام‌گذاری فهرست‌پخش - - - + + + A playlist by that name already exists. فهرست‌پخشی با این نام از پیش موجود است. - - - + + + A playlist cannot have a blank name. فهرست‌پخش نمیتواند بدون نام باشد - + _copy [noun] Appendix to default name when duplicating a playlist کپی - - - - - - + + + + + + Playlist Creation Failed خطا در ایجاد فهرست‌پخش - - + + An unknown error occurred while creating playlist: خطایی ناشناخته در هنگام تولید فهرست‌پخش رخ داده است : - + M3U Playlist (*.m3u) فهرست پخش M3U (فایل .m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U فهرست‌پخش (*.m3u);;M3U8 فهرست‌پخش (*.m3u8);;PLS فهرست‌پخش (*.pls);;Text CSV (*.csv);; متن قابل خواندن (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. بارگزاری قطعه امکان‌پذیر نیست. @@ -2766,7 +2766,7 @@ - + Lock قفل @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock بازکردن قفل - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U فهرست‌پخش (*.m3u);;M3U8 فهرست‌پخش (*.m3u8);;PLS فهرست‌پخش (*.pls);;Text CSV (*.csv);; متن قابل خواندن (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None هیچکدام - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled فعال‌شده - + Stereo استریو - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error خطای پیکربندی @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist درون ریزی فهرست‌پخش - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) نوع فایل فهرست‌پخش (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists فهرست‌های پخش @@ -7784,27 +7797,27 @@ بازکردن قفل - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist ساخت فهرست پخش جدید @@ -9269,7 +9282,7 @@ - + History پیشینه @@ -9284,22 +9297,22 @@ قفل - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred یک خطای ناشناخته رخ داد - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ خروج - + Remove حذف - + Remove from Playlist - + Remove from Crate - + Hide from Library از کتابخانه پنهان کن - + Unhide from Library ظاهر سازی در کتابخانه - + Purge from Library پاکسازی کتابخانه - + Properties مشخصات - + Open in File Browser بازکردن در ... - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist ساخت فهرست پخش جدید - + Create New Crate - + Enter name for new playlist: نام جدید برای فهرست‌پخش @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All همه - + Deck %1 دک %1 - + New Playlist فهرست‌پخش جدید - - - + + + Playlist Creation Failed خطا در ایجاد فهرست‌پخش - + A playlist by that name already exists. فهرست‌پخشی با این نام از پیش موجود است. - + A playlist cannot have a blank name. فهرست‌پخش نمیتواند بدون نام باشد - + An unknown error occurred while creating playlist: خطایی ناشناخته در هنگام تولید فهرست‌پخش رخ داده است : - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 شبیه ساز %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_fi.ts mixxx-2.2.4~dfsg/res/translations/mixxx_fi.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_fi.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_fi.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto-DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Uusi soittolista @@ -108,7 +108,7 @@ - + Create New Playlist Luo uusi soittolista @@ -154,82 +154,82 @@ - + Enter new name for playlist: Anna uusi nimi soittolistalle - + Duplicate Playlist Duplikoi soittolista - - + + Enter name for new playlist: Anna nimi uudelle soittolistalle - + Export Playlist Vie soittolista - + Rename Playlist Nimeä soittolista uudelleen - - + + Renaming Playlist Failed Soittolistan uudelleennimeäminen epäonnistui - - - + + + A playlist by that name already exists. Samanniminen soittolista on jo olemassa. - - - + + + A playlist cannot have a blank name. Soittolistan nimi ei voi olla tyhjä. - + _copy [noun] Appendix to default name when duplicating a playlist _kopioi - - - - - - + + + + + + Playlist Creation Failed Soittolistan luominen epäonnistui - - + + An unknown error occurred while creating playlist: Soittolistan luonnissa tapahtui tuntematon virhe: - + M3U Playlist (*.m3u) M3U Soittolista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) m3u-soittolista (*.m3u);;m3u8-soittolista (*.m3u8);;pls-soittolista (*.pls);;CSV-tekstitiedosto (*.csv);;Luettava tekstitiedosto (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kappaletta ei voitu ladata. @@ -2766,7 +2766,7 @@ - + Lock Lukitse @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Vie levylaukku - + Unlock Poista lukitus - + An unknown error occurred while creating crate: Levylaukkua tuotaessa tapahtui tuntematon virhe: - + Rename Crate Muuta levylaukun nimeä - - + + Renaming Crate Failed Levylaukun uudelleennimeäminen epäonnistui - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) m3u-soittolista (*.m3u);;m3u8-soittolista (*.m3u8);;pls-soittolista (*.pls);;CSV-tekstitiedosto (*.csv);;Luettava tekstitiedosto (*.txt) @@ -2860,12 +2860,12 @@ Levylaukkujen avulla voit järjestellä musiikkisi kuten haluat! - + A crate cannot have a blank name. Levylaukun nimi ei voi olla tyhjä - + A crate by that name already exists. Samanniminen levylaukku on jo olemassa. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Levylaukun luonti epäonnistui - + A crate cannot have a blank name. Levylaukun nimi ei voi olla tyhjä - - + + A crate by that name already exists. Samanniminen levylaukku on jo olemassa. - - + + An unknown error occurred while creating crate: Levylaukkua tuotaessa tapahtui tuntematon virhe: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5581,7 +5581,7 @@ DlgPrefRecord - + Choose recordings directory Valitse tallennus tiedosto @@ -5796,113 +5796,113 @@ DlgPrefSound - + None Määrittelemätön - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Käytössä - + Stereo Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Virhe asetuksissa @@ -7373,15 +7373,28 @@ LibraryFeature - + Import Playlist Tuo soittolista - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Soittolistan tiedostot (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7669,39 +7682,39 @@ Valittua teemaa ei voi ladata. - + OpenGL Direct Rendering OpenGL -suorapiirto - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Varmista lopetus - + A deck is currently playing. Exit Mixxx? Dekki soittaa kappaletta. Suljetaanko Mixxx? - + A sampler is currently playing. Exit Mixxx? Näytesoitin on käynnissä. Suljetaanko mixxx? - + The preferences window is still open. Määritys-ikkuna on vielä auki. - + Discard any changes and exit Mixxx? Hylkää kaikki muutokset ja sulje Mixxx @@ -7780,7 +7793,7 @@ - + Playlists Soittolistat @@ -7790,27 +7803,27 @@ Poista lukitus - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Soittolistat ovat järjestettyjä kappalelistoja, joiden avulla voit suunnitella DJ-esityksiä. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Jotkut DJ:t luovat soittolistoja ennen esiintymistä, toiset rakentavat soittolistan esityksen aikana. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Käyttäessäsi soittolistaa DJ-esityksen aikana, muista tarkkailla yleisön reaktioita valitsemaasi musiikkiin. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Voit joutua ohittamaan tai vaihtamaan valmistellulla listalla olevia kappaleita, jotta yleisön mielenkiinto säilyy. - + Create New Playlist Luo uusi soittolista @@ -9275,7 +9288,7 @@ - + History Soittohistoria @@ -9290,22 +9303,22 @@ Lukitse - + The history section automatically keeps a list of tracks you play in your DJ sets. Soittohistoria pitää automaattisesti kirjaa kappaleista, joita olet soittanut DJ-esityksissä. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Tämä toiminto auttaa muistamaan hyvin yhteen toimineet kappaleet, julkaisemaan kappaleluetteloita tai raportoimaan soitettuja kappaleita lisensointiorganisaatioille. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Joka kerta kun käynnistät Mixxx:n, uusi historia luodaan. Voit käyttää sitä soittolistana useissa formaateissa tai soittaa sen uudelleen Auto DJ:n avulla. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Voit liittää nykyisen ja aikaisemman soittohistorian kontekstivalikon valinnalla "liitä edelliseen". @@ -9495,23 +9508,23 @@ SoundManager - - + + a device laite - + An unknown error occurred Tapahtui tuntematon virhe - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11695,12 +11708,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12497,68 +12510,68 @@ - + Remove Poista - + Remove from Playlist - + Remove from Crate - + Hide from Library Piilota kirjastosta. - + Unhide from Library Näytä kirjastossa. - + Purge from Library - + Properties Ominaisuudet - + Open in File Browser Avaa tiedostoselain - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Luo uusi soittolista - + Create New Crate - + Enter name for new playlist: Anna nimi uudelle soittolistalle @@ -12588,144 +12601,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Nopea merkki - + Loop - + ReplayGain ReplayGain (toiston voimakkuuden tasoitus) - + Waveform - + All Kaikki - + Deck %1 Dekki %1 - + New Playlist Uusi soittolista - - - + + + Playlist Creation Failed Soittolistan luominen epäonnistui - + A playlist by that name already exists. Samanniminen soittolista on jo olemassa. - + A playlist cannot have a blank name. Soittolistan nimi ei voi olla tyhjä. - + An unknown error occurred while creating playlist: Soittolistan luonnissa tapahtui tuntematon virhe: - + Lock BPM Lukitse BPM - + Unlock BPM Poista BPM-lukitus - + Double BPM Tuplaa BPM - + Halve BPM Puolita BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Näytesoitin %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_fr-FR.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_fr-FR.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_fr-FR.ts mixxx-2.2.4~dfsg/res/translations/mixxx_fr-FR.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_fr-FR.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_fr-FR.ts 2020-05-15 21:26:10.000000000 +0000 @@ -13,7 +13,7 @@ Analyze - + Analyse @@ -21,7 +21,7 @@ Crates - + Caisses @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -45,25 +45,25 @@ Banshee - + Banshee Error loading Banshee database - + Erreur lors du chargement de la banque de données banshee Banshee database file not found at - + La base de données banshee n'est pas trouvée à There was an error loading your Banshee database at - + Il y a eut une erreur pendant le chargement de la base de donnée banshee à @@ -71,167 +71,167 @@ Add to Auto DJ Queue (bottom) - + Ajouter à la file d'attente de l'auto-dj (en dernier) Add to Auto DJ Queue (top) - + Ajouter à la file d'attente de l'auto-dj (en premier) Import Playlist - + Importer une playlist Playlist Creation Failed - + Creation de la playlist échouée An unknown error occurred while creating playlist: - + Une erreur inconnue s'est produite lors de la création de la playlist: BasePlaylistFeature - + New Playlist - + Nouvelle playlist Add to Auto DJ Queue (bottom) - + Ajouter à la file d'attente de l'auto-dj (en dernier) - + Create New Playlist - + Créer une nouvelle playlist Add to Auto DJ Queue (top) - + Ajouter à la file d'attente de l'auto-dj (en premier) Remove - + Enlever Rename - + Renomer Lock - + Verroullier Duplicate - + Dupliquer Import Playlist - + Importer une playlist Export Track Files - + Exporter des fichiers audio Analyze entire Playlist - + Analyser l'entièreté de la playlist - + Enter new name for playlist: - + Entrez un nom pour la playlist - + Duplicate Playlist - + Dupliquer la playlist - - + + Enter name for new playlist: - + Entrez un nom pour la nouvelle playlist - + Export Playlist - + Exporter la playlist - + Rename Playlist - + Renomer la playlist - - + + Renaming Playlist Failed - + Echec pour renommer la playlist - - - + + + A playlist by that name already exists. - + Une playlist utilise déjà ce nom - - - + + + A playlist cannot have a blank name. - + Une playlist ne peut pas avoir de nom vide - + _copy [noun] Appendix to default name when duplicating a playlist - + _copier - - - - - - + + + + + + Playlist Creation Failed - + Creation de la playlist echouée - - + + An unknown error occurred while creating playlist: - + Une erreur inconnue s'est produite lors de la création de la playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) @@ -239,135 +239,135 @@ Played - + Joué Artist - + Artiste Title - + Titre Album - + Album Album Artist - + Artiste de l'album Genre - + Genre Composer - + Compositeur Grouping - + Regroupement Year - + Année Type - + Type Location - + Location Comment - + Commentaire Duration - + Durée Rating - + Note Bitrate - + Qualité audio BPM - + BPM Track # - + Titre # Date Added - + Ajouté au : # - + # Timestamp - + Horodatage Key - + Clé BPM Lock - + BPM Verrouillé Preview - + Prévisualisation Cover Art - + Couverture ReplayGain - + ReplayGain BaseTrackPlayerImpl - + Couldn't load track. - + Impossible de charger la piste. @@ -375,12 +375,12 @@ Action failed - + Action échouée Please enable at least one connection to use Live Broadcasting. - + Veuillez activer au moins une connexion pour utiliser la diffusion en direct. @@ -388,22 +388,23 @@ Can't use secure password storage: keychain access failed. - + Impossible d'utiliser le stockage sécurisé des mots de passe: l'accès au trousseau a échoué. Secure password retrieval unsuccessful: keychain access failed. - + Échec de la récupération du mot de passe sécurisé: l'accès au trousseau a échoué. + Settings error - + Erreur des paramètres <b>Error with settings for '%1':</b><br> - + <b>Erreur avec les paramètres de'%1':</b><br> @@ -411,42 +412,42 @@ Enabled - + Activé Name - + Nom Status - + Status Disconnected - + Déconnecté Connecting... - + Connction... Connected - + Connecté Failed - + Echec Unknown - + Iconnu @@ -454,17 +455,17 @@ Add to Quick Links - + Ajouter au liens rapides Remove from Quick Links - + Enlever des liens rapides Add to Library - + Ajouter à la bibliothèque @@ -514,7 +515,7 @@ Preview - + Prévisualisation @@ -524,87 +525,87 @@ Artist - + Artiste Title - + Titre Album - + Album Track # - + Titre # Year - + Année Genre - + Genre Composer - + Compositeur Comment - + Commentaire Duration - + Durée BPM - + BPM Key - + Clé Type - + Type Bitrate - + Qualité audio ReplayGain - + ReplayGain Location - + Location Album Artist - + Artiste de l'album Grouping - + Regroupement @@ -673,7 +674,7 @@ Title - + Titre @@ -871,7 +872,7 @@ BPM - + BPM @@ -1765,7 +1766,7 @@ Add to Auto DJ Queue (bottom) - + Ajouter à la file d'attente de l'auto-dj (en dernier) @@ -1775,7 +1776,7 @@ Add to Auto DJ Queue (top) - + Ajouter à la file d'attente de l'auto-dj (en premier) @@ -2695,7 +2696,7 @@ Comment - + Commentaire @@ -2743,7 +2744,7 @@ Comment - + Commentaire @@ -2751,7 +2752,7 @@ Remove - + Enlever @@ -2762,23 +2763,23 @@ Rename - + Renomer - + Lock - + Verroullier Export Track Files - + Exporter des fichiers audio Duplicate - + Dupliquer @@ -2791,7 +2792,7 @@ - + Enter new name for crate: @@ -2799,7 +2800,7 @@ Crates - + Caisses @@ -2809,40 +2810,40 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Texte CSV (*.csv);;Texte lisible (*.txt) @@ -2860,12 +2861,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2885,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -2990,7 +2991,7 @@ Analyze - + Analyse @@ -3649,7 +3650,7 @@ Action failed - + Action échouée @@ -3824,7 +3825,7 @@ Genre - + Genre @@ -3844,7 +3845,7 @@ Bitrate - + Qualité audio @@ -3865,7 +3866,7 @@ Type - + Type @@ -4084,7 +4085,7 @@ Enabled - + Activé @@ -4123,7 +4124,7 @@ Remove - + Enlever @@ -5211,7 +5212,7 @@ Remove - + Enlever @@ -5580,7 +5581,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5621,7 +5622,7 @@ Title - + Titre @@ -5631,7 +5632,7 @@ Album - + Album @@ -5795,113 +5796,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Activé - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -6563,24 +6564,24 @@ Year - + Année Title - + Titre Artist - + Artiste Album - + Album @@ -6728,7 +6729,7 @@ BPM - + BPM @@ -6758,52 +6759,52 @@ Track # - + Titre # Album Artist - + Artiste de l'album Composer - + Compositeur Title - + Titre Grouping - + Regroupement Key - + Clé Year - + Année Artist - + Artiste Album - + Album Genre - + Genre @@ -7035,12 +7036,12 @@ Name - + Nom Type - + Type @@ -7372,15 +7373,28 @@ LibraryFeature - + Import Playlist - + Importer une playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7679,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7707,7 +7721,7 @@ Location - + Location @@ -7770,11 +7784,11 @@ Lock - + Verroullier - + Playlists @@ -7784,29 +7798,29 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist - + Créer une nouvelle playlist @@ -8367,7 +8381,7 @@ BPM - + BPM @@ -9269,7 +9283,7 @@ - + History @@ -9281,25 +9295,25 @@ Lock - + Verroullier - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9503,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -9515,7 +9529,7 @@ Name - + Nom @@ -9525,7 +9539,7 @@ Type - + Type @@ -9888,7 +9902,7 @@ Cover Art - + Couverture @@ -10148,7 +10162,7 @@ Key - + Clé @@ -11689,12 +11703,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12482,7 +12496,7 @@ Cover Art - + Couverture @@ -12491,70 +12505,70 @@ - + Remove - + Enlever - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Créer une nouvelle playlist - + Create New Crate - + Enter name for new playlist: - + Entrez un nom pour la nouvelle playlist @@ -12574,7 +12588,7 @@ Crates - + Caisses @@ -12582,144 +12596,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Platine de prévisualisation - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Points de repère - + Loop - + ReplayGain - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - + Nouvelle playlist - - - + + + Playlist Creation Failed - + Creation de la playlist échouée - + A playlist by that name already exists. - + Une playlist utilise déjà ce nom - + A playlist cannot have a blank name. - + Une playlist ne peut pas avoir de nom vide - + An unknown error occurred while creating playlist: - + Une erreur inconnue s'est produite lors de la création de la playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_fr.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_fr.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_fr.ts mixxx-2.2.4~dfsg/res/translations/mixxx_fr.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_fr.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_fr.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Ajouter le bac comme source de pistes @@ -100,7 +100,7 @@ BasePlaylistFeature - + New Playlist Nouvelle liste de lecture @@ -111,7 +111,7 @@ - + Create New Playlist Créer une nouvelle liste de lecture @@ -157,82 +157,82 @@ Analyser la liste de lecture entière - + Enter new name for playlist: Introduisez le nouveau nom de la liste de lecture : - + Duplicate Playlist Dupliquer la liste de lecture - - + + Enter name for new playlist: Entrer le nom de la nouvelle liste de lecture : - + Export Playlist Exporter la liste de lecture - + Rename Playlist Renommer la liste de lecture - - + + Renaming Playlist Failed Échec pour renomer la liste de lecture - - - + + + A playlist by that name already exists. Il existe déjà une liste de lecture avec ce nom - - - + + + A playlist cannot have a blank name. Une liste de lecture ne peut pas être sans nom. - + _copy [noun] Appendix to default name when duplicating a playlist _copie - - - - - - + + + + + + Playlist Creation Failed La création de la liste de lecture a échoué - - + + An unknown error occurred while creating playlist: Une erreur inconnue s'est produite à la création de la liste de lecture : - + M3U Playlist (*.m3u) Liste de lecture M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Liste de lecture M3U (*.m3u);;Liste de lecture M3U8 (*.m3u8);;Liste de lecture PLS (*.pls);;Texte CSV (*.csv);;Texte (*.txt) @@ -368,7 +368,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Impossible de charger la piste. @@ -2769,7 +2769,7 @@ - + Lock Verrouiller @@ -2794,7 +2794,7 @@ Auto DJ Source de piste - + Enter new name for crate: Donnez un nouveau nom au bac : @@ -2812,38 +2812,38 @@ - + Export Crate Export un bac - + Unlock Déverrouiller - + An unknown error occurred while creating crate: Une erreur inconnue s'est produite lors de la création du bac : - + Rename Crate Renommer le bac - - + + Renaming Crate Failed Le renommage du bac a échoué - + Crate Creation Failed Échec de création d'un bac - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Liste de lecture M3U (*.m3u);;Liste de lecture M3U8 (*.m3u8);;Liste de lecture PLS (*.pls);;Texte CSV (*.csv);;Texte (*.txt) @@ -2863,12 +2863,12 @@ Les bacs vous permettent d'organiser votre musique comme vous le souhaitez ! - + A crate cannot have a blank name. Le nom d'un bac ne doit pas être vide. - + A crate by that name already exists. Un bac avec ce nom existe déjà. @@ -2887,50 +2887,50 @@ - + Enter name for new crate: Donnez un nom à votre nouveau bac : - - + + Creating Crate Failed La création du bac a échoué - + A crate cannot have a blank name. Le nom d'un bac ne doit pas être vide. - - + + A crate by that name already exists. Un bac avec ce nom existe déjà. - - + + An unknown error occurred while creating crate: Une erreur inconnue s'est produite lors de la création du bac : - + copy [noun] copie - + Duplicate Crate Dupliquer le bac - - - + + + Duplicating Crate Failed La duplication du bac a échoué @@ -5616,7 +5616,7 @@ DlgPrefRecord - + Choose recordings directory Sélectionnez le répertoire des enregistrements @@ -5833,113 +5833,113 @@ DlgPrefSound - + None Aucune - + %1 Hz %1 Hz - + Default (long delay) Par défaut (délai long) - + Experimental (no delay) Expérimental (sans délai) - + Disabled (short delay) Désactivé (délai court) - + Soundcard Clock Horloge carte son - + Network Clock Horloge réseau - + Master output only Sortie principale seulement - + Master and booth outputs Sorties principale et cabine - + Direct monitor (recording and broadcasting only) Moniteur direct (seulement enregistrement et diffusion) - + Disabled Désactivé - + Enabled Activé - + Stereo Stéréo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Les entrées microphone sont à contretemps dans l'enregistrement et le signal diffusé, comparées à ce que vous entendez. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Mesurer la latence du trajet aller-retour et entrez-la ci-dessus pour la compensation de latence du microphone afin d'aligner la synchronisation du microphone. - - + + Refer to the Mixxx User Manual for details. Se référer au manuel utilisateur de Mixxx pour les détails. - + Configured latency has changed. La latence configurée à changé. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Réinitialisez la latence du trajet aller-retour et entrez-la ci-dessus pour la compensation de latence du microphone afin d'aligner la synchronisation du microphone. - + Realtime scheduling is enabled. La planification en temps réel est activé. - + %1 ms %1 ms - + Configuration error Erreur de configuration @@ -7415,15 +7415,31 @@ LibraryFeature - + Import Playlist Importer une liste de lecture - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Fichiers de liste de lecture (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + Remplacer le fichier ? + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + Un fichier de liste de lecture portant le nom "%1" existe déjà. +L'extension par défaut "m3u" a été ajoutée car aucune n'a été spécifiée. + +Voulez-vous vraiment l'écraser ? + LibraryScannerDlg @@ -7714,39 +7730,39 @@ L'habillage sélectionné ne peut pas être chargé. - + OpenGL Direct Rendering Rendu Direct OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + Le rendu direct n'est pas activé sur votre machine.<br><br> Cela signifie que l'affichage de la forme d'onde sera très<br><b>lent et risque de surcharger votre processeur</b>. Mettez à jour votre<br>configuration pour activer le rendu direct ou désactivez<br>les affichages de forme d'onde dans les préférences de Mixxx en sélectionnant<br>"Vide" comme affichage de forme d'onde dans la section "Interface". - - - + + + Confirm Exit Confirmer la fermeture - + A deck is currently playing. Exit Mixxx? Une platine est actuellement en train de jouer. Quitter Mixxx ? - + A sampler is currently playing. Exit Mixxx? Un échantillonneur est actuellement en train de jouer. Quitter Mixxx ? - + The preferences window is still open. La fenêtre de Préférences est déjà ouverte. - + Discard any changes and exit Mixxx? Abandonner toutes les modifications et quitter Mixxx ? @@ -7825,7 +7841,7 @@ - + Playlists Listes de lecture @@ -7835,27 +7851,27 @@ Déverrouiller - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Les listes de lectures sont des listes ordonnées de morceaux qui vous permettent de planifier vos sessions de mixage. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Certains DJ préparent des listes de lecture avant leurs performances publiques quand d'autres préfèrent les constituer à la volée. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Lorsque vous utilisez des listes de lecture pendant des sessions de mixage, souvenez-vous de porter une attention toute particulière à la façon dont votre public réagit à la musique que vous avez choisie de jouer. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Il peut être parfois nécessaire de sauter quelques morceaux de la liste de lecture que vous avez préparée ou d'ajouter des morceaux différents afin d'entretenir la ferveur de votre public. - + Create New Playlist Créer une nouvelle liste de lecture @@ -9352,7 +9368,7 @@ - + History Historique @@ -9367,22 +9383,22 @@ Verrouiller - + The history section automatically keeps a list of tracks you play in your DJ sets. La section historique conserve automatiquement les listes des pistes que vous jouez durant vos sessions de mixage. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Ceci est pratique pour se remémorer ce qui a marché lors de vos sessions de mixage, publier les listes des sessions, ou communiquer vos diffusions aux organismes de gestion de droits. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. A chaque fois que vous démarrez Mixxx, un nouvel historique de session est créé. Vous pouvez l'exporter en tant que liste de lecture sous différents formats ou les rejouer avec Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Vous pouvez ajouter l'historique de session actuelle avec le précédent en faisant un clic-droit et en sélectionnant "Joindre à la précédente". @@ -9572,23 +9588,23 @@ SoundManager - - + + a device un périphérique - + An unknown error occurred Une erreur inconnue est survenue - + Two outputs cannot share channels on "%1" Deux sorties ne peuvent pas partager les canaux sur "%1" - + Error opening "%1" Erreur à l'ouverture de "%1" @@ -11774,12 +11790,12 @@ TrackCollection - + Hiding tracks Cacher les pistes - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Les pistes sélectionnées sont dans les listes de lecture suivantes : %1En étant cachées, elles seront retirées de ces listes de lecture. Continuer ? @@ -12576,68 +12592,68 @@ Echap - + Remove Supprimer - + Remove from Playlist Enlever de la liste de lecture - + Remove from Crate Ôter du bac - + Hide from Library Masquer dans la bibliothèque - + Unhide from Library Démasquer dans la bibliothèque - + Purge from Library Purger de la bibliothèque - + Properties Propriétés - + Open in File Browser Ouvrir le Navigateur de Fichiers - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Créer une nouvelle liste de lecture - + Create New Crate Créer un nouveau bac - + Enter name for new playlist: Entrer le nom de la nouvelle liste de lecture : @@ -12667,144 +12683,144 @@ Changer le BPM - + Add to Auto DJ Queue (Bottom) Ajouter à la file Auto DJ (fin) - + Add to Auto DJ Queue (Top) Ajouter à la file Auto DJ (début) - + Add to Auto DJ Queue (Replace) Ajouter à la file Auto DJ (remplacer) - + Import From File Tags Importer à partir des tags du fichier - + Import From MusicBrainz Importer à partir de MusicBrainz - + Export To File Tags Exporter vers les tags du fichier - + Preview Deck Platine de pré-écoute - + BPM and Beatgrid BPM et grille rythmique - + Play Count Compteur de lecture. - + Cue Point Point de repère - + Hotcues Repères rapides - + Loop Boucle - + ReplayGain ReplayGain - + Waveform Forme d'onde - + All Tous - + Deck %1 Platine %1 - + New Playlist Nouvelle liste de lecture - - - + + + Playlist Creation Failed La création de la liste de lecture a échoué - + A playlist by that name already exists. Il existe déjà une liste de lecture avec ce nom - + A playlist cannot have a blank name. Une liste de lecture ne peut pas être sans nom. - + An unknown error occurred while creating playlist: Une erreur inconnue s'est produite à la création de la liste de lecture : - + Lock BPM Verrouiller le tempo - + Unlock BPM Déverrouiller le tempo - + Double BPM Doubler le tempo - + Halve BPM Diviser le tempo par deux - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Échantillonneur %1 @@ -12832,12 +12848,12 @@ (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ga.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ga.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ga.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ga.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ Uathoibríoch - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_gl.ts mixxx-2.2.4~dfsg/res/translations/mixxx_gl.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_gl.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_gl.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ automático - + Add Crate as Track Source Engadir caixa como orixe da pista @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nova lista de reprodución @@ -110,7 +110,7 @@ - + Create New Playlist Crear unha nova lista de reprodución @@ -156,82 +156,82 @@ Analizar toda a lista d reprodución - + Enter new name for playlist: Escriba o novo nome para a lista de reprodución - + Duplicate Playlist Duplicar a lista de reprodución - - + + Enter name for new playlist: Escriba o nome para a nova lista de reprodución - + Export Playlist Exportar a lista de reprodución - + Rename Playlist Cambiar o nome da lista de reprodución - - + + Renaming Playlist Failed Produciuse un erro ao cambiarlle o nome a lista de reprodución - - - + + + A playlist by that name already exists. Xa existe unha lista de reprodución con ese nome. - - - + + + A playlist cannot have a blank name. Unha lista de reprodución non pode ter un nome baleiro. - + _copy [noun] Appendix to default name when duplicating a playlist _copia - - - - - - + + + + + + Playlist Creation Failed Non foi posíbel crear a lista de reprodución - - + + An unknown error occurred while creating playlist: Produciuse un erro descoñecido mentres se creaba a lista de reprodución: - + M3U Playlist (*.m3u) Lista de reprodución M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reprodución M3U (*.m3u);;Lista de reprodución M3U8 (*.m3u8);;Lista de reprodución PLS (*.pls);;Texto CSV (*.csv);;Texto lexíbel (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Non foi posíbel cargar a pista. @@ -2768,7 +2768,7 @@ - + Lock Bloquear @@ -2793,7 +2793,7 @@ Orixe das pistas para DJ automático - + Enter new name for crate: Escriba o novo nome para o caixón: @@ -2811,38 +2811,38 @@ - + Export Crate Exportar un caixón - + Unlock Desbloquear - + An unknown error occurred while creating crate: Produciuse un erro descoñecido ao crear o caixón: - + Rename Crate Cambiar o nome do caixón - - + + Renaming Crate Failed Non foi posíbel cambiarlle o nome ao caixón - + Crate Creation Failed Non foi posíbel crear o caixón - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de reprodución M3U (*.m3u);;Lista de reprodución M3U8 (*.m3u8);;Lista de reprodución PLS (*.pls);;Texto CSV (*.csv);;Texto lexíbel (*.txt) @@ -2862,12 +2862,12 @@ Os caixóns permítenlle organizar a súa música ao seu gusto! - + A crate cannot have a blank name. Un caixón non pode ter un nome baleiro. - + A crate by that name already exists. Xa existe un caixón con ese nome. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Escriba o nome para o caixón: - - + + Creating Crate Failed Non foi posíbel crear o caixón - + A crate cannot have a blank name. Un caixón non pode ter un nome baleiro. - - + + A crate by that name already exists. Xa existe un caixón con ese nome. - - + + An unknown error occurred while creating crate: Produciuse un erro descoñecido ao crear o caixón: - + copy [noun] duplica - + Duplicate Crate Duplicar o caixón - - - + + + Duplicating Crate Failed Non foi posíbel duplicar o caixón @@ -5595,7 +5595,7 @@ DlgPrefRecord - + Choose recordings directory Escolla o directorio de gravacións @@ -5812,113 +5812,113 @@ DlgPrefSound - + None Ningún - + %1 Hz %1 Hz - + Default (long delay) Predeterminado (máis retardado) - + Experimental (no delay) Experimental (sen retardo) - + Disabled (short delay) Desactivado (pouco retardo) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Desactivado - + Enabled Activado - + Stereo Estéreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. A planificación en tempo real está activada. - + %1 ms %1 ms - + Configuration error Produciuse un erro de configuración @@ -7392,15 +7392,28 @@ LibraryFeature - + Import Playlist Importar unha lista de reprodución - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Ficheiros de lista de reprodución (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7686,39 +7699,39 @@ Non foi posíbel cargar o tema seleccionado. - + OpenGL Direct Rendering Debuxado directo OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar a saída - + A deck is currently playing. Exit Mixxx? O prato está reproducindo. Saír do Mixxx? - + A sampler is currently playing. Exit Mixxx? Un mostreador está reproducindo actualmente. Saír dp Mixxx? - + The preferences window is still open. A xanela de preferencias segue aberta. - + Discard any changes and exit Mixxx? Desbotar calquera cambio e saír do Mixxx? @@ -7797,7 +7810,7 @@ - + Playlists Listas de reprodución @@ -7807,27 +7820,27 @@ Desbloquear - + Playlists are ordered lists of songs that allow you to plan your DJ sets. As listas de reprodución son listas ordenadas de canción que permítenlle planificar as súas sesións de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Algúns DJ constrúen listas de reprodución antes de actuar en directo, outros prefiren facelo ao voo. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Cando se utiliza unha lista de reprodución durante una sesión de DJ en directo, lembre que debe observar sempre con moita atención como reacciona o público á música que escolleu para reproducir. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. É probábel que sexa necesario saltarse algunhas cancións da lista de reprodución que ten preparada, ou engadir outras diferentes a fin de manter a enerxía no público. - + Create New Playlist Crear unha nova lista de reprodución @@ -9292,7 +9305,7 @@ - + History Historial @@ -9307,22 +9320,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. A sección de historial mantén automaticamente unha lista das pistas reproducidas nas súas sesións de DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Isto é útil para lembrar co que se traballo nas súas sesións de DJ, a publicación das listas de sesión, ou informar das obras reproducidas ás entidades de dereitos de autor. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada vez que inicie Mixxx, crearase unha nova sección de historial. Poderá exportala como unha lista de reprodución en diversos formatos ou reproducila de novo co DJ automático. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Pode xuntar o historial da sesión actual con outro anterior premendo co botón dereito e seleccionar «Xuntar coa anterior». @@ -9512,23 +9525,23 @@ SoundManager - - + + a device un dispositivo - + An unknown error occurred Produciuse un erro descoñecido - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11712,12 +11725,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12514,68 +12527,68 @@ ESC - + Remove Retirar - + Remove from Playlist - + Remove from Crate - + Hide from Library Agachar da fonoteca - + Unhide from Library Amosar da fonoteca - + Purge from Library Purgar da fonoteca - + Properties Propiedades - + Open in File Browser Abrir no navegador de ficheiros - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crear unha nova lista de reprodución - + Create New Crate Crear un novo caixón - + Enter name for new playlist: Escriba o nome para a nova lista de reprodución @@ -12605,144 +12618,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Escoita previa do prato - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Referencias activas - + Loop - + ReplayGain ReplayGain - + Waveform - + All Todas - + Deck %1 Prato %1 - + New Playlist Nova lista de reprodución - - - + + + Playlist Creation Failed Non foi posíbel crear a lista de reprodución - + A playlist by that name already exists. Xa existe unha lista de reprodución con ese nome. - + A playlist cannot have a blank name. Unha lista de reprodución non pode ter un nome baleiro. - + An unknown error occurred while creating playlist: Produciuse un erro descoñecido mentres se creaba a lista de reprodución: - + Lock BPM Bloquear os BPM - + Unlock BPM Desbloquear os BPM - + Double BPM Duplicar os BPM - + Halve BPM Dividir ÷2 os BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Mostreador %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_he-IL.ts mixxx-2.2.4~dfsg/res/translations/mixxx_he-IL.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_he-IL.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_he-IL.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ תקליטן אוטומטי - + Add Crate as Track Source הוסיפו ארגז כמקור בהשמעה @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist רשימת השמעה חדשה @@ -110,7 +110,7 @@ - + Create New Playlist צרו רשימת השמעה חדשה @@ -156,82 +156,82 @@ נתחו את רשימת ההשמעה במלואה - + Enter new name for playlist: רשמו שם חדש עבור רשימת ההשמעה: - + Duplicate Playlist שכפלו את רשימת ההשמעה - - + + Enter name for new playlist: רשמו שם עבור רשימת ההשמעה החדשה: - + Export Playlist ייצאו את רשימת ההשמעה - + Rename Playlist שנו את שם רשימת ההשמעה - - + + Renaming Playlist Failed שינוי השם עבור רשימת ההשמעה כשל - - - + + + A playlist by that name already exists. רשימת השמעה עם שם זה כבר קיימת. - - - + + + A playlist cannot have a blank name. רשימת השמעה אינה יכולה להיות עם שם ריק. - + _copy [noun] Appendix to default name when duplicating a playlist _העתק - - - - - - + + + + + + Playlist Creation Failed יצירת רשימת ההשמעה כשלה - - + + An unknown error occurred while creating playlist: אירעה שגיאה לא ידוע בזמן יצירת רשימת ההשמעה: - + M3U Playlist (*.m3u) רשימת השמעה בתסדיר M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) רשימת השמעה בתסדיר M3U (*.m3u);;רשימת השמעה בתסדיר M3U8 (*.m3u8);;רשימת השמעה בתסדיר PLS (*.pls);;טקסט CSV (*.csv);;טקסט קריא (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. לא הצליח לטעון רצועה @@ -2768,7 +2768,7 @@ - + Lock נעלו @@ -2793,7 +2793,7 @@ - + Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) רשימת השמעה בתסדיר M3U (*.m3u);;רשימת השמעה בתסדיר M3U8 (*.m3u8);;רשימת השמעה בתסדיר PLS (*.pls);;טקסט CSV (*.csv);;טקסט קריא (*.txt) @@ -2862,12 +2862,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist ייבאו רשימת השמעה - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists @@ -7786,27 +7799,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist צרו רשימת השמעה חדשה @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ נעלו - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11691,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12493,68 +12506,68 @@ - + Remove הסירו - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist צרו רשימת השמעה חדשה - + Create New Crate - + Enter name for new playlist: רשמו שם עבור רשימת ההשמעה החדשה: @@ -12584,144 +12597,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain אמפליטודה מנורמלת - + Waveform - + All - + Deck %1 - + New Playlist רשימת השמעה חדשה - - - + + + Playlist Creation Failed יצירת רשימת ההשמעה כשלה - + A playlist by that name already exists. רשימת השמעה עם שם זה כבר קיימת. - + A playlist cannot have a blank name. רשימת השמעה אינה יכולה להיות עם שם ריק. - + An unknown error occurred while creating playlist: אירעה שגיאה לא ידוע בזמן יצירת רשימת ההשמעה: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_he.ts mixxx-2.2.4~dfsg/res/translations/mixxx_he.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_he.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_he.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ תקליטן אוטומטי - + Add Crate as Track Source הוסף תיבה כמקור מעקב @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist רשימת השמעה חדשה @@ -108,7 +108,7 @@ - + Create New Playlist יצירת רשימת השמעה חדשה @@ -154,82 +154,82 @@ נתח רשימת השמעה נכנסת - + Enter new name for playlist: הכנס שם חדש לרשימת השמעה - + Duplicate Playlist שכפל רשימת השמעה - - + + Enter name for new playlist: הכנס שם לרשימת השמעה חדשה - + Export Playlist יצא רשימת השמעה - + Rename Playlist שנה שם רשימת השמעה - - + + Renaming Playlist Failed שינוי שם לרשימת השמעה שנכשלה - - - + + + A playlist by that name already exists. רשימת השמעה בעלת השם הנוכחי כבר קיימת - - - + + + A playlist cannot have a blank name. רשימת השמעה אינה יכולה להיות בעלת שם ריק - + _copy [noun] Appendix to default name when duplicating a playlist העתק - - - - - - + + + + + + Playlist Creation Failed יצירת רשימת השמעה שנכשלה - - + + An unknown error occurred while creating playlist: קרתה תקלה לא ידועה בעת יצירת רשימת השמעה - + M3U Playlist (*.m3u) Mp3 פלייליסט (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U רשימת השמעה (m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt.*) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. לא ניתן לטעון את הרצועה. @@ -2767,7 +2767,7 @@ - + Lock נעל @@ -2792,7 +2792,7 @@ - + Enter new name for crate: @@ -2810,38 +2810,38 @@ - + Export Crate יצא ארגזים - + Unlock שחרור נעילה - + An unknown error occurred while creating crate: התרחשה שגיאה בלתי ידועה בזמן יצירת הארגז: - + Rename Crate שינוי שם הארגז - - + + Renaming Crate Failed שינוי שם הארגז נכשל - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U רשימת השמעה (m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt.*) @@ -2861,12 +2861,12 @@ ארגזים נותנים לך לארגן את המוזיקה שלך איך שאתה רוצה! - + A crate cannot have a blank name. לארגז לא יכול להיות שם ריק. - + A crate by that name already exists. כבר קיים ארגז בשם הזה. @@ -2885,50 +2885,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed יצירת הארגז נכשלה - + A crate cannot have a blank name. לארגז לא יכול להיות שם ריק. - - + + A crate by that name already exists. כבר קיים ארגז בשם הזה. - - + + An unknown error occurred while creating crate: התרחשה שגיאה בלתי ידועה בזמן יצירת הארגז: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5581,7 +5581,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5796,113 +5796,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled לא מתאפשר - + Enabled מתאפשר - + Stereo סטריאו - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7373,15 +7373,28 @@ LibraryFeature - + Import Playlist יבא רשימת השמעה - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) סיומות של רשימת השמעה (m3u *.m3u8 *.pls *.csv.*) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7666,39 +7679,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7775,7 +7788,7 @@ - + Playlists @@ -7785,27 +7798,27 @@ שחרור נעילה - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist יצירת רשימת השמעה חדשה @@ -9270,7 +9283,7 @@ - + History @@ -9285,22 +9298,22 @@ נעל - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9490,23 +9503,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11690,12 +11703,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12492,68 +12505,68 @@ - + Remove הסר - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist יצירת רשימת השמעה חדשה - + Create New Crate - + Enter name for new playlist: הכנס שם לרשימת השמעה חדשה @@ -12583,144 +12596,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues נקודות סימון חמות - + Loop - + ReplayGain רווח חוזר - + Waveform - + All - + Deck %1 משטח %1 - + New Playlist רשימת השמעה חדשה - - - + + + Playlist Creation Failed יצירת רשימת השמעה שנכשלה - + A playlist by that name already exists. רשימת השמעה בעלת השם הנוכחי כבר קיימת - + A playlist cannot have a blank name. רשימת השמעה אינה יכולה להיות בעלת שם ריק - + An unknown error occurred while creating playlist: קרתה תקלה לא ידועה בעת יצירת רשימת השמעה - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 דגימה %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_hr.ts mixxx-2.2.4~dfsg/res/translations/mixxx_hr.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_hr.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_hr.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Automatski DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Novi popis izvođenja @@ -108,7 +108,7 @@ - + Create New Playlist Izradi novu listu izvođenja @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist Duplicirana lista izvođenja - - + + Enter name for new playlist: - + Export Playlist Izvezi popis izvođenja - + Rename Playlist Preimenuj popis izvođenja - - + + Renaming Playlist Failed Neuspjelo preimenovanje popisa izvođenja - - - + + + A playlist by that name already exists. Popis sa tim imenom već postoji - - - + + + A playlist cannot have a blank name. Popis mora sadržavati ime - + _copy [noun] Appendix to default name when duplicating a playlist _kopiraj - - - - - - + + + + + + Playlist Creation Failed Neuspjelo kreiranje liste izvođenja - - + + An unknown error occurred while creating playlist: Nepoznata greška tjekom kreiranja liste izvođenja - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lista (*.m3u);;M3U8 lista (*.m3u8);;PLS lista (*.pls);;Tekst CSV (*.csv);;Čitljivi tekst (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ne može učitati pjesmu @@ -2766,7 +2766,7 @@ - + Lock Zaključaj @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Izvezi spremnik - + Unlock Otključaj - + An unknown error occurred while creating crate: Nepoznata greška pri stvaranju spremnika: - + Rename Crate Preimenuj spremnik - - + + Renaming Crate Failed Neuspjelo preimenovanje spremnika - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lista (*.m3u);;M3U8 lista (*.m3u8);;PLS lista (*.pls);;Tekst CSV (*.csv);;Čitljivi tekst (*.txt) @@ -2860,12 +2860,12 @@ Spremnici vam omogućavaju da organizirate pjesme po želji. - + A crate cannot have a blank name. Spremnik mora imati ime. - + A crate by that name already exists. Spremnik toga imena već postoji. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Neuspjelo kreiranje spremnika - + A crate cannot have a blank name. Spremnik mora imati ime. - - + + A crate by that name already exists. Spremnik toga imena već postoji. - - + + An unknown error occurred while creating crate: Nepoznata greška pri stvaranju spremnika: - + copy [noun] - + Duplicate Crate Dupliciraj spremnik - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Uvezi popis izvođenja - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Datoteke liste izvođenja (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Otključaj - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Izradi novu listu izvođenja @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Zaključaj - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Ukloni - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Izradi novu listu izvođenja - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 Svirač %1 - + New Playlist Novi popis izvođenja - - - + + + Playlist Creation Failed Neuspjelo kreiranje liste izvođenja - + A playlist by that name already exists. Popis sa tim imenom već postoji - + A playlist cannot have a blank name. Popis mora sadržavati ime - + An unknown error occurred while creating playlist: Nepoznata greška tjekom kreiranja liste izvođenja - + Lock BPM Zaključaj BPM - + Unlock BPM Otključaj BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sempler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_hu.ts mixxx-2.2.4~dfsg/res/translations/mixxx_hu.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_hu.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_hu.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Rekesz, mint zene forrás hozzáadása @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Új lejátszólista @@ -110,7 +110,7 @@ - + Create New Playlist Új lejátszólista készítése @@ -156,82 +156,82 @@ Teljes lejátszólista elemzése - + Enter new name for playlist: Add meg a lejátszólista új nevét: - + Duplicate Playlist Lejátszólista másolata - - + + Enter name for new playlist: Add meg az új lejátszólista nevét: - + Export Playlist Lejátszólista exportálása - + Rename Playlist Lejátszólista átnevezése - - + + Renaming Playlist Failed Lejátszólista átnevezése sikertelen - - - + + + A playlist by that name already exists. Egy lejátszólista ezzel a névvel már létezik. - - - + + + A playlist cannot have a blank name. A lejátszólista nem tartalmazhat üres helyet. - + _copy [noun] Appendix to default name when duplicating a playlist _másolás - - - - - - + + + + + + Playlist Creation Failed Lejátszólista készítése sikertelen - - + + An unknown error occurred while creating playlist: Ismeretlen hiba történt a lejátszólista készítésekor: - + M3U Playlist (*.m3u) M3U lejátszási lista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lejátszási lista (*.m3u);;M3U8 lejátszási lista (*.m3u8);;PLS lejátszási lista (*.pls);;Szöveg CSV (*.csv);;Olvasható szöveg (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nem lehet a számot betölteni. @@ -2768,7 +2768,7 @@ - + Lock Zárolás @@ -2793,7 +2793,7 @@ - + Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate Rekesz exportálása - + Unlock Feloldás - + An unknown error occurred while creating crate: Egy ismeretlen hiba lépett fel a rekesz készítése közben: - + Rename Crate Rekesz átnevezése - - + + Renaming Crate Failed Rekesz átnevezése sikertelen - + Crate Creation Failed Rekesz elkészítése sikertelen - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U lejátszási lista (*.m3u);;M3U8 lejátszási lista (*.m3u8);;PLS lejátszási lista (*.pls);;Szöveg CSV (*.csv);;Olvasható szöveg (*.txt) @@ -2862,12 +2862,12 @@ A Rekeszekkel tudod a zenéidet úgy rendszerezni, ahogy szeretnéd! - + A crate cannot have a blank name. Rekesz neve nem lehet üres. - + A crate by that name already exists. Rekesz ezzel a névvel már létezik. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Add meg az új Rekesz nevét: - - + + Creating Crate Failed Rekesz készítése sikertelen - + A crate cannot have a blank name. Rekesz neve nem lehet üres. - - + + A crate by that name already exists. Rekesz ezzel a névvel már létezik. - - + + An unknown error occurred while creating crate: Egy ismeretlen hiba lépett fel a rekesz készítése közben: - + copy [noun] - + Duplicate Crate Duplikált rekesz - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None Nincs - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Letiltva - + Enabled Engedélyezve - + Stereo Sztereó - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist Lejátszólista importálása - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Lejátszólista típusok + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists Lejátszólista @@ -7786,27 +7799,27 @@ Feloldás - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Néhány DJ az élő előadása előtt állít össze lejátszási listákat, míg mások szeretik inkább az előadásuk helyszínén összerakni a sajátjaikat. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Új lejátszólista készítése @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ Zárolás - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11691,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12493,68 +12506,68 @@ - + Remove Eltávolítás - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser Megnyitás fájlkezelőben - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Új lejátszólista készítése - + Create New Crate Új Rekesz készítése - + Enter name for new playlist: Add meg az új lejátszólista nevét: @@ -12584,144 +12597,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain Visszajátszás hangerősítése - + Waveform - + All Mind - + Deck %1 Deck %1 - + New Playlist Új lejátszólista - - - + + + Playlist Creation Failed Lejátszólista készítése sikertelen - + A playlist by that name already exists. Egy lejátszólista ezzel a névvel már létezik. - + A playlist cannot have a blank name. A lejátszólista nem tartalmazhat üres helyet. - + An unknown error occurred while creating playlist: Ismeretlen hiba történt a lejátszólista készítésekor: - + Lock BPM BPM zárolása - + Unlock BPM BPM zárolás feloldása - + Double BPM BPM duplázása - + Halve BPM BPM felezése - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_hy.ts mixxx-2.2.4~dfsg/res/translations/mixxx_hy.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_hy.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_hy.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Ավտո DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Նոր փլեյլիստ @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist Կրկնօրինակել փլեյլիստը - - + + Enter name for new playlist: - + Export Playlist Փլեյլիստի էքսպորտ - + Rename Playlist Վերանվանել փլեյլիստը - - + + Renaming Playlist Failed Վերանվանումը ձախողվեց - - - + + + A playlist by that name already exists. Այս անունով փլեյլիստ արդեն կա - - - + + + A playlist cannot have a blank name. Փլեյլիստը չի կարող ունենալ դատարկ անուն - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Չհաջողվեց ստեղծել փլեյլիստ - - + + An unknown error occurred while creating playlist: Անհայտ սխալ ծագեց փլեյլիստի ստեղծման ժամանակ՝ - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Փլեյլիստ (*.m3u);;M3U8 Փլեյլիստ (*.m3u8);;PLS Փլեյլիստ (*.pls);;Տեքստային CSV (*.csv);;Կարդացվեղ տեքստ (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Չկարողացա բացել երգը @@ -2766,7 +2766,7 @@ - + Lock Լոք @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Փլեյլիստ (*.m3u);;M3U8 Փլեյլիստ (*.m3u8);;PLS Փլեյլիստ (*.pls);;Տեքստային CSV (*.csv);;Կարդացվեղ տեքստ (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Փլեյլիստի իմպորտ - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Փլեյլիստներ (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Լոք - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Ջնջել - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Նոր փլեյլիստ - - - + + + Playlist Creation Failed Չհաջողվեց ստեղծել փլեյլիստ - + A playlist by that name already exists. Այս անունով փլեյլիստ արդեն կա - + A playlist cannot have a blank name. Փլեյլիստը չի կարող ունենալ դատարկ անուն - + An unknown error occurred while creating playlist: Անհայտ սխալ ծագեց փլեյլիստի ստեղծման ժամանակ՝ - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_id.ts mixxx-2.2.4~dfsg/res/translations/mixxx_id.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_id.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_id.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Playlist Baru @@ -108,7 +108,7 @@ - + Create New Playlist Buat Playlist Baru @@ -154,82 +154,82 @@ Analisa Seluruh Playlist - + Enter new name for playlist: Ganti nama baru untuk Playlist ini: - + Duplicate Playlist Duplikasi Playlist - - + + Enter name for new playlist: Masukkan nama baru untuk Playlist ini: - + Export Playlist Ekspor Playlist - + Rename Playlist Ganti Nama Playlist - - + + Renaming Playlist Failed Ganti Nama Playlist Gagal - - - + + + A playlist by that name already exists. Nama playlist tersebut sudah digunakan - - - + + + A playlist cannot have a blank name. Playlist tidak bisa memiliki nama kosong - + _copy [noun] Appendix to default name when duplicating a playlist _salin - - - - - - + + + + + + Playlist Creation Failed Pembuatan Playlist Tidak Berhasil - - + + An unknown error occurred while creating playlist: Kesalahan yang tidak diketahui terjadi saat membuat playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Teks CSV (*.csv);;Teks Terbaca (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Tidak dapat memuat lagu @@ -2766,7 +2766,7 @@ - + Lock Kunci @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Ekspor Peti - + Unlock Buka Kunci - + An unknown error occurred while creating crate: Kesalahan tidak diketahui terjadi saat membuat peti: - + Rename Crate Ubah nama peti - - + + Renaming Crate Failed Penamaan Peti Gagal - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Teks CSV (*.csv);;Teks Terbaca (*.txt) @@ -2860,12 +2860,12 @@ Peti memberi kebebasan Anda mengatur musik seperti yang diinginkan! - + A crate cannot have a blank name. Sebuah peti tidak dapat memiliki nama kosong - + A crate by that name already exists. Sebuah peti dengan nama tersebut sudah ada @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Pembuatan Peti Gagal - + A crate cannot have a blank name. Sebuah peti tidak dapat memiliki nama kosong - - + + A crate by that name already exists. Sebuah peti dengan nama tersebut sudah ada - - + + An unknown error occurred while creating crate: Kesalahan tidak diketahui terjadi saat membuat peti: - + copy [noun] - + Duplicate Crate Duplikat Peti - - - + + + Duplicating Crate Failed @@ -5583,7 +5583,7 @@ DlgPrefRecord - + Choose recordings directory Pilih petunjuk rekaman @@ -5798,113 +5798,113 @@ DlgPrefSound - + None Tidak ada - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7375,15 +7375,28 @@ LibraryFeature - + Import Playlist Impor Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Berkas Daftar putar (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7668,39 +7681,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7777,7 +7790,7 @@ - + Playlists @@ -7787,27 +7800,27 @@ Buka Kunci - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Buat Playlist Baru @@ -9272,7 +9285,7 @@ - + History @@ -9287,22 +9300,22 @@ Kunci - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9492,23 +9505,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11692,12 +11705,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12494,68 +12507,68 @@ - + Remove Hapus - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Pengaturan - + Open in File Browser Buka di Browser Berkas - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Buat Playlist Baru - + Create New Crate - + Enter name for new playlist: Masukkan nama baru untuk Playlist ini: @@ -12585,144 +12598,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Penanda Utama - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 Deck %1 - + New Playlist Playlist Baru - - - + + + Playlist Creation Failed Pembuatan Playlist Tidak Berhasil - + A playlist by that name already exists. Nama playlist tersebut sudah digunakan - + A playlist cannot have a blank name. Playlist tidak bisa memiliki nama kosong - + An unknown error occurred while creating playlist: Kesalahan yang tidak diketahui terjadi saat membuat playlist: - + Lock BPM Kunci DPM - + Unlock BPM Buka Kunci BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_is.ts mixxx-2.2.4~dfsg/res/translations/mixxx_is.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_is.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_is.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Sjálfvirk hljóðblöndun - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Gat ekki opnað lag. @@ -2766,7 +2766,7 @@ - + Lock Læsa @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: Óþekkt villa kom upp við gerð nýs kassa: - + Rename Crate Endurnefna kassa - - + + Renaming Crate Failed Ekki tókst að endurnefna kassa - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Kassi verður að hafa heiti - + A crate by that name already exists. Kassi með þessu nafni er til fyrir @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Ekki tókst að búa til nýjan kassa - + A crate cannot have a blank name. Kassi verður að hafa heiti - - + + A crate by that name already exists. Kassi með þessu nafni er til fyrir - - + + An unknown error occurred while creating crate: Óþekkt villa kom upp við gerð nýs kassa: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Ekkert - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Virkt - + Stereo Víðóma - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Stillingarvilla @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Innfæra lagalista - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Læsa - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device tæki - + An unknown error occurred Óþekkt villa kom upp - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Fjarlægja - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_it.ts mixxx-2.2.4~dfsg/res/translations/mixxx_it.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_it.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_it.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Aggiungi Cesto come sorgente tracce @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nuova Playlist @@ -110,7 +110,7 @@ - + Create New Playlist Crea Nuova Playlist @@ -156,82 +156,82 @@ Analizza l'intera Playlist - + Enter new name for playlist: Inserisci il nuovo nome per la playlist: - + Duplicate Playlist Duplica Playlist - - + + Enter name for new playlist: Inserisci il nome per la playlist: - + Export Playlist Esporta Playlist - + Rename Playlist Rinomina Playlist - - + + Renaming Playlist Failed Errore nel rinominare la Playlist - - - + + + A playlist by that name already exists. Esiste già una playlist con questo nome. - - - + + + A playlist cannot have a blank name. Il nome della playlist non può essere vuoto. - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Creazione della playlist non riuscita - - + + An unknown error occurred while creating playlist: Errore sconosciuto durante la creazione della playlist: - + M3U Playlist (*.m3u) Playlist M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Testo CSV (*.csv);;File testuale (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Impossibile caricare la traccia @@ -2768,7 +2768,7 @@ - + Lock Bloccato @@ -2793,7 +2793,7 @@ Sorgente traccia Auto DJ - + Enter new name for crate: Inserisci il nuovo nome per il cesto: @@ -2811,38 +2811,38 @@ - + Export Crate Esporta il Cesto - + Unlock Sblocca - + An unknown error occurred while creating crate: Si è verificato un errore sconosciuto durante la creazione del Cesto: - + Rename Crate Rinomina il Cesto - - + + Renaming Crate Failed Impossibile Rinominare il Cesto - + Crate Creation Failed Impossibile creare il Cesto - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Testo CSV (*.csv);;File testuale (*.txt) @@ -2862,12 +2862,12 @@ Le cassette ti permettono di organizzare i tuoi brani nel modo che più ti piace! - + A crate cannot have a blank name. Il Cesto deve avere un nome. - + A crate by that name already exists. Un Cesto deve avere un nome @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Inserisci un nome per il nuovo cesto: - - + + Creating Crate Failed Impossibile creare il Cesto - + A crate cannot have a blank name. Il Cesto deve avere un nome. - - + + A crate by that name already exists. Un Cesto deve avere un nome - - + + An unknown error occurred while creating crate: Si è verificato un errore sconosciuto durante la creazione del Cesto: - + copy [noun] - + Duplicate Crate Duplica Cesto - - - + + + Duplicating Crate Failed @@ -5594,7 +5594,7 @@ DlgPrefRecord - + Choose recordings directory Scegli la cartella di Registrazione @@ -5810,113 +5810,113 @@ DlgPrefSound - + None Nessuno/a - + %1 Hz %1 Hz - + Default (long delay) Predefinita (ritardo lungo) - + Experimental (no delay) Sperimentale (nessun ritardo) - + Disabled (short delay) Disabilitato (ritardo corto) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Disabilitato - + Enabled Attivato - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Errore di configurazione @@ -7390,15 +7390,28 @@ LibraryFeature - + Import Playlist Importa Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) File playlist (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7690,39 +7703,39 @@ La seguente Skin non può essere caricata. - + OpenGL Direct Rendering Rendering Diretto OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Conferma uscita - + A deck is currently playing. Exit Mixxx? Un deck è in riproduzione. Uscire da Mixxx? - + A sampler is currently playing. Exit Mixxx? Un campionamento è attualmente in riproduzione. Uscire da Mixxx? - + The preferences window is still open. La finestra delle Preferenze è ancora aperta. - + Discard any changes and exit Mixxx? Annullare ogni modifica e uscire da Mixxx? @@ -7801,7 +7814,7 @@ - + Playlists Playlists @@ -7811,27 +7824,27 @@ Sblocca - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Le Playlists sono liste ordinate di canzoni che ti permettono di pianificare i tuoi DJ sets - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alcuni Djs organizzano le playlist prima della performance live, ma altri preferiscono farle al "volo". - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quando usi una playlist durante una esibizione Live Dj, ricordati sempre di prestare molta attenzione a come il tuo pubblico reagisce alla musica da eseguire che hai selezionato - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Potrebbe essere necessario saltari alcune canzoni che hai preparato nella playlist o aggiungere canzoni differenti per mantenere l'energia del tuo pubblico. - + Create New Playlist Crea Nuova Playlist @@ -9303,7 +9316,7 @@ - + History Storico @@ -9318,22 +9331,22 @@ Bloccato - + The history section automatically keeps a list of tracks you play in your DJ sets. La sezione storia automaticamente conserva una lista delle tracce che esegui durante la performance DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Questo è utile per ricordare cosa ha funzionato durante la performance DJ, inviare le liste di esecuzione, oppure effettuare i report alle organizzazione di licenze di diritti d'autore. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Ogni volta che avvii MIxxx, una nuova sezioni Storico viene creata. Puoi esportarla come Playlist in vari formati o riprodurla nuovamente con l'Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Tu puoi usare la sessione corrente di History con una precedente cliccando col destro e selezionando "Join with previous". @@ -9523,23 +9536,23 @@ SoundManager - - + + a device un dispositivo - + An unknown error occurred Errore sconosciuto - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11723,12 +11736,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12525,68 +12538,68 @@ ESC - + Remove Rimuovi - + Remove from Playlist - + Remove from Crate - + Hide from Library Nascondi dalla Libreria - + Unhide from Library Mostra tracce dalla libreria - + Purge from Library Nascondi dalla libreria - + Properties Proprietà - + Open in File Browser Apri nel File Manager - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Crea Nuova Playlist - + Create New Crate Crea nuovo cesto - + Enter name for new playlist: Inserisci il nome per la playlist: @@ -12616,144 +12629,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Deck Anteprima - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcue - + Loop - + ReplayGain Riapplica Gain - + Waveform - + All Tutto - + Deck %1 Deck %1 - + New Playlist Nuova Playlist - - - + + + Playlist Creation Failed Creazione della playlist non riuscita - + A playlist by that name already exists. Esiste già una playlist con questo nome. - + A playlist cannot have a blank name. Il nome della playlist non può essere vuoto. - + An unknown error occurred while creating playlist: Errore sconosciuto durante la creazione della playlist: - + Lock BPM Blocca i BPM - + Unlock BPM Sblocca i BPM - + Double BPM raddoppia BPM - + Halve BPM Dimezza BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ja.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ja.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ja.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ja.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ オートDJ - + Add Crate as Track Source トラックソースを追加 @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist プレイリストの新規作成 @@ -108,7 +108,7 @@ - + Create New Playlist 新規プレイリストの作成 @@ -154,82 +154,82 @@ すべての曲を解析 - + Enter new name for playlist: プレイリストに新しい名前を付ける - + Duplicate Playlist プレイリストを複製する - - + + Enter name for new playlist: 新しいプレイリストの名前 - + Export Playlist プレイリストをエクスポート - + Rename Playlist プレイリストの名前の変更 - - + + Renaming Playlist Failed プレイリストの名前の変更に失敗 - - - + + + A playlist by that name already exists. 同じ名前のプレイリストが既にあります。 - - - + + + A playlist cannot have a blank name. プレイリストには名前が必要です。 - + _copy [noun] Appendix to default name when duplicating a playlist コピー(_C) - - - - - - + + + + + + Playlist Creation Failed プレイリストの作成に失敗 - - + + An unknown error occurred while creating playlist: プレイリストの作成中に不明なエラーが発生しました - + M3U Playlist (*.m3u) M3U プレイリスト (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3Uプレイリスト (*.m3u);;M3U8プレイリスト (*.m3u8);;PLSプレイリスト (*.pls);;CSVファイル(*.csv);;テキストファイル(*.txt);; @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. トラックを読み込めませんでした @@ -2766,7 +2766,7 @@ - + Lock ロックをかける @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate レコードボックスのエクスポート - + Unlock ロックを解除 - + An unknown error occurred while creating crate: 新しいレコードボックスを作成中にエラーが発生しました - + Rename Crate レコードボックスの名前を変更 - - + + Renaming Crate Failed レコードボックスの名前変更に失敗 - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3Uプレイリスト (*.m3u);;M3U8プレイリスト (*.m3u8);;PLSプレイリスト (*.pls);;CSVファイル(*.csv);;テキストファイル(*.txt);; @@ -2860,12 +2860,12 @@ Cratesはあなたがしたいあなたの音楽を整理しましょう! - + A crate cannot have a blank name. レコードボックスには名前が必要です。 - + A crate by that name already exists. この名前のレコードボックスは既に存在します @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed レコードボックスの作成に失敗しました - + A crate cannot have a blank name. レコードボックスには名前が必要です。 - - + + A crate by that name already exists. この名前のレコードボックスは既に存在します - - + + An unknown error occurred while creating crate: 新しいレコードボックスを作成中にエラーが発生しました - + copy [noun] - + Duplicate Crate レコードボックスを複製 - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None なし - + %1 Hz %1 Hz - + Default (long delay) 標準 (遅延 大) - + Experimental (no delay) 試験中 (遅延無し) - + Disabled (short delay) 無効 (遅延 小) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled 無効 - + Enabled 有効 - + Stereo ステレオ - + Mono モノラル - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error 設定エラー @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist プレイリストをインポート - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) プレイリスト ファイル (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7668,39 +7681,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit 終了の確認 - + A deck is currently playing. Exit Mixxx? デッキは現在再生中です。Mixxxを終了しますか? - + A sampler is currently playing. Exit Mixxx? サンプラーは現在再生中です。MIXXXを終了しますか? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists プレイリスト @@ -7789,27 +7802,27 @@ ロックを解除 - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist 新規プレイリストの作成 @@ -9274,7 +9287,7 @@ - + History @@ -9289,22 +9302,22 @@ ロックをかける - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device デバイス - + An unknown error occurred 未知のエラーがおこりました - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove 削除する - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library ライブラリから削除 - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist 新規プレイリストの作成 - + Create New Crate - + Enter name for new playlist: 新しいプレイリストの名前 @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues ホットキュー - + Loop - + ReplayGain - + Waveform - + All 全て - + Deck %1 デッキ %1 - + New Playlist プレイリストの新規作成 - - - + + + Playlist Creation Failed プレイリストの作成に失敗 - + A playlist by that name already exists. 同じ名前のプレイリストが既にあります。 - + A playlist cannot have a blank name. プレイリストには名前が必要です。 - + An unknown error occurred while creating playlist: プレイリストの作成中に不明なエラーが発生しました - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 サンプラー %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ko.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ko.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ko.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ko.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ 자동 디제잉 - + Add Crate as Track Source 트랙 영역에 추가 @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist 새 재생 목록 @@ -108,7 +108,7 @@ - + Create New Playlist 새 재생 목록 만들기 @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist 재생 목록 복제 - - + + Enter name for new playlist: 새 재생 목록의 이름을 입력하세요: - + Export Playlist 재생 목록 내보내기 - + Rename Playlist 재생 목록 이름 변경 - - + + Renaming Playlist Failed 재생 목록 이름 변경 실패 - - - + + + A playlist by that name already exists. 해당 재생 목록 이름은 이미 존재합니다. - - - + + + A playlist cannot have a blank name. 재생 목록은 공백을 이름으로 가질 수 없습니다. - + _copy [noun] Appendix to default name when duplicating a playlist _복사 - - - - - - + + + + + + Playlist Creation Failed 재생 목록 생성 실패 - - + + An unknown error occurred while creating playlist: 재생 목록을 생성하는 도중에 알 수 없는 에러가 발생했습니다: - + M3U Playlist (*.m3u) M3U 재생 목록 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 재생 목록 (*.m3u);;M3U8 재생 목록 (*.m3u8);;PLS 재생 목록 (*.pls);;CSV 텍스트 (*.csv);;일반 텍스트 (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 트랙을 불러올 수 없습니다. @@ -2766,7 +2766,7 @@ - + Lock 잠그기 @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate 상자 내보내기 - + Unlock 잠금 해제 - + An unknown error occurred while creating crate: 상자를 만드는 도중 예상치 못한 에러가 발생했습니다: - + Rename Crate 상자 이름 변경 - - + + Renaming Crate Failed 상자 이름 변경 실패 - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 재생 목록 (*.m3u);;M3U8 재생 목록 (*.m3u8);;PLS 재생 목록 (*.pls);;CSV 텍스트 (*.csv);;일반 텍스트 (*.txt) @@ -2860,12 +2860,12 @@ 상자는 당신이 원하는 대로 음악을 구성해줍니다! - + A crate cannot have a blank name. 빈 상자를 만들 수 없습니다 - + A crate by that name already exists. 같은 이름의 상자가 이미 존재합니다 @@ -2884,50 +2884,50 @@ - + Enter name for new crate: 새 상자의 이름을 입력하세요: - - + + Creating Crate Failed 상자 생성 실패 - + A crate cannot have a blank name. 빈 상자를 만들 수 없습니다 - - + + A crate by that name already exists. 같은 이름의 상자가 이미 존재합니다 - - + + An unknown error occurred while creating crate: 상자를 만드는 도중 예상치 못한 에러가 발생했습니다: - + copy [noun] - + Duplicate Crate 상자 복제 - - - + + + Duplicating Crate Failed @@ -5585,7 +5585,7 @@ DlgPrefRecord - + Choose recordings directory 녹음 디렉토리 선택 @@ -5800,113 +5800,113 @@ DlgPrefSound - + None 없음 - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled 활성화됨 - + Stereo 스테레오 - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7377,15 +7377,28 @@ LibraryFeature - + Import Playlist 재생 목록 가져오기 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 재생 목록 파일 (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7670,39 +7683,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists @@ -7789,27 +7802,27 @@ 잠금 해제 - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist 새 재생 목록 만들기 @@ -9274,7 +9287,7 @@ - + History @@ -9289,22 +9302,22 @@ 잠그기 - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device 장치 - + An unknown error occurred 알려지지 않은 에러 발생 - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove 지우기 - + Remove from Playlist - + Remove from Crate - + Hide from Library 라이브러리에서 숨기기 - + Unhide from Library 라이브러리에서 숨김해제 - + Purge from Library - + Properties - + Open in File Browser 파일 탐색기에서 열기 - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist 새 재생 목록 만들기 - + Create New Crate 새 상자 만들기 - + Enter name for new playlist: 새 재생 목록의 이름을 입력하세요: @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count 재생 횟수 - + Cue Point 큐포인트 - + Hotcues 핫큐 - + Loop 루프 - + ReplayGain - + Waveform 웨이브폼 - + All 전체 - + Deck %1 덱 %1 - + New Playlist 새 재생 목록 - - - + + + Playlist Creation Failed 재생 목록 생성 실패 - + A playlist by that name already exists. 해당 재생 목록 이름은 이미 존재합니다. - + A playlist cannot have a blank name. 재생 목록은 공백을 이름으로 가질 수 없습니다. - + An unknown error occurred while creating playlist: 재생 목록을 생성하는 도중에 알 수 없는 에러가 발생했습니다: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 샘플러 %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_lb.ts mixxx-2.2.4~dfsg/res/translations/mixxx_lb.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_lb.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_lb.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto Dj - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Nei Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist Playlescht dublizeieren - - + + Enter name for new playlist: - + Export Playlist Playlescht exportéieren - + Rename Playlist Playlescht Embenennen - - + + Renaming Playlist Failed Embennen ass fehlgeschloen - - - + + + A playlist by that name already exists. Eng Playlescht mam selweschten Numm gett et schon - - - + + + A playlist cannot have a blank name. Eng Playlescht kann net Eidel sin - + _copy [noun] Appendix to default name when duplicating a playlist _kopéieren - - - - - - + + + + + + Playlist Creation Failed Playlescht konnt net erstallt gin - - + + An unknown error occurred while creating playlist: En onbekannten Fehler ass beim Erstellen vun der Playlescht opgetrueden: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlescht (*.m3u);;M3U8 Playlescht (*.m3u8);;PLS Playlescht (*.pls);;Text CSV (*.csv);;LiesbarenText (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Konnt net gelueden gin @@ -2766,7 +2766,7 @@ - + Lock Späer @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Datei exporteieren - + Unlock Opgespart - + An unknown error occurred while creating crate: Een fehler ass opgetrueden bei der creatioun vun der datei - + Rename Crate datei embenimmen - - + + Renaming Crate Failed Fehler beim embenennen vun der datei - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlescht (*.m3u);;M3U8 Playlescht (*.m3u8);;PLS Playlescht (*.pls);;Text CSV (*.csv);;LiesbarenText (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Eng datei muss een numm hun. - + A crate by that name already exists. Dest datei mat dem selweschten num gett et schon @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Datei fehlgeschloen bei der creatioun. - + A crate cannot have a blank name. Eng datei muss een numm hun. - - + + A crate by that name already exists. Dest datei mat dem selweschten num gett et schon - - + + An unknown error occurred while creating crate: Een fehler ass opgetrueden bei der creatioun vun der datei - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Keen - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Aktiv - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Playlescht emportéieren - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Playlescht Fichieren (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Opgespart - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Späer - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Läschen - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Nei Playlist - - - + + + Playlist Creation Failed Playlescht konnt net erstallt gin - + A playlist by that name already exists. Eng Playlescht mam selweschten Numm gett et schon - + A playlist cannot have a blank name. Eng Playlescht kann net Eidel sin - + An unknown error occurred while creating playlist: En onbekannten Fehler ass beim Erstellen vun der Playlescht opgetrueden: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_lt.ts mixxx-2.2.4~dfsg/res/translations/mixxx_lt.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_lt.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_lt.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Automatinis DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Naujas grojaraštis @@ -108,7 +108,7 @@ - + Create New Playlist Sukurti grojaraštį @@ -154,82 +154,82 @@ Analizuoti visą grojaraštį - + Enter new name for playlist: Įrašykite naują grojaraščio pavadinimą: - + Duplicate Playlist Duplikuoti grojaraštį - - + + Enter name for new playlist: Įrašykite naujo grojaraščio pavadinimą: - + Export Playlist Eksportuoti grojaraštį - + Rename Playlist Pervadinti grojaraštį - - + + Renaming Playlist Failed Grojaraščio pervadinti nepavyko - - - + + + A playlist by that name already exists. Grojaraštis šiuo pavadinimu jau egzistuoja. - - - + + + A playlist cannot have a blank name. Grojaraščio pavadinimas negali būti tuščias. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Grojaraščio kūrimas nepavyko - - + + An unknown error occurred while creating playlist: Įvyko nežinoma klaida sukuriant grojaraštį: - + M3U Playlist (*.m3u) M3U Grojaraštis (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Grojaraštis (*.m3u);;M3U8 Grojaraštis (*.m3u8);;PLS Grojaraštis (*.pls);;Tekstinis CSV (*.csv);;Skaitomas tekstas (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Negalima įkrauti takelio. @@ -2766,7 +2766,7 @@ - + Lock Užrakinti @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Eksportuoti paketą - + Unlock Atrakinti - + An unknown error occurred while creating crate: Neatpažinta klaida įvyko sukuriant naują paketą: - + Rename Crate Pervadinti paketą - - + + Renaming Crate Failed Paketo pervadinimas nepavyko - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Grojaraštis (*.m3u);;M3U8 Grojaraštis (*.m3u8);;PLS Grojaraštis (*.pls);;Tekstinis CSV (*.csv);;Skaitomas tekstas (*.txt) @@ -2860,12 +2860,12 @@ Paketai leidžia jums valdyti muziką taip kaip jūs norite! - + A crate cannot have a blank name. Paketo pavadinimas negali būti tuščias. - + A crate by that name already exists. Paketas tokiu pavadinimu jau egzistuoja. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Paketo sukūrimas nepavyko - + A crate cannot have a blank name. Paketo pavadinimas negali būti tuščias. - - + + A crate by that name already exists. Paketas tokiu pavadinimu jau egzistuoja. - - + + An unknown error occurred while creating crate: Neatpažinta klaida įvyko sukuriant naują paketą: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Įgalintas - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Įkelti grojaraštį - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Grojaraščio bylos (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Atrakinti - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Sukurti grojaraštį @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Užrakinti - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Pašalinti - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Sukurti grojaraštį - + Create New Crate - + Enter name for new playlist: Įrašykite naujo grojaraščio pavadinimą: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 Grotuvas %1 - + New Playlist Naujas grojaraštis - - - + + + Playlist Creation Failed Grojaraščio kūrimas nepavyko - + A playlist by that name already exists. Grojaraštis šiuo pavadinimu jau egzistuoja. - + A playlist cannot have a blank name. Grojaraščio pavadinimas negali būti tuščias. - + An unknown error occurred while creating playlist: Įvyko nežinoma klaida sukuriant grojaraštį: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sempleris %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_lv.ts mixxx-2.2.4~dfsg/res/translations/mixxx_lv.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_lv.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_lv.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Jauns atskaņošanas saraksts @@ -108,7 +108,7 @@ - + Create New Playlist Izveidot jaunu atskaņošanas sarakstu @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist Dublēt atkaņošanas sarakstu - - + + Enter name for new playlist: - + Export Playlist Eksportēt atskaņošanas sarakstu - + Rename Playlist Pārdēvēt atskaņošnas sarakstu - - + + Renaming Playlist Failed Neizdevās pārsaukt atskaņošanas sarakstu - - - + + + A playlist by that name already exists. Atskaņošanas saraksts ar šādu nosaukumu jau eksistē. - - - + + + A playlist cannot have a blank name. Atskaņošanas saraksts nevar būt bez nosaukuma. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Neizdevās izveidot atskaņošanas sarakstu - - + + An unknown error occurred while creating playlist: Notikusi nezināma kļūda veidojot atskaņošanas sarakstu: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Atskaņošanas Saraksts (*.m3u);;M3U8 Atskaņošanas Saraksts (*.m3u8);;PLS Atskaņošanas Saraksts (*.pls);;Teksts CSV (*.csv);;Lasāms Teksts (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nevar ielādēt celiņu @@ -2766,7 +2766,7 @@ - + Lock Bloķēt @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Eksportēt grozu - + Unlock Atbloķēt - + An unknown error occurred while creating crate: Notikusi nezināma kļūda veidojot grozu: - + Rename Crate Pārsaukt grozu - - + + Renaming Crate Failed Neizdevās pārsaukt grozu - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Atskaņošanas Saraksts (*.m3u);;M3U8 Atskaņošanas Saraksts (*.m3u8);;PLS Atskaņošanas Saraksts (*.pls);;Teksts CSV (*.csv);;Lasāms Teksts (*.txt) @@ -2860,12 +2860,12 @@ Grozi ļauj jums organizēt jūsu mūziku tā kā jūs to vēlaties! - + A crate cannot have a blank name. Groza nosaukums nevar būt tukšs - + A crate by that name already exists. Grozs ar šādu nosaukumu jau eksistē. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Neizdevās izveidot grozu - + A crate cannot have a blank name. Groza nosaukums nevar būt tukšs - - + + A crate by that name already exists. Grozs ar šādu nosaukumu jau eksistē. - - + + An unknown error occurred while creating crate: Notikusi nezināma kļūda veidojot grozu: - + copy [noun] - + Duplicate Crate Dublēt grozu - - - + + + Duplicating Crate Failed @@ -5583,7 +5583,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5798,113 +5798,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7375,15 +7375,28 @@ LibraryFeature - + Import Playlist Importēt atskaņošanas sarakstu - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Atskaņošanas sarakstu datnes (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7668,39 +7681,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7777,7 +7790,7 @@ - + Playlists @@ -7787,27 +7800,27 @@ Atbloķēt - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Izveidot jaunu atskaņošanas sarakstu @@ -9272,7 +9285,7 @@ - + History @@ -9287,22 +9300,22 @@ Bloķēt - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9492,23 +9505,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11692,12 +11705,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12494,68 +12507,68 @@ - + Remove Dzēst - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Izveidot jaunu atskaņošanas sarakstu - + Create New Crate - + Enter name for new playlist: @@ -12585,144 +12598,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 Atskaņotājs %1 - + New Playlist Jauns atskaņošanas saraksts - - - + + + Playlist Creation Failed Neizdevās izveidot atskaņošanas sarakstu - + A playlist by that name already exists. Atskaņošanas saraksts ar šādu nosaukumu jau eksistē. - + A playlist cannot have a blank name. Atskaņošanas saraksts nevar būt bez nosaukuma. - + An unknown error occurred while creating playlist: Notikusi nezināma kļūda veidojot atskaņošanas sarakstu: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sempleris %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_mk.ts mixxx-2.2.4~dfsg/res/translations/mixxx_mk.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_mk.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_mk.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Авто-Диџеј - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Нова Плејлиста @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist Изнеси Плејлиста - + Rename Playlist Преименувај Плејлиста - - + + Renaming Playlist Failed Неуспешно преименување на Плејлистата - - - + + + A playlist by that name already exists. Веќе постои Плејлиста со тоа име. - - - + + + A playlist cannot have a blank name. Плејлистата неможе да има празно име. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Неуспешно креирање на Плејлистата - - + + An unknown error occurred while creating playlist: Непозната грешка се појави при креирање на плејлистата: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плејлиста (*.m3u);;M3U8 Плејлиста (*.m3u8);;PLS Плејлиста (*.pls);;Текст CSV (*.csv);;Читлив текст (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Не може да се вчита датотеката @@ -2766,7 +2766,7 @@ - + Lock Заклучи @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Изнеси кутија - + Unlock Отклучи - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плејлиста (*.m3u);;M3U8 Плејлиста (*.m3u8);;PLS Плејлиста (*.pls);;Текст CSV (*.csv);;Читлив текст (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Внеси Плејлиста - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Подржани фајлови на плејлисти(*.m3u, *.m3u8, *.pls, *.cvs) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Отклучи - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Заклучи - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Одстрани - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Нова Плејлиста - - - + + + Playlist Creation Failed Неуспешно креирање на Плејлистата - + A playlist by that name already exists. Веќе постои Плејлиста со тоа име. - + A playlist cannot have a blank name. Плејлистата неможе да има празно име. - + An unknown error occurred while creating playlist: Непозната грешка се појави при креирање на плејлистата: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ml.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ml.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ml.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ml.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock പൂട്ടു് @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None ശൂന്യം - + %1 Hz %1 ഹെര്‍ട്സ് - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled പ്രവര്‍ത്തന സജ്ജമാക്കിയിരിയ്ക്കുന്നു - + Stereo സ്റ്റീരിയോ - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ പൂട്ടു് - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred അപരിചിതമായ തെറ്റ് സംഭവിച്ചു - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove നീക്കം ചെയ്യുക - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_mn.ts mixxx-2.2.4~dfsg/res/translations/mixxx_mn.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_mn.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_mn.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Автомат ДиЖэи - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Уншиж чадахгүй байна @@ -2766,7 +2766,7 @@ - + Lock @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_mr.ts mixxx-2.2.4~dfsg/res/translations/mixxx_mr.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_mr.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_mr.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist नवीन वादकयादी @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock कुलूपबंद करा @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock कुलूप उघडा - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ कुलूप उघडा - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ कुलूपबंद करा - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove काढून टाका - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist नवीन वादकयादी - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ms.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ms.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ms.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ms.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ Automatik - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Senarai Main Baru @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed Cipta Senarai Main Gagal - - + + An unknown error occurred while creating playlist: Ralat tidak diketahui berlaku semasa mencipta senarai main - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Tidak dapat memuatkan trek. @@ -2766,7 +2766,7 @@ - + Lock Kunci @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Eksport Krat - + Unlock Buka - + An unknown error occurred while creating crate: Terdapat ralat semasa mecipta krat: - + Rename Crate Namakan Semula Krate - - + + Renaming Crate Failed Menamakan Semula Krat Gagal - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Nama krat tidak boleh kosong. - + A crate by that name already exists. Krat dengan nama tadi telah wujid. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Mencipta Krat Gagal - + A crate cannot have a blank name. Nama krat tidak boleh kosong. - - + + A crate by that name already exists. Krat dengan nama tadi telah wujid. - - + + An unknown error occurred while creating crate: Terdapat ralat semasa mecipta krat: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Import Senarai Main - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Buka - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Kunci - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Buang - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Senarai Main Baru - - - + + + Playlist Creation Failed Cipta Senarai Main Gagal - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: Ralat tidak diketahui berlaku semasa mencipta senarai main - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_my.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_my.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_my.ts mixxx-2.2.4~dfsg/res/translations/mixxx_my.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_my.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_my.ts 2020-05-15 21:26:10.000000000 +0000 @@ -19,22 +19,22 @@ AutoDJFeature - + Crates - + Remove Crate as Track Source - + Auto DJ - + အော်တို ဒီဂျေ - + Add Crate as Track Source @@ -42,25 +42,25 @@ BansheeFeature - - + + Banshee - - + + Error loading Banshee database - + Banshee database file not found at - + There was an error loading your Banshee database at @@ -71,12 +71,12 @@ Add to Auto DJ Queue (bottom) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အောက်​ြေခ) Add to Auto DJ Queue (top) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အထက်) @@ -86,36 +86,36 @@ Playlist Creation Failed - + ဖွင့်မည့်စာရင်း ပြုလုပ်ခြင်း မအောင်မြင်ပါ An unknown error occurred while creating playlist: - + ဖွင့်မည့်စာရင်း ပြုလုပ်စဉ် မသိသော အမှားတစ်ခု ဖြစ်ခဲ့သည်: BasePlaylistFeature - + New Playlist ဖွင့်မည့်စာရင်းအသစ် Add to Auto DJ Queue (bottom) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အောက်​ြေခ) - + Create New Playlist - + ဖွင့်မည့်စာရင်း အသစ် ပြုလုပ်ရန် Add to Auto DJ Queue (top) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အထက်) @@ -151,87 +151,87 @@ Analyze entire Playlist - + ဖွင့်မည့်စာရင်း တစ်ခုလုံး ကို စီစစ်ရန် - + Enter new name for playlist: - + ဖွင့်မည့်စာရင်း အတွက် အမည်သစ် တစ်ခု ရိုက်ထည့်ပါ: - + Duplicate Playlist - + ဖွင့်မည့်စာရင်း ထပ်နေသည် - - + + Enter name for new playlist: - + ဖွင့်မည့်စာရင်း အသစ် အတွက် အမည်ရိုက်ထည့်ပါ: - + Export Playlist ဖွင့်မည့်စာရင်းကိုထုတ်မည်။ - + Rename Playlist ဖွင့်မည့်စာရင်းကိုအမည်ပြောင်းမည်။ - - + + Renaming Playlist Failed - + ဖွင့်မည့်စာရင်း အမည်ပြန်ပြောင်းခြင်း မအောင်မြင်ပါ - - - + + + A playlist by that name already exists. - + ဖွင့်မည့်စာရင်း အတွက် ပေးထားသော အမည်မှာ ရှိပြီးဖြစ်သည်။ - - - + + + A playlist cannot have a blank name. - + ဖွင့်မည့်စာရင်း အမည် ကို အလွတ်ထား၍ မရပါ။ - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - + ဖွင့်မည့်စာရင်း ပြုလုပ်ခြင်း မအောင်မြင်ပါ - - + + An unknown error occurred while creating playlist: - + ဖွင့်မည့်စာရင်း ပြုလုပ်စဉ် မသိသော အမှားတစ်ခု ဖြစ်ခဲ့သည်: - + M3U Playlist (*.m3u) - + M3U ဖွင့်မည့်စာရင်း (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U  ဖွင့်မည့်စာရင်း (*.m3u);;M3U8 ဖွင့်မည့်စာရင်း (*.m3u8);;PLS ဖွင့်မည့်စာရင်း (*.pls);;စာသား CSV (*.csv);;ဖတ်ရသော စသားမျိုး (*.txt) @@ -239,17 +239,17 @@ Played - + ဖွင့်ခဲ့ပြီး Artist - + အဆိုတော် Title - + ခေါင်းစဉ် @@ -264,12 +264,12 @@ Genre - + အမျိုးအစား Composer - + တေးရေး @@ -279,17 +279,17 @@ Year - + ခုနှစ် Type - + အမျိုးအစား Location - + တည်နေရာ @@ -329,7 +329,7 @@ # - + # @@ -339,7 +339,7 @@ Key - + ကီး @@ -349,7 +349,7 @@ Preview - + အစမ်းဖွင့် @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -409,42 +409,42 @@ BroadcastSettingsModel - + Enabled - + Name - + Status - + Disconnected - + Connecting... - + Connected - + Failed - + Unknown @@ -452,59 +452,59 @@ BrowseFeature - + Add to Quick Links - + Remove from Quick Links - + Add to Library - + Quick Links - - + + Devices - + Removable Devices - - + + Computer - + ကွန်ပျူတာ - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan - + ထောက်လှမ်းရှာဖွေရန် - + "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. @@ -514,22 +514,22 @@ Preview - + အစမ်းဖွင့် Filename - + ဖိုင်အမည် Artist - + အဆိုတော် Title - + ခေါင်းစဉ် @@ -544,17 +544,17 @@ Year - + ခုနှစ် Genre - + အမျိုးအစား Composer - + တေးရေး @@ -574,12 +574,12 @@ Key - + ကီး Type - + အမျိုးအစား @@ -594,7 +594,7 @@ Location - + တည်နေရာ @@ -673,7 +673,7 @@ Title - + ခေါင်းစဉ် @@ -787,13 +787,13 @@ - + Set to full volume - + Set to zero volume @@ -818,13 +818,13 @@ - + Headphone listen button - + Mute button @@ -840,25 +840,25 @@ - + Mix orientation (e.g. left, right, center) - + Set mix orientation to left - + Set mix orientation to center - + Set mix orientation to right @@ -1282,20 +1282,20 @@ - - + + Volume Fader - + Full Volume - + Zero Volume @@ -1311,7 +1311,7 @@ - + Mute @@ -1322,7 +1322,7 @@ - + Headphone Listen @@ -1343,25 +1343,25 @@ - + Orientation - + Orient Left - + Orient Center - + Orient Right @@ -1765,7 +1765,7 @@ Add to Auto DJ Queue (bottom) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အောက်​ြေခ) @@ -1775,7 +1775,7 @@ Add to Auto DJ Queue (top) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အထက်) @@ -1834,200 +1834,201 @@ + Quick Effect - + Clear effect rack - + Clear Effect Rack - + Clear Unit - + Clear effect unit - + Toggle Unit - + Dry/Wet - + Adjust the balance between the original (dry) and processed (wet) signal. - + Super Knob - + Next Chain - - - - - - - - + + + + + + + + Assign - + Clear - + Clear the current effect - + Toggle - + Toggle the current effect - + Next - + Switch to next effect - + Previous - + Switch to the previous effect - + Next or Previous - + Switch to either next or previous effect - - + + Parameter Value - - + + Microphone Ducking Strength - + Microphone Ducking Mode - + Gain - + Gain knob - + Shuffle the content of the Auto DJ queue - + Skip the next track in the Auto DJ queue - + Auto DJ Toggle - + အော်တို ဒီဂျေ ခလုပ် - + Toggle Auto DJ On/Off - + အော်တို ဒီဂျေ ဖွင့်/ပိတ် ခလုပ် - + Library Maximize/Restore - + Maximize the track library to take up all the available screen space. - + Effect Rack Show/Hide - + Show/hide the effect rack - + Cover Art Show/Hide - + Show/hide cover art - + Waveform Zoom Out - + Toggle Effect Unit @@ -2400,218 +2401,228 @@ - + + Deck %1 Quick Effect Enable Button + + + + + Quick Effect Enable Button + + + + Enable or disable effect processing - + Super Knob (control effects' Meta Knobs) - + Mix Mode Toggle - + Toggle effect unit between D/W and D+W modes - + Next chain preset - + Previous Chain - + Previous chain preset - + Next/Previous Chain - + Next or previous chain preset - - + + Show Effect Parameters - + Meta Knob - + Effect Meta Knob (control linked effect parameters) - + Meta Knob Mode - + Set how linked effect parameters change when turning the Meta Knob. - + Meta Knob Mode Invert - + Invert how linked effect parameters change when turning the Meta Knob. - + Microphone / Auxiliary - + Microphone On/Off - + Microphone on/off - + Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Auxiliary On/Off - + Auxiliary on/off - + Auto DJ - + အော်တို ဒီဂျေ - + Auto DJ Shuffle - + Auto DJ Skip Next - + Auto DJ Fade To Next - + Trigger the transition to the next track - + User Interface - + Samplers Show/Hide - + Show/hide the sampler section - + Microphone Show/Hide - + Show/hide the microphone section - + Vinyl Control Show/Hide - + Show/hide the vinyl control section - + Preview Deck Show/Hide - + Show/hide the preview deck - + Vinyl Spinner Show/Hide - + Show/hide spinning vinyl widget - + Waveform zoom - + Waveform Zoom - + Zoom waveform in - + Waveform Zoom In - + Zoom waveform out @@ -2755,7 +2766,7 @@ - + Lock ပိတ် @@ -2780,7 +2791,7 @@ - + Enter new name for crate: @@ -2798,40 +2809,40 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U  ဖွင့်မည့်စာရင်း (*.m3u);;M3U8 ဖွင့်မည့်စာရင်း (*.m3u8);;PLS ဖွင့်မည့်စာရင်း (*.pls);;စာသား CSV (*.csv);;ဖတ်ရသော စသားမျိုး (*.txt) @@ -2849,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2873,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -2957,17 +2968,17 @@ - + Credits - + License - + <a href="http://mixxx.org/">Official Website</a> @@ -3060,7 +3071,7 @@ Auto DJ - + အော်တို ဒီဂျေ @@ -3813,7 +3824,7 @@ Genre - + အမျိုးအစား @@ -3854,7 +3865,7 @@ Type - + အမျိုးအစား @@ -4004,7 +4015,7 @@ Filename - + ဖိုင်အမည် @@ -5120,62 +5131,62 @@ DlgPrefLibrary - + Music Directory Added - + You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Scan - + ထောက်လှမ်းရှာဖွေရန် - + Choose a music directory - + Confirm Directory Removal - + Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Hide Tracks - + Delete Track Metadata - + Leave Tracks Unchanged - + Relink music directory to new location - + Select Library Font @@ -5269,12 +5280,12 @@ - + Library Font: - + Library Row Height: @@ -5284,78 +5295,88 @@ - + Add track to Auto DJ Queue (top) - + Add track to Auto DJ Queue (bottom) - + Use relative paths for playlist export if possible - + အကယ်၍ ဖြစ်နိုင်လျှင် ဖွင့်မည့်စာရင်း ထုတ်ယူရန်အတွက် ဆက်နွယ်သော လမ်းကောင်းများ သုံးပါ - + ... - + px - + Edit metadata after clicking selected track - + + Search-as-you-type timeout: + + + + + ms + + + + Track Load Action Sets default action when double-clicking a track in the library. - + Load track to next available deck - + External Libraries - + You will need to restart Mixxx for these settings to take effect. - + Show Rhythmbox Library - + Show Banshee Library - + Show iTunes Library - + Show Traktor Library - + All external libraries shown are write protected. @@ -5559,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5600,7 +5621,7 @@ Title - + ခေါင်းစဉ် @@ -5774,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -6414,7 +6435,7 @@ Auto DJ - + အော်တို ဒီဂျေ @@ -6542,18 +6563,18 @@ Year - + ခုနှစ် Title - + ခေါင်းစဉ် Artist - + အဆိုတော် @@ -6747,12 +6768,12 @@ Composer - + တေးရေး Title - + ခေါင်းစဉ် @@ -6762,17 +6783,17 @@ Key - + ကီး Year - + ခုနှစ် Artist - + အဆိုတော် @@ -6782,7 +6803,7 @@ Genre - + အမျိုးအစား @@ -7007,55 +7028,55 @@ EffectSettingsModel - + Visible - + Name - + Type - + အမျိုးအစား EffectsManager - + Flanger - + BitCrusher - + Filter - + Reverb - + Echo - + AutoPan - + Tremolo @@ -7125,7 +7146,7 @@ GLSLFilteredWaveformWidget - + Filtered @@ -7133,7 +7154,7 @@ GLSLRGBWaveformWidget - + RGB @@ -7226,41 +7247,41 @@ ITunesFeature - - + + iTunes - - + + Select your iTunes library - + (loading) iTunes - + Use Default Library - + Choose Library... - + Error Loading iTunes Library - + There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - + သင့် iTunes မီဒီယာတိုက် ကို တင်သွင်းစဥ် အမှားဖြစ်သည်။ အချို့သော သင့် iTune အပုဒ်များ သို့မဟုတ် ဖွင့်မည့်စာရင်းများ တင်သွင်းမရခဲ့ပါ။ @@ -7272,7 +7293,7 @@ - + No OpenGL support. Shown when Spinny can not be displayed. Please keep @@ -7280,57 +7301,57 @@ - + activate - + toggle - + right - + left - + right small - + left small - + up - + down - + up small - + down small - + Shortcut @@ -7338,12 +7359,12 @@ Library - + Add Directory to Library - + Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. @@ -7351,13 +7372,26 @@ LibraryFeature - + Import Playlist ဖွင့်မည့်စာရင်းကိုသွင်းမည်။ - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + ဖွင့်မည့်စာရင်း ဖိုင်များ (*.m3u *.m3u8 *.pls *.csv) + + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? @@ -7487,7 +7521,7 @@ - + Tracks @@ -7495,52 +7529,52 @@ MixxxMainWindow - + Choose music library directory - + Sound Device Busy - + <b>Retry</b> after closing the other application or reconnecting a sound device - - - + + + <b>Reconfigure</b> Mixxx's sound device settings. - - + + Get <b>Help</b> from the Mixxx Wiki. - - - + + + <b>Exit</b> Mixxx. - + Retry - + Cannot open database - + Unable to establish a database connection. Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. @@ -7548,135 +7582,135 @@ - - + + Reconfigure - + Help - - + + Exit - - + + Mixxx was unable to open all the configured sound devices. - + Sound Device Error - + <b>Retry</b> after fixing an issue - + No Output Devices - + Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + <b>Continue</b> without any outputs. - + Continue - + Load track to Deck %1 - + Deck %1 is currently playing a track. - + Are you sure you want to load a new track? - + There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + There is no input device selected for this microphone. Please select an input device in the sound hardware preferences first. - + Error in skin file - + The selected skin cannot be loaded. - + OpenGL Direct Rendering - - Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section.<br><br>NOTE: If you use NVIDIA hardware,<br>direct rendering may not be present, but you should<br>not experience degraded performance. + + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7686,12 +7720,12 @@ Location - + တည်နေရာ Playlist Export Failed - + ဖွင့်မည့်စာရင် ထုတ်ယူခြင်း မအောင်မြင်ပါ @@ -7708,25 +7742,27 @@ ParserM3u - - + + Playlist Export Failed - + ဖွင့်မည့်စာရင် ထုတ်ယူခြင်း မအောင်မြင်ပါ - + File path contains characters, not allowed in m3u playlists. - + ဖိုင်လမ်းကြောင်း ပါ အက္ခရာများ ကို m3u ဖွင့်မည့်စာရင်း တွင် ခွင့်မပြုပါ။ + - + Export a m3u8 playlist instead! - + m3u8 ဖွင့်မည့်စာရင်း အစား ထုတ်ယူသည်။ + - + Could not create file @@ -7734,12 +7770,12 @@ ParserPls - + Playlist Export Failed - + ဖွင့်မည့်စာရင် ထုတ်ယူခြင်း မအောင်မြင်ပါ - + Could not create file @@ -7747,45 +7783,45 @@ PlaylistFeature - + Lock ပိတ် - - + + Playlists - + ဖွင့်မည့်စာရင်းများ - + Unlock - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + ဖွင့်မည့်စာရင်းများ သည် သင်စီစဉ်ထားသော သင့် ဒီဂျေ အစု အတွက် သီချင်း စာရင်း အစီအစဥ်ဖြစ်သည်။ - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + အချို့သော ဒီဂျေများသည် သူတို့၏ တိုက်ရိုက် တင်ဆက်မှု မတိုင်မီ ဖွင့်မည့်စာရင်းများ တည်ဆောက်ကြသည်။ သို့သော် အချို့သည် တင်ဆက်နေစဥ် စီမံရသည်ကို ပိုနှစ်သက်ကြသည်။ - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + ဖွင့်မည့်စာရင်း သုံးကာ တိုက်ရိုက် ဒီဂျေ တင်ဆက်စဉ် သင့် ပရိတ်သတ်များမှ သင်ရွေးချယ် ဖွင့်ထားသော ဂီတ အပေါ် မည်သို့ တုန့်ပြန်နေသည် ကို အမြဲအာရုံစိုက် စောင့်ကြည့်နေရမည်ကို မှတ်ထားပါ။ - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + သင်၏ ပရိတ်သတ် စွမ်းရည် ကို ထိမ်းသိမ်းရန် သင်ပြင်ဆင်ထားသော ဖွင့်မည့်စာရင်း မှ အချို့သော သီချင်းများ ကိုကျော်လိုက်ခြင်း မတူညီသော သီချင်းအချို့ ထပ်ထည့်ခြင်း ပြုလုပ်ရန် လိုအပ်မည်။ - + Create New Playlist - + ဖွင့်မည့်စာရင်း အသစ် ပြုလုပ်ရန် @@ -7804,7 +7840,7 @@ Scan - + ထောက်လှမ်းရှာဖွေရန် @@ -9138,7 +9174,7 @@ RecordingFeature - + Recordings @@ -9188,8 +9224,8 @@ RhythmboxFeature - - + + Rhythmbox @@ -9237,48 +9273,48 @@ SetlogFeature - + Join with previous - + Create new history playlist - + ဖွင့်မည့်စာရင်း မှတ်တမ်း အသစ် ပြုလုပ်ရန် - - + + History - + Unlock - + Lock ပိတ် - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + Mixxx ကိုစတင်တိုင်း မှတ်တမ်း ဆက်ရှင် အသစ် တစ်ခု ဖန်တည်းခဲ့သည်။ ၎င်းကို သင်သည် ဖွင့်ရန်စာရင်း အဖြစ် ဖောမတ်အမျိုးမျိုးဖြင့် ထုတ်ယူနိုင်သည် သို့မဟုတ် အလိုလျှောက် ဒီဂျေ အဖြစ် ထပ်မံဖွင့်နိုင်သည်။ - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9307,147 +9343,152 @@ - + + Error setting tls mode: + + + + Error setting hostname! - + Error setting port! - + Error setting password! - + Error setting mount! - + Error setting username! - + Error setting stream name! - + Error setting stream description! - + Error setting stream genre! - + Error setting stream url! - + Error setting stream IRC! - + Error setting stream AIM! - + Error setting stream ICQ! - + Error setting stream public! - + Broadcasting at 96kHz with Ogg Vorbis is not currently supported. Please try a different sample-rate or switch to a different encoding. - + See https://bugs.launchpad.net/mixxx/+bug/686212 for more information. - + Error setting bitrate - + Error: unknown server protocol! - + Error: libshout only supports Shoutcast with MP3 format! - + Error setting protocol! - + Network cache overflow - + Connection error - + One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - + Connection message - + <b>Message from Live Broadcasting connection '%1':</b><br> - + Lost connection to streaming server and %1 attempts to reconnect have failed. - + Lost connection to streaming server. - + Please check your connection to the Internet. - + Can't connect to streaming server - + Please check your connection to the Internet and verify that your username and password are correct. @@ -9459,32 +9500,27 @@ Filtered - - - Software - - SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -9504,7 +9540,7 @@ Type - + အမျိုးအစား @@ -9865,7 +9901,7 @@ - + Cover Art @@ -10127,7 +10163,7 @@ Key - + ကီး @@ -10201,599 +10237,594 @@ - - Toggle displayed hotcue, 4 or 8 - - - - + Toggle visibility of Rate Control - + Places a cue point at the current position on the waveform. - + Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Seeks the track to the cue point and stops. - + Play - + Plays track from the cue point. - + Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Recording Duration - + Displays the duration of the running recording. - + Sets the track Loop-In Marker to the current play position. - + Press and hold to move Loop-In Marker. - + Jump to Loop-In Marker. - + Sets the track Loop-Out Marker to the current play position. - + Press and hold to move Loop-Out Marker. - + Jump to Loop-Out Marker. - + Beatloop Size - + Select the size of the loop in beats to set with the Beatloop button. - + Changing this resizes the loop if the loop already matches this size. - + Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Start a loop over the set number of beats. - + Temporarily enable a rolling loop over the set number of beats. - + Beatjump/Loop Move Size - + Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Beatjump Forward - + Jump forward by the set number of beats. - + Move the loop forward by the set number of beats. - + Jump forward by 1 beat. - + Move the loop forward by 1 beat. - + Beatjump Backward - + Jump backward by the set number of beats. - + Move the loop backward by the set number of beats. - + Jump backward by 1 beat. - + Move the loop backward by 1 beat. - + Reloop - + If the loop is ahead of the current position, looping will start when the loop is reached. - + Works only if Loop-In and Loop-Out Marker are set. - + Enable loop, jump to Loop-In Marker, and stop playback. - + Displays the elapsed and/or remaining time of the track loaded. - + Click to toggle between time elapsed/remaining time/both. - + Mix - + Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + D/W mode: Crossfade between dry and wet - + D+W mode: Add wet to dry - + Mix Mode - + Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Route the left crossfader bus through this effect unit. - + Route the right crossfader bus through this effect unit. - + Right side active: parameter moves with right half of Meta Knob turn - + Skin Settings Menu - + Show/hide skin settings menu - + Save Sampler Bank - + Save the collection of samples loaded in the samplers. - + Load Sampler Bank - + Load a previously saved collection of samples into the samplers. - + Show Effect Parameters - + Enable Effect - + Meta Knob Link - + Set how this parameter is linked to the effect's Meta Knob. - + Meta Knob Link Inversion - + Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Super Knob - + Next Chain - + Previous Chain - + Next/Previous Chain - + Clear - + Clear the current effect. - + Toggle - + Toggle the current effect. - + Next - + Clear Unit - + Clear effect unit. - + Show/hide parameters for effects in this unit. - + Toggle Unit - + Enable or disable this whole effect unit. - + Controls the Meta Knob of all effects in this unit together. - + Load next effect chain preset into this effect unit. - + Load previous effect chain preset into this effect unit. - + Load next or previous effect chain preset into this effect unit. - - - - - - - - - + + + + + + + + + Assign Effect Unit - + Assign this effect unit to the channel output. - + Route the headphone channel through this effect unit. - + Route the master mix through this effect unit. - + Route this deck through the indicated effect unit. - + Route this sampler through the indicated effect unit. - + Route this microphone through the indicated effect unit. - + Route this auxiliary input through the indicated effect unit. - + The effect unit must also be assigned to a deck or other sound source to hear the effect. - + Switch to the next effect. - + Previous - + Switch to the previous effect. - + Next or Previous - + Switch to either the next or previous effect. - + Meta Knob - + Controls linked parameters of this effect - + Effect Focus Button - + Focuses this effect. - + Unfocuses this effect. - + Refer to the web page on the Mixxx wiki for your controller for more information. - + Effect Parameter - + Adjusts a parameter of the effect. - + Inactive: parameter not linked - + Active: parameter moves with Meta Knob - + Left side active: parameter moves with left half of Meta Knob turn - + Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - - + + Equalizer Parameter Kill - - + + Holds the gain of the EQ to zero while active. - + Quick Effect Super Knob - + Quick Effect Super Knob (control linked effect parameters). - + Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Equalizer Parameter - + Adjusts the gain of the EQ filter. - + Hint: Change the default EQ mode in Preferences -> Equalizers. @@ -10815,123 +10846,123 @@ - + If quantize is enabled, snaps to the nearest beat. - + Quantize - + Toggles quantization. - + Loops and cues snap to the nearest beat when quantization is enabled. - + Reverse - + Reverses track playback during regular playback. - + Puts a track into reverse while being held (Censor). - + Playback continues where the track would have been if it had not been temporarily reversed. - - + + Play/Pause - + Jumps to the beginning of the track. - + Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Sync and Reset Key - + Increases the pitch by one semitone. - + Decreases the pitch by one semitone. - + Enable Vinyl Control - + When disabled, the track is controlled by Mixxx playback controls. - + When enabled, the track responds to external vinyl control. - + Enable Passthrough - + Indicates that the audio buffer is too small to do all audio processing. - + Displays cover artwork of the loaded track. - + Displays options for editing cover artwork. - + Star Rating - + Assign ratings to individual tracks by clicking the stars. @@ -11076,254 +11107,259 @@ - + + Changes the number of hotcue buttons displayed in the deck + + + + Starts playing from the beginning of the track. - + Jumps to the beginning of the track and stops. - + Plays or pauses the track. - + (while playing) - + (while stopped) - + Cue - + Headphone - + Mute - + Mutes the selected channel's audio in the master output. - + Old Synchronize - + (This skin should be updated to use Master Sync!) - + Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + If no deck is playing, syncs to the first deck that has a BPM. - + Decks can't sync to samplers and samplers can only sync to decks. - + Enable Master Sync - + Tap to sync the tempo to other playing tracks or the master clock. - + Hold for at least a second to enable sync lock for this deck. - + Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Resets the key to the original track key. - + Enable Sync Clock Master - + When enabled, this device will serve as the master clock for all other decks. - + Speed Control - - - + + + Changes the track pitch independent of the tempo. - + Increases the pitch by 10 cents. - + Decreases the pitch by 10 cents. - + Pitch Adjust - + Adjust the pitch in addition to the speed slider pitch. - + Record Mix - + Toggle mix recording. - + Enable Live Broadcasting - + Stream your mix over the Internet. - + Provides visual feedback for Live Broadcasting status: - + disabled, connecting, connected, failure. - + When enabled, the deck directly plays the audio arriving on the vinyl input. - + Blue for passthrough enabled. - + Playback will resume where the track would have been if it had not entered the loop. - + Loop Exit - + Turns the current loop off. - + Slip Mode - + When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Once disabled, the audible playback will resume where the track would have been. - + Track Key - + Displays the musical key of the loaded track. - + Clock - + Displays the current time. - + Audio Latency Usage Meter - + Displays the fraction of latency used for audio processing. - + A high value indicates that audible glitches are likely. - + Do not enable keylock, effects or additional decks in this situation. - + Audio Latency Overload Indicator @@ -11388,279 +11424,279 @@ - + Sends the selected channel's audio to the headphone output, - + selected in Preferences -> Sound Hardware. - + Fast Rewind - + Fast rewind through the track. - + Fast Forward - + Fast forward through the track. - + Jumps to the end of the track. - + Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - - - + + + Pitch Control - + Pitch Rate - + Displays the current playback rate of the track. - + Repeat - + When active the track will repeat if you go past the end or reverse before the start. - + Eject - + Ejects track from the player. - + Hotcue - + If hotcue is set, jumps to the hotcue. - + If hotcue is not set, sets the hotcue to the current play position. - + If hotcue is set, clears the hotcue. - + Vinyl Control Mode - + Absolute mode - track position equals needle position and speed. - + Relative mode - track speed equals needle speed regardless of needle position. - + Constant mode - track speed equals last known-steady speed regardless of needle input. - + Vinyl Status - + Provides visual feedback for vinyl control status: - + Green for control enabled. - + Blinking yellow for when the needle reaches the end of the record. - + Loop-In Marker - + Loop-Out Marker - + Loop Halve - + Halves the current loop's length by moving the end marker. - + Deck immediately loops if past the new endpoint. - + Loop Double - + Doubles the current loop's length by moving the end marker. - + Beatloop - + Toggles the current loop on or off. - + Works only if Loop-In and Loop-Out marker are set. - + Hint: Change the default cue mode in Preferences -> Interface. - + Vinyl Cueing Mode - + Determines how cue points are treated in vinyl control Relative mode: - + Off - Cue points ignored. - + One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + Hot Cue - Track will seek to nearest previous hot cue point. - + Track Time - + Track Duration - + Displays the duration of the loaded track. - + Information is loaded from the track's metadata tags. - + Track Artist - + Displays the artist of the loaded track. - + Track Title - + Displays the title of the loaded track. - + Track Album - + Displays the album name of the loaded track. - + Track Artist/Title - + Displays the artist and title of the loaded track. @@ -11668,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -11737,23 +11773,23 @@ TrackExportWorker - - + + Export process was canceled - + Error removing file %1: %2. Stopping. - + Error exporting track %1 to %2: %3. Stopping. - + Error exporting tracks @@ -11761,23 +11797,23 @@ TraktorFeature - - + + Traktor - + (loading) Traktor - + Error Loading Traktor Library - + There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. @@ -11785,27 +11821,27 @@ VSyncThread - + Timer (Fallback) - + MESA vblank_mode = 1 - + Wait for Video sync - + Sync Control - + Free + 1 ms (for benchmark only) @@ -11994,12 +12030,12 @@ Create &New Playlist - + ဖွင့်မည့်စာရင်း &အသစ် ပြုလုပ်ရန် Create a new playlist - + ဖွင့်မည့်စာရင်း တစ်ခု ပြုလုပ်ရန် @@ -12361,20 +12397,20 @@ WOverview - + Ready to play, analyzing .. Text on waveform overview when file is playable but no waveform is visible - - + + Loading track .. Text on waveform overview when file is cached from source - + Finalizing .. Text on waveform overview during finalizing of waveform analysis @@ -12383,63 +12419,63 @@ WSearchLineEdit - - + + Clear input Clear the search bar input field - + Ctrl+F Search|Focus - + Search... noun - + Search noun - + Enter a string to search for - + Shortcut - + Ctrl+F - + Focus Give search bar input focus - + Ctrl+Backspace - + Esc - + Exit search Exit search bar and leave focus @@ -12448,74 +12484,74 @@ WTrackTableView - + Add to Playlist - + ဖွင့်မည့်စာရင်း သို့ ထည့်ရန် - + Reset Reset metadata in right click track context menu in library - + Cover Art - + ESC Focus - + Remove ဖယ်ရှားပါ - + Remove from Playlist - + ဖွင့်မည့်စာရင်း မှ ဖယ်ရန် - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM @@ -12523,7 +12559,7 @@ Create New Playlist - + ဖွင့်မည့်စာရင်း အသစ် ပြုလုပ်ရန် @@ -12533,110 +12569,110 @@ Enter name for new playlist: - + ဖွင့်မည့်စာရင်း အသစ် အတွက် အမည်ရိုက်ထည့်ပါ: - + Load to - + Deck - + Sampler - + Crates - + Change BPM - + Add to Auto DJ Queue (Bottom) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အောက်​) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + အော်တို ဒီဂျေ တန်းစီခြင်း သို့ ထည့် ရန် (အစားထိုး) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 @@ -12650,55 +12686,55 @@ Playlist Creation Failed - + ဖွင့်မည့်စာရင်း ပြုလုပ်ခြင်း မအောင်မြင်ပါ A playlist by that name already exists. - + ဖွင့်မည့်စာရင်း အတွက် ပေးထားသော အမည်မှာ ရှိပြီးဖြစ်သည်။ A playlist cannot have a blank name. - + ဖွင့်မည့်စာရင်း အမည် ကို အလွတ်ထား၍ မရပါ။ An unknown error occurred while creating playlist: - + ဖွင့်မည့်စာရင်း ပြုလုပ်စဉ် မသိသော အမှားတစ်ခု ဖြစ်ခဲ့သည်: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 @@ -12714,15 +12750,25 @@ WaveformWidgetFactory - + (GLSL) - + (GL) + + + (GLSL ES) + + + + + (GL ES) + + mixxx::DlgTrackMetadataExport diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_nb.ts mixxx-2.2.4~dfsg/res/translations/mixxx_nb.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_nb.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_nb.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Legg til Kasse som Sporkilde @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Ny spilleliste @@ -110,7 +110,7 @@ - + Create New Playlist Opprett ny spilleliste @@ -156,82 +156,82 @@ Analysér hele spillelisten - + Enter new name for playlist: Skriv inn nytt navn for spilleliste: - + Duplicate Playlist Dupliser spillelisten - - + + Enter name for new playlist: Skriv inn nytt navn for spilleliste: - + Export Playlist Eksportér spilleliste - + Rename Playlist Gi spillelisten nytt navn - - + + Renaming Playlist Failed Navngivning av spilleliste mislyktes - - - + + + A playlist by that name already exists. Det finnes allerede en spilleliste med det navnet. - - - + + + A playlist cannot have a blank name. Spillelisten kan ikke ha en tomt navn. - + _copy [noun] Appendix to default name when duplicating a playlist Kopier - - - - - - + + + + + + Playlist Creation Failed Oppretting av spilleliste mislyktes - - + + An unknown error occurred while creating playlist: Det oppstod en ukjent feil under oppretting av spilleliste: - + M3U Playlist (*.m3u) M3U spilleliste (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Spilleliste (*.m3u);;M3U8 Spilleliste (*.m3u8);;PLS Spilleliste (*.pls);;Tekst CSV (*.csv);;Lesbar Tekst (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Fikk ikke lastet sporet @@ -2769,7 +2769,7 @@ - + Lock Lås @@ -2794,7 +2794,7 @@ - + Enter new name for crate: @@ -2812,38 +2812,38 @@ - + Export Crate Eksporter Kasse - + Unlock Lås opp - + An unknown error occurred while creating crate: En ukjent feil oppstod under oppretting av kasse: - + Rename Crate Endra navn på Kasse - - + + Renaming Crate Failed Endring av kassenavn mislykket - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Spilleliste (*.m3u);;M3U8 Spilleliste (*.m3u8);;PLS Spilleliste (*.pls);;Tekst CSV (*.csv);;Lesbar Tekst (*.txt) @@ -2863,12 +2863,12 @@ Kasser lar deg organisere musikken som du vil! - + A crate cannot have a blank name. En kasse kan ikke ha blankt navn. - + A crate by that name already exists. Det er allerede en kasse ved det navnet. @@ -2887,50 +2887,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Oppretting av kassen mislykket - + A crate cannot have a blank name. En kasse kan ikke ha blankt navn. - - + + A crate by that name already exists. Det er allerede en kasse ved det navnet. - - + + An unknown error occurred while creating crate: En ukjent feil oppstod under oppretting av kasse: - + copy [noun] - + Duplicate Crate Dupliser Kasse - - - + + + Duplicating Crate Failed @@ -5586,7 +5586,7 @@ DlgPrefRecord - + Choose recordings directory Velg opptakskatalog @@ -5801,113 +5801,113 @@ DlgPrefSound - + None Ingen - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Slått på - + Stereo Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Feil i oppsettet @@ -7378,15 +7378,28 @@ LibraryFeature - + Import Playlist Importer spilleliste - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Spilleliste filer (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7671,39 +7684,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7780,7 +7793,7 @@ - + Playlists Spillelister @@ -7790,27 +7803,27 @@ Lås opp - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Opprett ny spilleliste @@ -9275,7 +9288,7 @@ - + History @@ -9290,22 +9303,22 @@ Lås - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9495,23 +9508,23 @@ SoundManager - - + + a device - + An unknown error occurred En ukjent feil oppsto - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11695,12 +11708,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12497,68 +12510,68 @@ ESC - + Remove Fjern - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Egenskaper - + Open in File Browser Åpne i filutforsker - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Opprett ny spilleliste - + Create New Crate - + Enter name for new playlist: Skriv inn nytt navn for spilleliste: @@ -12588,144 +12601,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain Avspillingsnivå - + Waveform Bølgeform - + All Alle - + Deck %1 Spiller %1 - + New Playlist Ny spilleliste - - - + + + Playlist Creation Failed Oppretting av spilleliste mislyktes - + A playlist by that name already exists. Det finnes allerede en spilleliste med det navnet. - + A playlist cannot have a blank name. Spillelisten kan ikke ha en tomt navn. - + An unknown error occurred while creating playlist: Det oppstod en ukjent feil under oppretting av spilleliste: - + Lock BPM Lås BPM - + Unlock BPM Åpne BPM - + Double BPM Dobbel BPM - + Halve BPM Halv BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_nl-BE.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_nl-BE.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_nl-BE.ts mixxx-2.2.4~dfsg/res/translations/mixxx_nl-BE.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_nl-BE.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_nl-BE.ts 2020-05-15 21:26:10.000000000 +0000 @@ -26,7 +26,7 @@ Remove Crate as Track Source - + Verwijder platenbak als Track bron @@ -34,9 +34,9 @@ Auto DJ - + Add Crate as Track Source - + Voeg platenbak toe als Track bron @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nieuwe Afspeellijst @@ -110,7 +110,7 @@ - + Create New Playlist Nieuwe Afspeellijst aanmaken @@ -148,7 +148,7 @@ Export Track Files - + Exporteer Tracks @@ -156,82 +156,82 @@ Analyseer volledige Afspeellijst - + Enter new name for playlist: Voer nieuwe naam in voor Afspeellijst - + Duplicate Playlist Dupliceer Afspeellijst - - + + Enter name for new playlist: Voer naam in voor nieuwe afspeellijst: - + Export Playlist Exporteer Afspeellijst - + Rename Playlist Hernoem Afspeellijst - - + + Renaming Playlist Failed Afspeellijst hernoemen mislukt - - - + + + A playlist by that name already exists. Een afspeellijst met deze naam bestaan reeds. - - - + + + A playlist cannot have a blank name. Een Afspeellijst kan geen blanco naam bevatten. - + _copy [noun] Appendix to default name when duplicating a playlist _kopiëren - - - - - - + + + + + + Playlist Creation Failed Aanmaak van afspeellijst mislukt - - + + An unknown error occurred while creating playlist: Er is een onbekende fout opgetreden tijdens het maken van de afspeellijst: - + M3U Playlist (*.m3u) M3U speellijst(*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Speellijst (*.m3u);;M3U8 Speellijst (*.m3u8);;PLS Speellijst (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) @@ -276,7 +276,7 @@ Grouping - + Groeperen @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kan het nummer niet laden. @@ -390,12 +390,12 @@ Can't use secure password storage: keychain access failed. - + Kan geen veilige paswoordopslag gebruiken: toegang tot keychain mislukt Secure password retrieval unsuccessful: keychain access failed. - + Veilig ophalen van wachtwoord mislukt: toegang tot keychain mislukt. @@ -606,7 +606,7 @@ Grouping - + Groeperen @@ -642,7 +642,7 @@ No control chosen. - + Geen controle gekozen. @@ -655,7 +655,7 @@ Group - + Groep @@ -730,7 +730,7 @@ Effect Rack %1 - + Effect paneel %1 @@ -760,17 +760,17 @@ Headphone mix (pre/main) - + Hoofdtelefoon mix (pre/main) Toggle headphone split cueing - + Schakel tussen gesplitst geluid Headphone delay - + Hoofdtelefoon vertraging @@ -780,7 +780,7 @@ Strip-search through track - + Track grondig doorzoeken @@ -817,57 +817,57 @@ Reverse roll (Censor) button - + Reverse roll (Censor) knop Headphone listen button - + Luisterknop hoofdtelefoon Mute button - + Stilteknop Toggle repeat mode - + Activeer/deactiveer herhaalmodus Eject track - + Track uitwerpen Mix orientation (e.g. left, right, center) - + Orientatie van de mix (b.v. links, rechts, midden) Set mix orientation to left - + Orientatie mix links Set mix orientation to center - + Orientatie mix midden Set mix orientation to right - + Orientatie mix rechts Toggle slip mode - + Slip mode aan/uit @@ -878,891 +878,891 @@ Increase BPM by 1 - + Verhoog BPM met 1 Decrease BPM by 1 - + Verlaag BPM met 1 Increase BPM by 0.1 - + Verhoog BPM met 0.1 Decrease BPM by 0.1 - + Verlaag BPM met 0.1 BPM tap button - + BPM tikknop Toggle quantize mode - + Quantize mode aan/uit Increase internal master BPM by 1 - + Verhoog interne master BPM met 1 Decrease internal master BPM by 1 - + Verlaag interne master BPM met 1 Increase internal master BPM by 0.1 - + Verhoog interne master BPM met 0.1 Decrease internal master BPM by 0.1 - + Verlaag interne master BPM met 0.1 Toggle sync master - + Sync master aan/uit Sync mode 3-state toggle (OFF, FOLLOWER, MASTER) - + 3-standenschakelaar voor synchronisatiemodus (UIT, VOLG, MASTER) One-time beat sync (tempo only) - + Eenmalige beat-synchronisatie (alleen tempo) One-time beat sync (phase only) - + Eenmalige beat-synchronisatie (alleen fase) Toggle keylock mode - + Key-lock mode aan/uit Equalizers - + Equalizers Vinyl Control - + Vinyl Control Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Wisselknop cueing mode met vinylregeling (UIT / EEN / HOT) Toggle vinyl-control mode (ABS/REL/CONST) - + Wisselknop vinyl-control modus (ABS/REL/CONST) Pass through external audio into the internal mixer - + Via externe audio naar de interne mixer doorgeven Cues - + Cues Cue button - + Cue knop Set cue point - + Stel het cue-punt in Go to cue point - + Ga naar het cue-punt Go to cue point and play - + Ga naar het cue-punt en speel Go to cue point and stop - + Ga naar het cue-punt en stop Preview from cue point - + Voorbeluisteren vanaf het cue-punt Cue button (CDJ mode) - + Cue-knop (CDJ modus) Stutter cue - + Stutter cue Hotcues - + Hotcues Set, preview from or jump to hotcue %1 - + Stel in, voorbeluisteren van of spring naar hotcue% 1 Clear hotcue %1 - + Wis hotcue %1 Set hotcue %1 - + Stel hotcue %1 in. Jump to hotcue %1 - + Spring naar hotcue %1 Jump to hotcue %1 and stop - + Spring naar hotcue %1 en stop Jump to hotcue %1 and play - + Spring naar hotcue %1 en speel Preview from hotcue %1 - + Voorbeluisteren vanaf hotcue %1 Hotcue %1 - + Hotcue %1 Looping - + Looping Loop In button - + Loop In knop Loop Out button - + Loop Out knop Loop Exit button - + Loop Exit knop 1/2 - + 1/2 1 - + 1 2 - + 2 4 - + 4 8 - + 8 16 - + 16 32 - + 32 64 - + 64 Move loop forward by %1 beats - + Verplaats loop voorwaarts met %1 beats Move loop backward by %1 beats - + Verplaats loop achteruit met %1 beats Beat-Looping - + beat-Looping Create %1-beat loop - + Maak %1-beat loop Create temporary %1-beat loop roll - + Maak een tijdelijke % 1-beat loop roll Library - + Bibliotheek Unit %1 - + Eenheid %1 Slot %1 - + Slot %1 Master crossfader - + Master crossfader Master Balance - + Master Balance Master Delay - + Master Delay Headphone Mix - + Hoofdtelefoon Mix Headphone Split Cue - + Hoofdtelefoon Split Cue Headphone Delay - + Hoofdtelefoon Delay Play - + Speel Fast Rewind - + Snel Terugspoelen Fast Rewind button - + Snelterugspoel-knop Fast Forward - + Snel Voorwaarts Fast Forward button - + Snelvoorwaarts-knop Strip Search - + Grondig zoeken Play Reverse - + Speel achteruit Play Reverse button - + Achteruitspeel-knop Reverse Roll (Censor) - + Reverse Roll (Censor) Jump To Start - + Spring naar begin Jumps to start of track - + Spring naar begin van de track Play From Start - + Speel vanaf begin Stop - + Stop Stop And Jump To Start - + Stop en spring naar begin Stop playback and jump to start of track - + Stop afspelen en spring naar begin Jump To End - + Spring naar einde Volume - + Volume Volume Fader - + Volume Regelaar Full Volume - + Volledig Volume Zero Volume - + Geen Volume Track Gain - + Track Gain Track Gain knob - + Track Gain knop Mute - + Dempen Eject - + Uitwerpen Headphone Listen - + Hoofdtelefoon Luisteren Headphone listen (pfl) button - + Hoofdtelefoon Luisteren (pfl) knop Repeat Mode - + Herhaal Modus Slip Mode - + Slip Modus Orientation - + Positionering Orient Left - + Positioneer Links Orient Center - + Positioneer Midden Orient Right - + Positioneer Rechts BPM +1 - + BPM +1 BPM -1 - + BPM -1 BPM +0.1 - + BPM +0.1 BPM -0.1 - + BPM -0.1 BPM Tap - + BPM Tik Adjust Beatgrid Faster +.01 - + Pas Beatraster aan naar Sneller +.01 Increase track's average BPM by 0.01 - + Verhoog de track's gemiddelde BPM met 0.01 Adjust Beatgrid Slower -.01 - + Pas Beat-raster aan naar Trager -.01 Decrease track's average BPM by 0.01 - + Verlaag de track's gemiddelde BPM met 0.01 Move Beatgrid Earlier - + Verplaats Beatgrid naar eerder Adjust the beatgrid to the left - + Pas het beat-raster naar links aan Move Beatgrid Later - + Verplaats Beat-raster naar later Adjust the beatgrid to the right - + Pas het beat-raster naar rechts aan Adjust Beatgrid - + Pas Beat-raster aan Align beatgrid to current position - + Lijn beat-raster uit met huidige positie Adjust Beatgrid - Match Alignment - + Pas Beat-raster aan - Overeenkomst Uitlijning Adjust beatgrid to match another playing deck. - + Pas Beat-raster overeenkomstig aan andere speler Quantize Mode - + Quantize modus Sync - + Sync Sync Mode - + Sync Modus Internal Sync Master - + Interne Sync Master Toggle Internal Sync Master - + Interne Sync Master aan/uit Internal Master BPM - + Interne Master BPM Internal Master BPM +1 - + Interne Master BPM +1 Internal Master BPM -1 - + Interne Master BPM -1 Internal Master BPM +0.1 - + Interne Master BPM +0.1 Internal Master BPM -0.1 - + Interne Master BPM -0.1 Sync Master - + Sync Master Beat Sync One-Shot - + Eenmalige beat-synchronisatie Sync Tempo One-Shot - + Synchroniseer tempo eenmalig Sync Phase One-Shot - + Synchroniseer faze eenmalig Speed (Pitch/Tempo) - + Snelheid (Pitch/Tempo) Keylock Mode - + Keylock Modus Pitch control (does not affect tempo), center is original pitch - + Pitch controle (geen invloed op tempo), midden is de originele pitch Pitch Adjust - + Aanpassen Pitch Adjust pitch from speed slider pitch - + Pas pitch aan met de pitch schuifregelaar Match musical key - + Muziekale key overeenstemmen Match Key - + Key overeenstemmen Reset Key - + Key resetten Resets key to original - + Key resetten naar origineel High EQ - + High EQ Mid EQ - + Mid EQ Low EQ - + Low EQ Toggle Vinyl Control - + Vinyl Control aan/uit Toggle Vinyl Control (ON/OFF) - + Wissel Vinyl Control (AAN/UIT) Vinyl Control Mode - + Vinyl Control Modus Vinyl Control Cueing Mode - + Vinyl Control Cueing Modus Vinyl Control Passthrough - + Vinylbediening doorvoeren Vinyl Control Next Deck - + Vinylbediening Volgende Speler Single deck mode - Switch vinyl control to next deck - + Enkelvoudige Speles modus - Wissel vinylbediening naar volgende speler Cue - + Verwijzing Set Cue - + Verwijzing instellen Go-To Cue - + Ga Naar verwijzing Go-To Cue And Play - + Ga Naar verwijzing en Speel Go-To Cue And Stop - + Ga Naar verwijzing en Stop Preview Cue - + Verwijzing voorbeluisteren Cue (CDJ Mode) - + Verwijzing (CDJ Modus) Stutter Cue - + Voeg de geselecteerde track vooraan toe in de AutoDJ wachtrij Go to cue point and play after release - + Ga Naar het verwijzingspunt en speel na het loslaten Clear Hotcue %1 - + Wis Hotcue %1 Set Hotcue %1 - + Stel Hotcue %1 in Jump To Hotcue %1 - + Spring naar Hotcue %1 Jump To Hotcue %1 And Stop - + Spring naar Hotcue %1 en Stop Jump To Hotcue %1 And Play - + Spring naar Hotcue %1 en Speel Preview Hotcue %1 - + Hotcue %1 voorbeluisteren Loop In - + Loop In Loop Out - + Loop Out Loop Exit - + Verlaat Loop Reloop/Exit Loop - + Reloop/Verlaat Loop Loop Halve - + Halve Loop Loop Double - + Dubbele Loop 1/32 - + 1/32 1/16 - + 1/16 1/8 - + 1/8 1/4 - + 1/4 Move Loop +%1 Beats - + Verplaats Loop +%1 Beats Move Loop -%1 Beats - + Verplaats Loop -%1 Beats Loop %1 Beats - + Loop %1 Beats Loop Roll %1 Beats - + Loop lus %1 Beats @@ -1772,7 +1772,7 @@ Append the selected track to the Auto DJ Queue - + Voeg de geselecteerde track toe aan de Auto DJ wachtrij @@ -1782,108 +1782,108 @@ Prepend selected track to the Auto DJ Queue - + Voeg de geselecteerde track vooraan toe in de AutoDJ wachtrij Load Track - + Track Laden Load selected track - + Geselecteerde tracks laden Track Load and Play - + Laad track en speel Load selected track and play - + Laad geselecteerde track en speel Record Mix - + Record Mix Toggle mix recording - + Wissel Opname Mix Effects - + Effecten Quick Effects - + Snelle Effecten Deck %1 Quick Effect Super Knob - + Superknop snelle effecten speler %1 Quick Effect Super Knob (control linked effect parameters) - + Superknop Snelle Effecten (bedien gekoppelde effectparameters) Quick Effect - + Snel Effect Clear effect rack - + Wis effecten rack Clear Effect Rack - + Wis Effecten Rack Clear Unit - + Wis Eenheid Clear effect unit - + Wis effecten eenheid Toggle Unit - + Wissel Eenheid Dry/Wet - + Droog/Nat Adjust the balance between the original (dry) and processed (wet) signal. - + Pas de balans tussen het originele (droge) en verwerkte (natte) signaal aan. Super Knob - + Super knop Next Chain - + Volgende Schakel @@ -1895,633 +1895,633 @@ Assign - + Toewijzen Clear - + Wissen Clear the current effect - + Wis het huidige effect Toggle - + Omschakelen Toggle the current effect - + Huidig effect omschakelen Next - + Volgende Switch to next effect - + Schakel naar volgend effect Previous - + Vorige Switch to the previous effect - + Schakel naar vorig effect Next or Previous - + Volgende of Vorige Switch to either next or previous effect - + Schakel ofwel naar volgende of vorig effect Parameter Value - + Parameter Waarde Microphone Ducking Strength - + Onderdrukkingssterkte Microfoon Microphone Ducking Mode - + Onderdrukkingsmodus Microfoon Gain - + Versterken Gain knob - + Knop Versterken Shuffle the content of the Auto DJ queue - + Schud de inhoud van de Auto DJ-wachtrij Skip the next track in the Auto DJ queue - + Het volgende nummer overslaan in de Auto DJ-wachtrij Auto DJ Toggle - + Auto DJ omschakelen Toggle Auto DJ On/Off - + Schakel Auto DJ Aan/Uit Library Maximize/Restore - + Bibliotheek Maximaliseren/Herstellen Maximize the track library to take up all the available screen space. - + Maximaliseer de trackbibliotheek in de beschikbare schermruimte. Effect Rack Show/Hide - + Effeceten rack Tonen/Verbergen Show/hide the effect rack - + Toon/Verberg het effecten rack Cover Art Show/Hide - + Hoes Tonen/Verbergen Show/hide cover art - + Toon/Verberg hoes Waveform Zoom Out - + Waveform Uitzoomen Toggle Effect Unit - + Schakel Effecteneenheid om Master Gain - + Hoofduitgang Versterking Master gain - + Hoofduitgang versterking Headphone Gain - + Hoofdtelefoon Versterking Headphone gain - + Hoofdtelefoon versterking Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + Tik om het tempo te synchroniseren (en fase met quantize ingeschakeld), houd ingedrukt om permanente synchronisatie in te schakelen One-time beat sync tempo (and phase with quantize enabled) - + Eenmalig beat-synchronisatietempo (en fase met quantize ingeschakeld) Playback Speed - + Afspeelsnelheid Playback speed control (Vinyl "Pitch" slider) - + Bediening afspeelsnelheid (Vinyl "Pitch" regelaar) Pitch (Musical key) - + Pitch (Toonhoogte) Increase Speed - + Snelheid verhogen Adjust speed faster (coarse) - + Snelheid hoger bijstellen (grof) Increase Speed (Fine) - + Verhoog snelheid (fijn) Adjust speed faster (fine) - + Snelheid hoger bijstellen (fijn) Decrease Speed - + Snelheid verlagen Adjust speed slower (coarse) - + Snelheid lager bijstellen (grof) Adjust speed slower (fine) - + Snelheid lager bijstellen (fijn) Temporarily Increase Speed - + Snelheid tijdelijk verhogen Temporarily increase speed (coarse) - + Snelheid tijdelijk verhogen (grof) Temporarily Increase Speed (Fine) - + Snelheid tijdelijk verhogen (fijn) Temporarily increase speed (fine) - + Snelheid tijdelijk verhogen (fijn) Temporarily Decrease Speed - + Snelheid Tijdelijk Verlagen Temporarily decrease speed (coarse) - + Snelheid tijdelijk verlagen (grof) Temporarily Decrease Speed (Fine) - + Snelheid Tijdelijk Verlagen (Fijn) Temporarily decrease speed (fine) - + Snelheid tijdelijk verlagen (fijn) Adjust %1 - + Bijstellen %1 Kill %1 - + Dempen %1 CUP (Cue + Play) - + CUP (Cue + Afspelen) Loop Selected Beats - + Loop Geselecteerde Beats Create a beat loop of selected beat size - + Maak een beat loop van de geselecteerde beatgrootte Loop Roll Selected Beats - + Loop Roll van geselecteerde beats Create a rolling beat loop of selected beat size - + Maak een rollende beat loop van de geselecteerde beatgrootte Toggle loop on/off and jump to Loop In point if loop is behind play position - + Schakel het loopen aan/uit en spring naar het Loop-In punt als de loop zich achter de afspeelpositie bevindt Reloop And Stop - + Reloop En Stop Enable loop, jump to Loop In point, and stop - + Schakel het loopen in, spring naar Loop-In punt en stop Halve the loop length - + Halveer de Loop lengte Double the loop length - + Verdubbel de Loop lengte Beat Jump / Loop Move - + Beat Jump / Loop Move Jump / Move Loop Forward %1 Beats - + Spring / verplaats Loop vooruit% 1 Beats Jump / Move Loop Backward %1 Beats - + Spring / verplaats Loop achteruit% 1 Beats Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - + Spring vooruit met %1 beats, of als een loop is ingeschakeld, verplaats de loop naar voren met %1 beats Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - + Spring achteruit met %1 slagen, of als een loop is ingeschakeld, verplaats de loop achteruit %1 beats Beat Jump / Loop Move Forward Selected Beats - + Beat Jump / Loop Move Geselecteerde Beats Voorwaarts Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - + Spring vooruit met het aantal geselecteerde beats, of als een loop is ingeschakeld, verplaats de loop naar voren met het aantal geselecteerde beats Beat Jump / Loop Move Backward Selected Beats - + Beat Jump / Loop Move Geselecteerde Beats Achteruit Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - + Spring achteruit met het aantal geselecteerde beats, of als een loop is ingeschakeld, verplaats de loop achteruit met het aantal geselecteerde beats Move up - + Omhoog Equivalent to pressing the UP key on the keyboard - + Vergelijkbaar met het indrukken van de PgUp-toets op het toetsenbord Move down - + Omlaag Equivalent to pressing the DOWN key on the keyboard - + Vergelijkbaar met het indrukken van de PgDn-toets op het toetsenbord Move up/down - + Omhoog/Omlaag Move vertically in either direction using a knob, as if pressing UP/DOWN keys - + Beweeg verticaal in beide richtingen met een knop, alsof u op de toetsen OMHOOG / OMLAAG drukt Scroll Up - + Naar Boven Scrollen Equivalent to pressing the PAGE UP key on the keyboard - + Vergelijkbaar met het indrukken van de PgUp-toets op het toetsenbord Scroll Down - + Naar Beneden Scrollen Equivalent to pressing the PAGE DOWN key on the keyboard - + Vergelijkbaar met het indrukken van de PAGE DOWN-toets op het toetsenbord Scroll up/down - + Scroll omhoog/omlaag Scroll vertically in either direction using a knob, as if pressing PGUP/PGDOWN keys - + Beweeg verticaal in beide richtingen met een knop, alsof u de toetsen PGUP / PGDOWN indrukt Move left - + Naar links Equivalent to pressing the LEFT key on the keyboard - + Vergelijkbaar met het indrukken van de LEFT-toets op het toetsenbord Move right - + Naar rechts Equivalent to pressing the RIGHT key on the keyboard - + Vergelijkbaar met het indrukken van de RIGHT-toets op het toetsenbord Move left/right - + Ga naar links/rechts Move horizontally in either direction using a knob, as if pressing LEFT/RIGHT keys - + Beweeg horizontaal in beide richtingen met een knop, alsof u de toetsen LINKS / RECHTS indrukt Move focus to right pane - + Verplaats de focus naar het rechter deelvenster Equivalent to pressing the TAB key on the keyboard - + Vergelijkbaar met het indrukken van de TAB-toets op het toetsenbord. Move focus to left pane - + Verplaats de focus naar het linker deelvenster. Equivalent to pressing the SHIFT+TAB key on the keyboard - + Vergelijkbaar met het indrukken van de SHIFT+TAB toetsen op het toetsenbord Move focus to right/left pane - + Verplaats de focus naar het rechter / linker deelvenster Move focus one pane to right or left using a knob, as if pressing TAB/SHIFT+TAB keys - + Verplaats de focus één deelvenster naar rechts of links met een knop, alsof u op de TAB / SHIFT + TAB-toetsen drukt Go to the currently selected item - + Ga naar het huidig geselecteerde item. Choose the currently selected item and advance forward one pane if appropriate - + Kies het momenteel geselecteerde item en ga indien nodig één venstergedeelte vooruit Add to Auto DJ Queue (replace) - + Voeg toe aan de Auto DJ wachtrij (vervang) Replace Auto DJ Queue with selected tracks - + Vervang de Auto DJ wachtrij met de geselecteerde tracks Deck %1 Quick Effect Enable Button - + Speler %1 Snel Effect Inschakelknop Quick Effect Enable Button - + Snel Effect Inschakelknop Enable or disable effect processing - + Effectverwerking in- of uitschakelen Super Knob (control effects' Meta Knobs) - + Super Knop (heeft controle over de Meta Knoppen effecten) Mix Mode Toggle - + Mix Modus Schakelen Toggle effect unit between D/W and D+W modes - + Wissel effecteenheid tussen de modi D/W en D+W Next chain preset - + Volgende vooringestelde keten Previous Chain - + Vorige keten Previous chain preset - + Vorige vooringestelde keten Next/Previous Chain - + Volgende/Vorige Keten Next or previous chain preset - + Volgende of vorige vooringestelde keten Show Effect Parameters - + Toon Effect Parameters Meta Knob - + Meta Knop Effect Meta Knob (control linked effect parameters) - + Effect Meta Knop (controleert gelinkte effect parameters) Meta Knob Mode - + Meta Knop Modus Set how linked effect parameters change when turning the Meta Knob. - + Stel in hoe gekoppelde effectparameters veranderen bij het draaien van de Meta Knop. Meta Knob Mode Invert - + Meta Knop Modus Omkeren Invert how linked effect parameters change when turning the Meta Knob. - + Keer om hoe gekoppelde effectparameters veranderen wanneer u aan de Meta-knop draait. Microphone / Auxiliary - + Microfoon / Aux Microphone On/Off - + Microfoon Aan/Uit Microphone on/off - + Microfoon aan/uit Toggle microphone ducking mode (OFF, AUTO, MANUAL) - + Wisselen van onderdrukkingsmodus (UIT, AUTO, MANUEEL) Auxiliary On/Off - + AUX Aan/Uit Auxiliary on/off - + AUX aan/uit @@ -2531,102 +2531,102 @@ Auto DJ Shuffle - + Auto DJ Schudden Auto DJ Skip Next - + Auto DJ Volgende Overslaan Auto DJ Fade To Next - + Auto DJ Invloeien Naar Volgende Trigger the transition to the next track - + Activeer de overgang naar het volgende nummer User Interface - + Gebruikersomgeving Samplers Show/Hide - + Samplers Toon/Verberg Show/hide the sampler section - + Toon/Verberg Sampler sectie Microphone Show/Hide - + Microfoon Toon/Verberg Show/hide the microphone section - + Toon/Verberg de microfoon sectie Vinyl Control Show/Hide - + Vinyl Controle Toon/Verberg Show/hide the vinyl control section - + Toon/Verberg de vinyl controle sectie Preview Deck Show/Hide - + Speler Voorbeluisteren Toon/Verberg Show/hide the preview deck - + Toon/Verberg de Voorbeluister-speler Vinyl Spinner Show/Hide - + Vinyl Spinner Toon/Verberg Show/hide spinning vinyl widget - + Toon/Verberg de spinning vinyl widget Waveform zoom - + Waveform zoom Waveform Zoom - + Waveform Zoom Zoom waveform in - + Waveform inzoomen Waveform Zoom In - + Waveform Inzoomen Zoom waveform out - + Waveform uitzoomen @@ -2634,37 +2634,37 @@ Uncaught exception at line %1 in file %2: %3 - + Fout:Niet-opgevangen uitzondering (Uncaught Exception) op regel %1 in bestand %2:%3 Uncaught exception at line %1 in passed code: %2 - + Fout: Uncaught exception op regel 1% in doorgegeven code: 2% Controller script error - + Controller scriptfout A control you just used is not working properly. - + Een stuureenheid die u zojuist hebt gebruikt werkt niet goed. The script code needs to be fixed. - + De script code moet hersteld worden. For now, you can: Ignore this error for this session but you may experience erratic behavior. - + Voor nu kunt u: deze fout voor deze sessie negeren, maar u kunt onstabiel gedrag ervaren. Try to recover by resetting your controller. - + Probeer te herstellen door uw controller te resetten. @@ -2672,27 +2672,27 @@ Channel - + Kanaal Opcode - + Opcode Control - + Bediening Options - + Opties Action - + Actie @@ -2705,42 +2705,42 @@ Channel - + Kanaal Opcode - + Opcode Control - + Bediening On Value - + Aan-waarde Off Value - + Uit-Waarde Action - + Actie On Range Min - + Op Min bereik On Range Max - + Op Max bereik @@ -2759,7 +2759,7 @@ Create New Crate - + Maak nieuwe krat @@ -2768,14 +2768,14 @@ - + Lock Vergrendelen Export Track Files - + Exporteer Tracks @@ -2785,17 +2785,17 @@ Analyze entire Crate - + Analyseer volledige krat Auto DJ Track Source - + Auto DJ Track Bron - + Enter new name for crate: - + Geef nieuwe naam voor krat: @@ -2807,69 +2807,69 @@ Import Crate - + Importeer krat - + Export Crate - + Exporteer krat - + Unlock - + Ontgrendel - + An unknown error occurred while creating crate: - + Een onbekende fout opgetreden bij het maken krat: - + Rename Crate - + Hernoem krat - - + + Renaming Crate Failed - + Hernoemen krat mislukt - + Crate Creation Failed - + Aanmaken krat mislukt - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Speellijst (*.m3u);;M3U8 Speellijst (*.m3u8);;PLS Speellijst (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) Crates are a great way to help organize the music you want to DJ with. - + Kratten zijn een geweldige manier om de muziek te organiseren waarmee je wilt DJ'en. Make a crate for your next gig, for your favorite electrohouse tracks, or for your most requested songs. - + Maak een krat voor je volgende optreden, voor je favoriete electrohouse-nummers of voor je meest gevraagde nummers. Crates let you organize your music however you'd like! - + Kratten laten je toe om je muziek te organiseren zoals jij dat wil! - + A crate cannot have a blank name. - + Een krat kan geen lege naam hebben. - + A crate by that name already exists. - + Een krat met deze naam bestaat al. @@ -2877,61 +2877,61 @@ New Crate - + Nieuwe krat Create New Crate - + Maak nieuwe krat - + Enter name for new crate: - + Geef naam in voor nieuwe krat: - - + + Creating Crate Failed - + Krat aanmaken mislukt - + A crate cannot have a blank name. - + Een krat kan geen lege naam hebben. - - + + A crate by that name already exists. - + Een krat met deze naam bestaat al. - - + + An unknown error occurred while creating crate: - + Een onbekende fout opgetreden bij het maken krat: - + copy [noun] - + kopieer - + Duplicate Crate - + Krat dupliceren - - - + + + Duplicating Crate Failed - + Krat dupliceren mislukt @@ -2939,27 +2939,27 @@ Mixxx %1 Development Team - + Mixxx %1 Ontwikkelaarsteam With contributions from: - + Met bijdragen van: And special thanks to: - + En speciale dank aan: Past Developers - + Eerdere Ontwikkelaars Past Contributors - + Eerdere Medewerkers @@ -2967,22 +2967,22 @@ About Mixxx - + Over Mixxx Credits - + Dankwoord License - + Licentie <a href="http://mixxx.org/">Official Website</a> - + <a href="http://mixxx.org/">Officiele Website</a> @@ -2997,52 +2997,52 @@ Shows tracks added to the library within the last 7 days. - + Toont tracks die in de afgelopen 7 dagen aan de bibliotheek zijn toegevoegd. New - + Nieuw Shows all tracks in the library. - + Toon alle tracks in de bibliotheek. All - + Alle Progress - + Voortgang Selects all tracks in the table below. - + Selecteer alle tracks in de tabel hieronder. Select All - + Selecteer Alles Runs beatgrid, key, and ReplayGain detection on the selected tracks. Does not generate waveforms for the selected tracks to save disk space. - + Voert beat-rooster-, toonaard- en afspeelversterking-detectie uit op de geselecteerde tracks. Genereert geen golfvormen op de geselecteerde tracks om schijfruimte te besparen. Stop Analysis - + Stop Analyse Analyzing %1/%2 %3% - + Analyseren van %1/%2 %3% @@ -3050,23 +3050,23 @@ One deck must be stopped to enable Auto DJ mode. - + Eén speler moet gestopt worden om Auto DJ modus in te schakelen. Decks 3 and 4 must be stopped to enable Auto DJ mode. - + Spelers 3 en 4 moeten gestopt worden om Auto DJ modus in te schakelen. Disable Auto DJ - + Schakel Auto DJ uit Displays the duration and number of selected tracks. - + Geeft de duur en het aantal geselecteerde tracks weer. @@ -3078,71 +3078,72 @@ Shuffle - + Schudden Add Random - + Willekeurig toevoegen Shuffle the content of the Auto DJ queue. - + Schud de inhoud van de Auto DJ-wachtrij. Adds a random track from track sources (crates) to the Auto DJ queue. If no track sources are configured, the track is added from the library instead. - + Voegt een willekeurig nummer van nummerbronnen (kratten) toe aan de Auto DJ-wachtrij. +Als er geen trackbronnen zijn geconfigureerd, wordt de track toegevoegd vanuit de bibliotheek. Skip the next track in the Auto DJ queue. - + Het volgende nummer overslaan in de Auto DJ-wachtrij. Skip Track - + Track overslaan Trigger the transition to the next track. - + Activeer de overgang naar de volgende track. Fade Now - + Fade nu Determines the duration of the transition. - + Bepaalt de duur van de overgang. Seconds "sec." as in seconds - + Seconden sec. - + sec. Turn Auto DJ on or off. - + Schakel Auto DJ in of uit. Enable Auto DJ - + Schakel Auto DJ in @@ -3151,98 +3152,104 @@ When beat detection is enabled, Mixxx detects the beats per minute and beats of your tracks, automatically shows a beat-grid for them, and allows you to synchronize tracks using their beat information. - + Wanneer beat detectie is ingeschakeld, detecteert Mixxx de beats per minuut en beats van je tracks, +toont hiervoor automatisch een beat-raster en stelt u in staat tracks te synchroniseren met behulp van hun beat-informatie. Enable BPM and Beat Detection - + Schakel BPM en Beat Detectie in Choose between different algorithms to detect beats. - + Kies tussen verschillende algoritmen om beats te detecteren. Enable fast beat detection. If activated Mixxx only analyzes the first minute of a track for beat information. This can speed up beat detection on slower computers but may result in lower quality beatgrids. - + Activeer snelle beat-detectie.Als dit aan staat, dan analyseert Mixxx enkel de eerste minuut van een track voor beat informatie. +Dit kan de beat detectie versnellen, maar heeft mogelijk een verminderde kwaliteit van beat-rasters als gevolg. Attempts to correct the phase (first beat) of fixed-tempo beatgrids by analyzing the beats to discard outliers. - + Probeert de fase (eerste beat) te corrigeren van beat-rasters met vast tempo +door de beats te analyseren ten einde uitschieters over te slaan. Beat Detection Preferences - + Beat Detectie Voorkeuren Choose Analyzer - + Kies Analysator Beat Analyzer: - + Beat Analysator: Analyzer Settings - + Instellingen Analysator Enable Fast Analysis (For slow computers, may be less accurate) - + Snelle Analyse Inschakelen (voor langzame computers is dit mogelijk minder nauwkeurig) Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Zet de door de analysator gedetecteerde beats om in een beat-raster met een vast tempo. +Gebruik deze instelling als uw tracks een constant tempo hebben (bijv. De meeste elektronische muziek). +Dit resulteert vaak in beat-rasters van hogere kwaliteit, maar zal het niet goed doen op tracks met tempoveranderingen. Assume constant tempo (Recommended) - + Ga uit van een constant tempo (Aanbevolen) Enable Offset Correction (Recommended) - + Offset-correctie inschakelen (Aanbevolen) e.g. from 3rd-party programs or Mixxx versions before 1.11. (Not checked: Analyze only, if no beats exist.) - + bijv. van programma's van derden of Mixxx-versies vóór 1.11. +(Niet aangevinkt: alleen analyseren, als er geen beats bestaan.) Re-analyze beats when settings change or beat detection data is outdated - + Analyseer beats opnieuw wanneer instellingen veranderen of de detectie-data van de beat verouderd zijn BPM Range - + BPM-Bereik Min: - + Min: Max: - + Max: @@ -3250,147 +3257,147 @@ Controller Learning Wizard - + Controller Aanleer Assistent Learn - + Aanleren Close - + Sluiten Choose Control... - + Kies Bediening... Hints: If you're mapping a button or switch, only press or flip it once. For knobs and sliders, move the control in both directions for best results. Make sure to touch one control at a time. - + Tip: Om een drukknop of schakelaar te koppelen, één keer drukken of omschakelen. Voor draaiknoppen en schuiven, de bediening in beide richtingen bewegen voor optimaal resultaat. Let er op om slechts één bedieningselement tegelijk aan te raken. Cancel - + Annuleren Advanced MIDI Options - + Geavanceerde MIDI Opties Switch mode interprets all messages for the control as button presses. - + Switch-modus interpreteert alle berichten voor het bedieningselement alsof de knop wordt ingedrukt. Switch Mode - + Wijzig Modus Ignores slider or knob movements until they are close to the internal value. This helps prevent unwanted extreme changes while mixing but can accidentally ignore intentional rapid movements. - + Negeert schuif- of knopbewegingen totdat ze dicht bij de interne waarde liggen. Dit helpt het voorkomen van ongewenste extreme veranderingen tijdens het mixen, maar kan per ongeluk opzettelijke snelle bewegingen negeren. Soft Takeover - + Software Overname Reverses the direction of the control. - + Draait de richting van het bedieningselement om. Invert - + Draai Om For jog wheels or infinite-scroll knobs. Interprets incoming messages in two's complement. - + Voor jogwielen of blijvende doordraai-knoppen. Interpreteert inkomende berichten in het 2-complement. Jog Wheel / Select Knob - + Jogwiel / Selectieknop Retry - + Opnieuw Proberen Learn Another - + Een Andere Aanleren Done - + Gereed Click anywhere in Mixxx or choose a control to learn - + Klik ergens in Mixxx of kies een besturingselement om te leren You can click on any button, slider, or knob in Mixxx to teach it that control. You can also type in the box to search for a control by name, or click the Choose Control button to select from a list. - + Je kunt op een willekeurige knop, schuifregelaar of regelaar in Mixxx klikken om hem dat element aan te leren. U kunt ook in het vak typen om naar een besturingselement op naam te zoeken, of klik op de knop Besturingselement Kiezen om uit een lijst te selecteren. Now test it out! - + Test het nu uit! If you manipulate the control, you should see the Mixxx user interface respond the way you expect. - + Als u de besturing manipuleert, zou u de Mixxx-gebruikersinterface moeten zien reageren zoals u het verwacht. Not quite right? - + Niet helemaal juist? If the mapping is not working try enabling an advanced option below and then try the control again. Or click Retry to redetect the midi control. - + Als de koppeling niet werkt, probeer dan een geavanceerde optie hieronder in te schakelen en probeer het vervolgens opnieuw. Of klik op Opnieuw Proberen om de midi-besturing opnieuw te detecteren. Didn't get any midi messages. Please try again. - + Geen MIDI-berichten ontvangen. Probeer het opnieuw a.u.b. Unable to detect a mapping -- please try again. Be sure to only touch one control at once. - + Kan een toewijzing niet detecteren - probeer het opnieuw a.u.b. Zorg ervoor dat u slechts één bedieningselement tegelijk aanraakt. Successfully mapped control: - + Bediening met succes toegewezen: <i>Ready to learn %1</i> - + <i>Kaar om te leren %1</i> Learning: %1. Now move a control on your controller. - + Aan Het Leren:% 1. Verplaats nu een besturingselement op uw controller. @@ -3398,7 +3405,10 @@ This could be because you are using an old skin and this control is no longer supported. You tried to learn: %1,%2 - + De controle die je hebt aangeklikt in Mixxx is niet aan te leren. +Dit kan zijn omdat u een oude skin gebruikt en deze controle niet langer wordt ondersteund. + +Je hebt geprobeerd te leren:% 1,% 2 @@ -3406,37 +3416,37 @@ Developer Tools - + Tools voor Ontwikkelaars Controls - + Besturingen Dumps all ControlObject values to a csv-file saved in the settings path (e.g. ~/.mixxx) - + Dumpt alle BesturingsObject-waarden naar een csv-bestand dat wordt opgeslagen in het instellingenpad (bijv. ~/.mixxx) Dump to csv - + Naar csv dumpen Log - + Log Search - + Zoeken Stats - + Statussen @@ -3444,42 +3454,42 @@ Hidden Tracks - + Verborgen Tracks Selects all tracks in the table below. - + Selecteer alle tracks in de tabel hieronder. Select All - + Selecteer Alles Purge selected tracks from the library. - + Verwijder geselecteerd tracks uit de bibliotheek. Purge - + Verwijder Unhide selected tracks from the library. - + Maak geselecteerde tracks zichtbaar voor de bibliotheek. Unhide - + Zichtbaar maken Ctrl+S - + Ctrl+S @@ -3487,27 +3497,27 @@ Missing Tracks - + Ontbrekende Tracks Selects all tracks in the table below. - + Selecteer alle tracks in de tabel hieronder. Select All - + Selecteer Alles Purge selected tracks from the library. - + Verwijder geselecteerd tracks uit de bibliotheek. Purge - + Verwijder @@ -3516,13 +3526,13 @@ Off - + Uit On - + Aan @@ -3530,77 +3540,77 @@ Re-queue tracks after playback - + Zet track opnieuw in wachtrij na het afspelen Duration after which a track is eligible for selection by Auto DJ again - + Duurtijd waarna een track opnieuw in aanmerking komt voor selectie door Auto DJ hh:mm - + hh:mm Minimum available tracks in Track Source - + Minimum aantal beschikbare tracks in de trackbron Auto DJ Preferences - + Auto DJ Voorkeuren Add a track to the end of the Auto DJ queue once it is played, instead of removing it. - + Voeg een track toe aan het einde van de Auto DJ-wachtrij zodra deze is afgespeeld, in plaats van deze te verwijderen. This percentage of tracks are always available for selecting, regardless of when they were last played. - + Dit percentage tracks is altijd beschikbaar om te selecteren, ongeacht wanneer ze voor het laatst zijn afgespeeld. % - + % Uncheck, to ignore all played tracks. - + Afvinken, om alle reeds gespeelde tracks te negeren. Suspend track in Track Source from re-queue - + Track ontheffen in trackbron van opnieuw toevoegen Suspension period for track selection - + Ontheffingsperiode voor track selectie Enable random track addition to queue - + Schakel willekeurige track-toevoeging aan de wachtrij in Add random tracks from Track Source if the specified minimum tracks remain - + Voeg willekeurig tracks van Track-bron toe wanneer het aangegeven minimum aantal tracks overblijft. Minimum allowed tracks before addition - + Minimaal aantal toegestane tracks alvorens toevoeging Minimum number of tracks after which random tracks may be added - + Minimum aantal tracks waarna willekeurige tracks kunnen worden toegevoegd @@ -3608,42 +3618,42 @@ Icecast 2 - + Icecast 2 Shoutcast 1 - + Shoutcast 1 Icecast 1 - + Icecast 1 MP3 - + MP3 Ogg Vorbis - + Ogg Vorbis Automatic - + Automatisch Mono - + Mono Stereo - + Stereo @@ -3657,53 +3667,54 @@ '%1' has the same Icecast mountpoint as '%2'. Two source connections to the same server can't have the same mountpoint. - + '%1' heeft hetzelfde Icecast-mountpoint als '%2'. +Twee bronverbindingen naar dezelfde server kunnen niet hetzelfde mountpoint hebben. You can't create more than %1 source connections. - + U kunt niet meer dan %1 bronverbindingen maken. Source connection %1 - + Bronverbinding %1 At least one source connection is required. - + Er is ten minste één bronverbinding vereist. Are you sure you want to disconnect every active source connection? - + Weet u zeker dat u elke actieve bronverbinding wilt verbreken? Confirmation required - + Bevestiging vereist Are you sure you want to delete '%1'? - + Weet u zeker dat u %1 wilt verwijderen? Renaming '%1' - + '%1' hernoemen New name for '%1': - + Nieuwe naam voor '%1': Can't rename '%1' to '%2': name already in use - + Kan de naam van '%1' niet hernoemen naar '%2': naam is al in gebruik @@ -3711,117 +3722,117 @@ Live Broadcasting Preferences - + Voorkeuren voor live-uitzendingen Mixxx Icecast Testing - + Testen Mixx Icecast Public stream - + Openbare stream http://www.mixxx.org - + http://www.mixxx.org Stream name - + Stream-naam Due to flaws in some streaming clients, updating Ogg Vorbis metadata dynamically can cause listener glitches and disconnections. Check this box to update the metadata anyway. - + Vanwege gebreken in sommige streaming clients, kan het dynamisch bijwerken van Ogg Vorbis-metagegevens leiden tot hoorbare storingen en onderbrekingen veroorzaken. Vink dit vakje aan om de metagegevens toch bij te werken. Live Broadcasting source connections - + Bronverbindingen voor Live-uitzendingen Delete selected - + Verwijder geselecteerde Create new connection - + Maak een nieuwe verbinding Rename selected - + Hernoem geselecteerde Disconnect all - + Ontkoppel alles Turn on Live Broadcasting when applying these settings - + Schakel Live-uitzenden in wanneer u deze instellingen toepast Settings for %1 - + Instellingen voor %1 Dynamically update Ogg Vorbis metadata. - + Ogg Vorbis-metadata dynamisch bijwerken. ICQ - + ICQ AIM - + AIM Website - + Website Live mix - + Live mix IRC - + IRC Select a source connection above to edit its settings here - + Selecteer hierboven een bronverbinding om de instellingen hier te bewerken Password storage - + Wachtwoordopslag Plain text - + Platte tekst Secure storage (OS keychain) - + Veilige opslag (OS keychain) @@ -3831,7 +3842,7 @@ Use UTF-8 encoding for metadata. - + Gebruik UTF-8 codering voor metadata. @@ -3841,7 +3852,7 @@ Encoding - + Codering @@ -3852,17 +3863,17 @@ Format - + Formaat Channels - + Kanalen Server connection - + Server connectie @@ -3872,103 +3883,103 @@ Host - + Host Login - + Login Mount - + Monteren Port - + Poort Password - + Wachtwoord Stream info - + Stream-info Metadata - + Metadata Use static artist and title. - + Gebruik statische artiest en titel. Static title - + Statische titel Static artist - + Statische artiest Automatic reconnect - + Automatisch opnieuw verbinden Time to wait before the first reconnection attempt is made. - + Wachttijd alvorens de eerste poging tot opnieuw verbinden is gemaakt. seconds - + seconden Wait until first attempt - + Wacht tot de eerste poging Reconnect period - + Periode tot opnieuw verbinden Time to wait between two reconnection attempts. - + Wachttijd tussen twee pogingen tot opnieuw verbinden. Limit number of reconnection attempts - + Beperk het aantal pogingen tot herverbinding Maximum retries - + Maximale pogingen Reconnect if the connection to the streaming server is lost. - + Herverbinden als de verbinding met de streaming server verbroken is. Enable automatic reconnect - + Automatisch opnieuw verbinden inschakelen @@ -3976,43 +3987,44 @@ Apply device settings? - + Apparaatinstellingen toepassen? Your settings must be applied before starting the learning wizard. Apply settings and continue? - + Uw instellingen moeten worden toegepast voordat u de leerassistent start. +Instellingen toepassen en doorgaan? None - + geen %1 by %2 - + %1 bij %2 No Name - + Geen Naam No Description - + Geen Omschrijving No Author - + Geen Auteur Troubleshooting - + Probleemoplossen @@ -4022,53 +4034,53 @@ Function Prefix - + Functie voorvoegsel Built-in - + Ingebouwd Clear Input Mappings - + Wis Invoerkoppelingen Are you sure you want to clear all input mappings? - + Weet u het zeker dat u alle invoerkoppelingen wilt wissen? Clear Output Mappings - + Wis Uitvoerkoppelingen Are you sure you want to clear all output mappings? - + Weet u het zeker dat u alle Uitvoerkoppelingen wikt wissen? Add Script - + Script Toevoegen Controller Script Files (*.js) - + Script-bestanden controller (*.js) Could not add script file: '%s' - + Kan scriptbestand niet toevoegen: '%s' Please select a script from the list to open. - + Selecteer een script uit de lijst om te openen. @@ -4076,12 +4088,12 @@ (device category goes here) - + (apparaatcategorie komt hier) Controller Name - + Controllernaam @@ -4091,34 +4103,34 @@ Description: - + Omschrijving: Load Preset: - + Voorinstelling laden: Support: - + Ondersteuning: Preset Info - + Voorinstellingsinfo Input Mappings - + Invoerkoppelingen Add - + Toevoegen @@ -4130,53 +4142,53 @@ Click to start the Controller Learning wizard. - + Klik om de Controller Leerassistent te starten. Controller Preferences - + Voorkeuren Controller Controller Setup - + Controller Instellen Author: - + Auteur: Name: - + Naam: Learning Wizard (MIDI Only) - + Leerassistent (Enkel MIDI) Clear All - + Alles Wissen Output Mappings - + Uitvoerkoppelingen Scripts - + Scripts Open Selected File - + Geselecteerd Bestand Openen @@ -4184,67 +4196,67 @@ Controller Preferences - + Voorkeuren Controller Controllers - + Controllers Mixxx did not detect any controllers. If you connected the controller while Mixxx was running you must restart Mixxx first. - + Mixxx heeft geen controllers gedetecteerd. Als je de controller hebt aangesloten terwijl Mixxx actief was, dan moet je Mixxx eerst opnieuw opstarten. Presets - + Voorinstellingen Open User Preset Folder - + Open map met gebruikersvoorinstellingen Resources - + Bronnen Controllers are physical devices that send MIDI or HID signals to your computer over a USB connection. These allow you to control Mixxx in a more hands-on way than a keyboard and mouse. Attached controllers that Mixxx recognizes are shown in the "Controllers" section in the sidebar. - + Controllers zijn fysieke apparaten die MIDI- of HID-signalen naar uw computer sturen via een USB-verbinding. Hiermee kunt u Mixxx op een meer praktische manier bedienen dan met een toetsenbord en muis. Aangesloten controllers die Mixxx herkent, worden weergegeven in de sectie "Controllers" in de zijbalk. Mixxx uses "presets" to connect messages from your controller to controls in Mixxx. If you do not see a preset for your controller in the "Load Preset" menu when you click on your controller on the left sidebar, you may be able to download one online from the <a href="http://www.mixxx.org/forums/viewforum.php?f=7">Mixxx Forum</a>. Place the XML (.xml) and Javascript (.js) file(s) in the "User Preset Folder" then restart Mixxx. If you download a mapping in a ZIP file, extract the XML and Javascript file(s) from the ZIP file to your "User Preset Folder" then restart Mixxx: - + Mixxx gebruikt "voorinstellingen" om berichten van je controller te koppelen aan besturingselementen in Mixxx. Als je geen voorinstelling voor je controller ziet in het menu "Voorinstellingen Laden" wanneer je op je controller in de linkerzijbalk klikt, kun je er mogelijk één online downloaden van het <a href="http://www.mixxx.org/forums/viewforum.php?f=7">Mixxx Forum</a>. Plaats de XML (.xml) en Javascript (.js) bestanden in de "Map met gebruikersinstellingen" en start Mixxx opnieuw op. Als u een afbeelding in een ZIP-bestand downloadt, extraheer dan de XML- en Javascript-bestanden uit het ZIP-bestand naar uw "Map met Gebruikersvoorinstellingen" en start Mixxx opnieuw op: You can create your own mapping by using the MIDI Learning Wizard when you select your controller in the sidebar. You can edit mappings by selecting the "Input Mappings" and "Output Mappings" tabs in the preference page for your controller. See the Resources below for more details on making mappings. - + U kunt uw eigen koppeling maken door de MIDI Leerassistent te gebruiken wanneer u uw controller in de zijbalk selecteert. U kunt koppelingen bewerken door de tabbladen "Invoerkoppelingen" en "Uitvoerkoppelingen" te selecteren op de voorkeurenpagina van uw controller. Zie de onderstaande bronnen voor meer informatie over het maken van koppelingen. <a href="http://mixxx.org/wiki/doku.php/hardware_compatibility">Mixxx DJ Hardware Guide</a> - + <a href="http://mixxx.org/wiki/doku.php/hardware_compatibility">Mixxx DJ Hardware Gids</a> <a href="http://www.mixxx.org/forums/viewforum.php?f=7">Mixxx Controller Forums</a> - + <a href="http://www.mixxx.org/forums/viewforum.php?f=7">Mixxx Controller Forums</a> <a href="http://mixxx.org/wiki/doku.php/midi_controller_mapping_file_format">MIDI Preset File Format</a> - + <a href="http://mixxx.org/wiki/doku.php/midi_controller_mapping_file_format">MIDI Voorinstelling Bestandsformaat</a> <a href="http://mixxx.org/wiki/doku.php/midi_scripting">MIDI Scripting with Javascript</a> - + <a href="http://mixxx.org/wiki/doku.php/midi_scripting">MIDI Scripting met Javascript</a> @@ -4252,112 +4264,112 @@ Skin - + Skin Tool tips - + Tooltips Select from different color schemes of a skin if available. - + Kies uit verschillende kleurenschema's van een skin indien beschikbaar. Color scheme - + Kleurenschema Locales determine country and language specific settings. - + Regionale instellingen bepalen land- en taalspecifieke instellingen. Locale - + Regio Interface Preferences - + Voorkeuren Omgeving Interface options - + Omgevingsopties HiDPI / Retina scaling - + HiDPI / Retina schaling Change the size of text, buttons, and other items. - + Wijzig de tekstgrootte, knoppen en andere items. Adopt scale factor from the operating system - + Neem schaalfactor over van het besturingssysteem Auto Scaling - + Automatisch Schalen Effect options - + Effect opties Load behavior - + Laadgedrag Keep metaknob position - + Positie Metaknop behouden Reset metaknob to effect default - + Herstel metaknob naar standaard effect Screen saver - + Screensaver Start in full-screen mode - + Start in volledig scherm Full-screen mode - + Volledig-scherm modus Off - + Uit Library only - + Enkel bibliotheek Library and Skin - + Bibliotheek en Skin @@ -4365,47 +4377,47 @@ Crossfader Preferences - + Voorkeuren Crossfader Crossfader Curve - + Crossfader Curve Slow fade/Fast cut (additive) - + Langzaam overvloeien/Snel kappen (toevoegen) Constant power - + Constant vermogen Mixing - + Mixen Scratching - + Scratchen Linear - + Linear Logarithmic - + Logaritmisch Reverse crossfader (Hamster Style) - + Omgekeerde cross-fader (Hamster-stijl) @@ -4413,72 +4425,72 @@ Mixxx mode - + Mixxx modus Mixxx mode (no blinking) - + Mixxx-modus (zonder knipperen) Pioneer mode - + Pioneer modus Denon mode - + Denon modus Numark mode - + Numark modus CUP mode - + CUP modus 4% - + 4% 6% (semitone) - + 6% (halve toon) 8% (Technics SL-1210) - + 8% (Technics SL-1210) 10% - + 10% 16% - + 16% 24% - + 24% 50% - + 50% 90% - + 90% @@ -4486,17 +4498,17 @@ Deck Preferences - + Speler Voorkeuren Deck options - + speler-opties Cue mode - + Cue modus @@ -4519,63 +4531,82 @@ - Cue button while pause not at cue point = set cue point and play after release - Cue button while playing = go to cue point and play after release - + Mixxx-modus: +- Cue-knop tijdens pauze op cue-punt = voorbeeld +- Cue-knop tijdens pauze niet op cue-punt = cue-punt instellen +- Cue-knop tijdens het spelen = pauze op cue-punt +Mixxx-modus (knippert niet): +- Hetzelfde als Mixxx-modus, maar zonder knipperende indicatoren +Pioneer-modus: +- Hetzelfde als Mixxx-modus met een knipperende afspeelknop +Denon-modus: +- Cue-knop op cue-punt = voorbeeld +- Cue-knop niet op cue-punt = pauze op cue-punt +- Spelen = cue-punt instellen +Numark-modus: +- Hetzelfde als Denon-modus, maar zonder een knipperende afspeelknop +CUP-modus: +- Cue-knop tijdens pauze op cue-punt = afspelen na loslaten +- Cue-knop tijdens pauze niet op cue-punt = cue-punt instellen en afspelen na loslaten +- Cue-knop tijdens het spelen = ga naar het cue-punt en speel na het loslaten + Track time display - + Track tijdweergave Elapsed - + Verstreken Remaining - + Resterende Elapsed and Remaining - + Verstreken en Resterende Auto cue - + Auto cue Automatically seeks to the first saved cue point on track load. If none exists, seeks to the beginning of the track. - + Zoekt automatisch naar het eerste opgeslagen cue-punt bij het laden van de track. +             Als er geen bestaat, zoekt u naar het begin van de track. Jump to main cue point on track load - + Spring naar het belangrijkste cue-punt bij het laden van de track Playing track protection - + Trackbescherming tijdens afspelen Do not load tracks into playing decks - + Laad geen tracks in draaiende spelers Speed (Tempo) and Key (Pitch) options - + Speed (Tempo) en Key (Pitch) opties Permanent rate change when left-clicking - + Permanente snelheidsverandering bij links klikken @@ -4583,142 +4614,142 @@ % - + % Permanent rate change when right-clicking - + Permanente snelheidsverandering bij rechts klikken Reset on track load - + Reset bij laden van track Current key - + Huidige key Temporary rate change when right-clicking - + Tijdelijke snelheidsverandering bij rechts klikken Permanent - + Permanent Value in milliseconds - + Waarde in milliseconden Temporary - + Tijdelijk Keylock mode - + Keylock modus Ramping sensitivity - + Snelheid gevoeligheid Pitch bend behavior - + Pitch vervormingsgedrag Original key - + Originele key Temporary rate change when left-clicking - + Permanente snelheidsverandering bij links klikken Speed/Tempo - + Snelheid/Tempo Key/Pitch - + Key/Pitch Adjustment buttons: - + Aanpassing knoppen: Coarse - + Ruw Fine - + Fijn Make the speed sliders work like those on DJ turntables and CDJs where moving downward increases the speed - + Laat de snelheidsschuifregelaars werken zoals die op DJ-draaitafels en CDJ's waarbij neerwaarts bewegen de snelheid verhoogt Down increases speed - + Omlaag verhoogt de snelheid Slider range - + Schuifbereik Adjusts the range of the speed (Vinyl "Pitch") slider. - + Past het snelheidsbereik van de (Vinyl "Pitch") schuifregelaar aan. Abrupt jump - + Abrupte sprong Smoothly adjusts deck speed when temporary change buttons are held down - + Past de speler-snelheid soepel aan wanneer de knoppen voor tijdelijke aanpassing ingedrukt worden gehouden Smooth ramping - + Soepele toe of afname Keyunlock mode - + Key ontgrendelingsmodus Reset key - + Reset key Keep key - + Behoud key @@ -4729,7 +4760,7 @@ None Displayed when no effect is selected - + geen @@ -4737,109 +4768,109 @@ Equalizer Preferences - + Equalizer Voorkeuren Reset equalizers on track load - + Stel equalizers opnieuw in bij het laden van de track Resets the equalizers to their default values when loading a track. - + Stelt de equalizers opniuew in naar hun standaard waarden bij het laden van een track. Equalizer Rack - + Equalizer Rack Only allow EQ knobs to control EQ-specific effects - + Sta enkel EQ-knoppen toe om EQ-specifieke effecten te besturen Uncheck to allow any effect to be loaded into the EQ knobs. - + Afvinken om toe te staan dat elk effect in de EQ-knoppen wordt geladen. Use the same EQ filter for all decks - + Gebruik dezelfde EQ-filter voor alle spelers Uncheck to allow different decks to use different EQ effects. - + Vink af om toe te staan dat verschillende speler andere EQ-effecten mogen gebruiken. Equalizer Plugin - + Equalizer Plugin Quick Effect - + Snel Effect High Shelf EQ - + High Shelf EQ 16 Hz - + 16 Hz Master EQ - + Hoofd EQ Reset Parameter - + Parameter resetten Miscellaneous - + Diversen Resets the deck gain to unity when loading a track. - + Stelt de gain van de speler opnieuw in naar de eenheid bij het laden van een track. Reset gain on track load - + Gain opnieuw instellen bij laden track Bypass EQ effect processing - + Omzeil EQ-effectverwerking When checked, EQs are not processed, improving performance on slower computers. - + Indien aangevinkt, worden EQ's niet verwerkt, wat de prestaties op langzamere computers verbetert. 20.05 kHz - + 20.05 kHz Low Shelf EQ - + Low Shelf EQ @@ -4847,42 +4878,42 @@ Effects Preferences - + Voorkeuren voor Effecten Available Effects - + Beschikbare Effecten Effect Info - + Effect Info Version: - + Versie: Description: - + Omschrijving: Author: - + Auteur: Name: - + Naam: Type: - + Type: @@ -4890,37 +4921,37 @@ The minimum size of the selected skin is bigger than your screen resolution. - + De minimale grootte van de geselecteerde skin is groter dan uw schermresolutie. Allow screensaver to run - + Toestaan om screensaver laten draaien Prevent screensaver from running - + Voorkom dat screensaver wordt uitgevoerd Prevent screensaver while playing - + Voorkom screensaver tijdens afspelen This skin does not support color schemes - + Deze skin ondersteunt geen kleurenschema's Information - + Informatie Mixxx must be restarted before the new locale setting will take effect. - + Mixxx moet opnieuw worden gestart voordat de nieuwe locale-instelling van kracht wordt. @@ -4928,193 +4959,194 @@ Key Notation Format Settings - + Formaatinstellingen voor Kay Notation When key detection is enabled, Mixxx detects the musical key of your tracks and allows you to pitch adjust them for harmonic mixing. - + Wanneer toonaard detectie is ingeschakeld, detecteert Mixxx de muzieksleutel van uw tracks +en stelt u in staat om de pitch aan te passen voor harmonisch mixen. Enable Key Detection - + Schakel Toonaard Detectie in Choose Analyzer - + Kies Analysator Key Analyzer: - + Key Analysator: Choose between different algorithms to detect keys. - + Kies tussen verschillende algoritmen om toonaarden te detecteren. Analyzer Settings - + Instellingen Analysator Enable Fast Analysis (For slow computers, may be less accurate) - + Snelle Analyse Inschakelen (voor langzame computers is dit mogelijk minder nauwkeurig) Re-analyze keys when settings change or 3rd-party keys are present - + Analyseer toonaarden opnieuw wanneer instellingen veranderen of toonaarden van derden aanwezig zijn Key Notation - + Key Notatie Lancelot - + Lancelot OpenKey - + OpenKey Traditional - + Traditioneel Custom - + Maatwerk A - + A Bb - + Bb B - + B C - + C Db - + Db D - + D Eb - + Eb E - + E F - + F F# - + F# G - + G Ab - + Ab Am - + Am Bbm - + Bbm Bm - + Bm Cm - + Cm C#m - + C#m Dm - + Dm Ebm - + Ebm Em - + Em Fm - + Fm F#m - + F#m Gm - + Gm G#m - + G#m @@ -5122,12 +5154,12 @@ Equalizer Preferences - + Equalizer Voorkeuren Discovered LV2 effects - + Ontdekte LV2 effects @@ -5150,47 +5182,47 @@ Choose a music directory - + Kies een map voor muziek Confirm Directory Removal - + Bevestig Verwijdering Map Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - + Mixxx zal deze map niet langer in de gaten houden voor nieuwe tracks. Wat zou je willen doen met de tracks uit deze map en submappen?<ul><li>Verberg alle tracks uit deze directory en submappen. </li><li>Verwijder permanent alle metadata van deze tracks uit Mixxx.</li><li>Laat de tracks ongemoeid in je bibliotheek.</li></ul>Tracks verbergen zal wel de metadata blijven bewaren mocht je ze in de toekomst opnieuw willen toevoegen. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - + Metadata betekent alle trackdetails (artiest, titel, playcount, etc.) evenals beatgrids, hotcues en loops. Deze keuze heeft alleen betrekking op de Mixxx-bibliotheek. Er worden geen bestanden op schijf gewijzigd of verwijderd. Hide Tracks - + Verberg Tracks Delete Track Metadata - + Verwijder Metadata Leave Tracks Unchanged - + Laat tracks ongewijzigd Relink music directory to new location - + Koppel de muziekmap opnieuw aan een nieuwe locatie Select Library Font - + Selecteer bibliotheeklettertype @@ -5198,17 +5230,17 @@ Library - + Bibliotheek Music Directories: - + Muziekmappen If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - + Indien verwijderd, zal Mixxx deze map en zijn submappen niet langer in de gaten houden voor nieuwe tracks. @@ -5218,169 +5250,169 @@ Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - + Voeg een map toe waar uw muziek is opgeslagen. Mixxx zal naar deze map en zijn submappen kijken voor nieuwe tracks. Add - + Toevoegen If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - + Als een bestaande muziekmap wordt verplaatst, weet Mixxx niet waar de audiobestanden te vinden zijn. Kies Opnieuw koppelen om de muziekmap op de nieuwe locatie te selecteren. <br/> Hierdoor worden de links naar de audiobestanden in de Mixxx-bibliotheek hersteld. Relink This will re-establish the links to the audio files in the Mixxx database if you move an music directory to a new location. - + Opnieuw koppelen Audio File Formats - + Audiobestandsindelingen Additional Format Plugins: - + Extra opmaak plug-ins: Built-in - + Ingebouwd Available Online... - + Beschikbaar Online... Loaded Plugins: - + Geladen Plugins: None - + geen Track Metadata Synchronization - + Track Metadata Synchronisatie Export: Write modified track metadata from the library into file tags - + Exporteren: schrijf gewijzigde track metadata uit de bibliotheek naar bestandslabels Miscellaneous - + Diversen Library Font: - + Lettertype bibliotheek: Library Row Height: - + Rijhoogte Bibliotheek: Rescan library on start-up - + Scan bibliotheek opnieuw bij opstarten Add track to Auto DJ Queue (top) - + Voeg track toe aan AutoDJ-wachtrij (bovenaan) Add track to Auto DJ Queue (bottom) - + Voeg track toe aan AutoDJ-wachtrij (onderaan) Use relative paths for playlist export if possible - + Gebruik indien mogelijk relatieve paden bij exporteren van afspeellijsten ... - + ... px - + px Edit metadata after clicking selected track - + Bewerk metadata nadat u op het geselecteerde nummer hebt geklikt Search-as-you-type timeout: - + Zoeken-bij-typen timeout: ms - + ms Track Load Action Sets default action when double-clicking a track in the library. - + Actie bij laden track Load track to next available deck - + Laad track naar het volgende beschikbare speler External Libraries - + Externe Bibliotheken You will need to restart Mixxx for these settings to take effect. - + U moet Mixxx opnieuw opstarten om deze instellingen te activeren. Show Rhythmbox Library - + Toon Rhythmbox Bibliotheek Show Banshee Library - + Toon Banshee Bibliotheek Show iTunes Library - + Toon iTunes Bibliotheek Show Traktor Library - + Toon Traktor Bibliotheek All external libraries shown are write protected. - + Alle weergegeven externe bibliotheken zijn tegen schrijven beveiligd. @@ -5388,181 +5420,181 @@ Modplug Preferences - + Modplug Voorkeuren All settings take effect on next track load. Currently loaded tracks are not affected. For an explanation of these settings, see the <a href="http://wiki.openmpt.org/Manual:_Setup/Player">OpenMPT manual</a>. - + Alle instellingen worden van kracht bij het laden van de volgende track. Reeds geladen tracks worden niet beïnvloed. Voor een uitleg van deze instellingen, zie de <a href="http://wiki.openmpt.org/Manual:_Setup/Player">OpenMPT handleiding</a>. Maximum Number of Mixing Channels: - + Maximaal aantal mengkanalen: Show Advanced Settings - + Toon Geavanceerde Instellingen Low - + Laag Reverb Delay: - + Reverb vertraging: High - + Hoog None - + geen Bass Expansion - + Bas-uitbreiding Bass Range: - + Bas-bereik: 16 - + 16 Front/Rear Delay: - + Voor/Achter Vertraging: Pro-Logic Surround - + Pro-Logic Surround Full - + Volledig Reverb - + Reverb Stereo separation - + Stereo scheiding 10Hz - + 10Hz 10ms - + 10ms 256 - + 256 5ms - + 5ms 100Hz - + 100Hz 250ms - + 250ms 50ms - + 50ms Noise reduction - + Ruisonderdrukking Hints - + Tips Module files are decoded at once and kept in RAM to allow for seeking and smooth operation in Mixxx. About 10MB of RAM are required for 1 minute of audio. - + Modulebestanden worden in één keer gedecodeerd en in het RAM-geheugen bewaard om zoeken en een soepele verwerking in Mixxx mogelijk te maken. Ongeveer 10 MB aan RAM is vereist voor 1 minuut audiogeluid. Decoding options for libmodplug, a software library for loading and rendering module files (MOD music, tracker music). - + Decoderingsopties voor libmodplug, een softwarebibliotheek voor het laden en renderen van modulebestanden (MOD-muziek, tracker-muziek). Decoding Options - + Decodeer-opties Resampling mode (interpolation) - + Resampling-modus (interpolatie) Enable oversampling - + Oversampling inschakelen Nearest (very fast, extremely bad quality) - + Dichtstbijzijnde (zeer snelle, extreem slechte kwaliteit) Linear (fast, good quality) - + Linear (snel, goede kwaliteit) Cubic Spline (high quality) - + Cubic Spline (hoge kwaliteit) 8-tap FIR (extremely high quality) - + 8-tap FIR (extreem hoge kwaliteit) Memory limit for single track (MB) - + Geheugenlimiet voor enkele track (MB) @@ -5571,20 +5603,20 @@ Vinyl Control (Disabled) Preferences Using a version with the Vinyl Control feature disabled, an alternative preferences window is displayed. - + Voorkeuren voor vinylbesturing (Uigeschakelde) <b>This version of Mixxx does not support vinyl control.</b> <br> Please visit <a href="http://mixxx.org">Mixxx.org</a> for more information. - + <b>Deze versie van Mixxx ondersteund geen vinylbesturing.</b> <br> Ga naar <a href="http://mixxx.org">Mixxx.org</a> voor meer informatie. DlgPrefRecord - + Choose recordings directory - + Kies de opnamemap @@ -5592,33 +5624,33 @@ Recording Preferences - + Opnamevoorkeuren Recordings Directory - + Opnamemap Recordings Directory: - + Opnamemap: Browse... - + Bladeren... Quality - + Kwaliteit Tags - + Labels @@ -5628,7 +5660,7 @@ Author - + Auteur @@ -5638,47 +5670,47 @@ Miscellaneous - + Diversen Output File Format - + Bestandsindeling voor Uitvoer Compression - + Compressie Lossy - + Lossy Compression Level - + Compressie Niveau Lossless - + Lossless Create a CUE file - + Maak een CUE-bestand File Splitting - + Bestand splitsen Split recordings at - + Splits opname op @@ -5686,7 +5718,7 @@ %1 LUFS (adjust by %2 dB) - + %1 LUFS (aanpassen met %2 dB) @@ -5694,218 +5726,220 @@ Normalization Preferences - + Voorkeuren Normalisatie ReplayGain Loudness Normalization - + ReplayGain Loudness Normalisatie Apply loudness normalization to loaded tracks. - + Pas loudness normalisatie toe op geladen tracks. Apply ReplayGain - + Pas ReplayGain toe -30 LUFS - + -30 LUFS -6 LUFS - + -6 LUFS When ReplayGain is enabled, adjust tracks lacking ReplayGain information by this amount. - + Als ReplayGain is ingeschakeld, past u de tracks zonder ReplayGain-informatie met deze hoeveelheid aan. Initial boost without ReplayGain data - + Initiële boost zonder ReplayGain-gegevens For tracks with ReplayGain, adjust the target loudness to this LUFS value (Loudness Units relative to Full Scale). - + Pas voor tracks met ReplayGain het doelvolume aan naar deze LUFS-waarde (Loudness Units ten opzichte van Full Scale). Target loudness - + Doelvolume -12 dB - + -12 dB Analysis - + Analyse ReplayGain 2.0 (ITU-R BS.1770) - + ReplayGain 2.0 (ITU-R BS.1770) ReplayGain 1.0 - + ReplayGain 1.0 Disabled - + Uitgeschakeld Re-analyze and override an existing value - + Analyseer opnieuw en overschrijf een bestaande waarde ReplayGain targets a reference loudness of -18 LUFS (Loudness Units relative to Full Scale). You may increase it if you find Mixxx is too quiet or reduce it if you find that your tracks are clipping. You may also want to decrease the volume of unanalyzed tracks if you find they are often louder than ReplayGained tracks. For podcasting a loudness of -16 LUFS is recommended. The loudness target is approximate and assumes track pregain and master output level are unchanged. - + ReplayGain richt zich op een referentie-volume van -18 LUFS (Loudness Units ten opzichte van Full Scale). Je kunt het verhogen als je vindt dat Mixxx te stil is of verlagen als je oversturing opmerkt in je tracks. Mogelijk wilt u ook het volume van niet-geanalyseerde tracks verlagen als u merkt dat ze vaak luider zijn dan ReplayGained-tracks. Voor podcasts wordt een referentie-volume van -16 LUFS aanbevolen. + +Het doelvolume is bij benadering en gaat ervan uit dat track pregain en master output level onveranderd zijn. When an unanalyzed track is playing, Mixxx will avoid an abrupt volume change by not applying a newly calculated ReplayGain value. - + Wanneer een niet-geanalyseerd nummer wordt afgespeeld, zal Mixxx een abrupte volumewijziging vermijden door geen nieuw berekende ReplayGain-waarde toe te passen. +12 dB - + +12 dB Hints - + Tips DlgPrefSound - + None - + geen - + %1 Hz - + %1 Hz - + Default (long delay) - + Standaard (lange vertraging) - + Experimental (no delay) - + Standaard (lange vertraging) - + Disabled (short delay) - + Uitgeschakeld (korte vertraging) - + Soundcard Clock - + Geluidskaart Klok - + Network Clock - + Netwerk Klok - + Master output only - + Hoofduitgang alleen - + Master and booth outputs - + Master- en booth-uitgangen - + Direct monitor (recording and broadcasting only) - + Directe monitor (enkel opnemen en uitzenden) - + Disabled - + Uitgeschakeld - + Enabled Ingeschakeld - + Stereo - + Stereo - + Mono - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Microfooningangen zijn niet synchroon met het opname- en uitzendsignaal in vergelijking met wat je hoort. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Meet de Round Trip Latency en voer het hierboven in voor Microphone Latency Compensation om de microfoon timing uit te lijnen. - - + + Refer to the Mixxx User Manual for details. - + Raadpleeg de Mixxx-gebruikershandleiding voor meer informatie. - + Configured latency has changed. - + De geconfigureerde latency is gewijzigd. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Meet opnieuw de Round Trip Latency en voer het hierboven in voor Microphone Latency Compensation om de microfoon timing uit te lijnen. - + Realtime scheduling is enabled. - + Realtime plannen is ingeschakeld. - + %1 ms - + %1 ms - + Configuration error - + Configuratiefout @@ -5913,47 +5947,47 @@ Sound Hardware Preferences - + Voorkeuren Geluidsapparatuur Sound API - + Geluid API Sample Rate - + Sample Rate Audio Buffer - + Audio Buffer Engine Clock - + Engine Klok Use soundcard clock for live audience setups and lowest latency.<br>Use network clock for broadcasting without a live audience. - + Gebruik de geluidskaartklok voor live publieksopstellingen en de laagste latency.<br>Gebruik een netwerkklok voor uitzendingen zonder een live publiek. Microphone Monitor Mode - + Microfoon monitormodus Microphone Latency Compensation - + Compensatie voor microfoonvertraging Headphone Delay - + Hoofdtelefoon Delay @@ -5962,97 +5996,97 @@ ms milliseconds - + ms Booth Delay - + Booth Vertraging Enable Realtime scheduling (currently disabled), see the <a href="http://mixxx.org/wiki/doku.php/adjusting_audio_latency">Mixxx Wiki</a>. - + Schakel Realtime planning in (momenteel uitgeschakeld), zie de<a href="http://mixxx.org/wiki/doku.php/adjusting_audio_latency">Mixxx Wiki</a>. 20 ms - + 20 ms Buffer Underflow Count - + Buffer Underflow Teller 0 - + 0 Master Delay - + Master Delay Keylock/Pitch-Bending Engine - + Keylock/Pitch-Bending Engine Multi-Soundcard Synchronization - + Synchronisatie van meervoudige geluidskaarten Master Mix - + Master Mix Master Output Mode - + Master Uitvoer Modus Output - + Uitvoer Input - + Invoer The <a href="http://mixxx.org/wiki/doku.php/hardware_compatibility">Mixxx DJ Hardware Guide</a> lists sound cards and controllers you may want to consider for using Mixxx. - + De <a href="http://mixxx.org/wiki/doku.php/hardware_compatibility">Mixxx DJ Hardware Handleiding</a> l bevat een lijst met geluidskaarten en controllers die u zou kunnen overwegen om te gebruiken met Mixxx. System Reported Latency - + Door systeem gerapporteerde Latency Enlarge your audio buffer if the underflow counter is increasing or you hear pops during playback. - + Vergroot je geluidsbuffer als de teller voor bufferleegloop verhoogt of als je korte onderbrekingen hoort tijdens het afspelen. Hints and Diagnostics - + Tips en diagnostische gegevens Downsize your audio buffer to improve Mixxx's responsiveness. - + Verklein uw audiobuffer om het reactievermogen van Mixxx te verbeteren. Query Devices - + Vraag apparaten op @@ -6060,28 +6094,28 @@ None - + geen Channel %1 - + Kanaal %1 Channels %1 - %2 - + Kanalen %1 - %2 Sound Item Preferences Constructs new sound items inside the Sound Hardware Preferences, representing an AudioPath and SoundDevice - + Voorkeuren voor geluidselement Type (#) - + Type (#) @@ -6089,37 +6123,37 @@ Input - + Invoer Vinyl Configuration - + Vinyl Configuratie Deck 1 Vinyl Type - + Vinyltype speler 1 Deck 2 Vinyl Type - + Vinyltype speler 2 Deck 3 Vinyl Type - + Vinyltype speler 3 Deck 4 Vinyl Type - + Vinyltype speler 4 Show Signal Quality in Skin - + Toon signaalkwaliteit in het thema @@ -6127,12 +6161,12 @@ seconds - + seconden Vinyl Control Preferences - + Voorkeuren voor Vinylbediening @@ -6140,47 +6174,47 @@ Lead-in - + Inleiden Turntable Input Signal Boost - + Verhoog Invoersignaal Platenspeler 0 dB - + 0 dB 44 dB - + 44 dB Signal Quality - + Signaalkwaliteit http://www.xwax.co.uk - + http://www.xwax.co.uk Powered by xwax - + Powered by xwax Hints - + Tips Select sound devices for Vinyl Control in the Sound Hardware pane. - + Selecteer geluidsapparaten voor vinylbesturing in het deelvenster Geluidsapparatuur. @@ -6188,32 +6222,32 @@ Filtered - + Gefilterd HSV - + HSV RGB - + RGB OpenGL not available - + OpenGL niet beschikbaar dropped frames - + verloren frames Cached waveforms occupy %1 MiB on disk. - + Waveforms in cache gebruiken %1 Mb op schijf @@ -6221,190 +6255,192 @@ Waveform Preferences - + Voorkeuren Waveforms Frame rate - + Frame-snelheid Displays which OpenGL version is supported by the current platform. - + Geeft weer welke OpenGL-versie wordt ondersteund door het huidige platform. Normalize waveform overview - + Normaliseer Waveform-overzicht Average frame rate - + Gemiddelde framesnelheid Visual gain - + Visuele versterking Default zoom level Waveform zoom - + Standaard zoomniveau Displays the actual frame rate. - + Geeft de werkelijke framesnelheid weer. Visual gain of the middle frequencies - + Visuele versterking van de middenfrequenties End of track warning - + Track-einde waarschuwing OpenGL status - + OpenGL status Highlight the waveforms when the last seconds of a track remains. - + Markeer de waveforms bij de laatste seconden van een track. seconds - + seconden Low - + Laag Middle - + Midden Global - + Globaal Visual gain of the high frequencies - + Visuele versterking van de hoge frequenties Visual gain of the low frequencies - + Visuele versterking van de lage frequenties High - + Hoog Waveform type - + Waveform type Global visual gain - + Globale visuele versterking The waveform overview shows the waveform envelope of the entire track. Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. - + Het waveform overzicht toont de waveform enveloppe van de hele track. +Kies uit verschillende soorten weergaven voor het waveform overzicht, die voornamelijk verschillen in het detailniveau dat in de waveform wordt weergegeven. The waveform shows the waveform envelope of the track near the current playback position. Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. - + De waveform toont de waveform enveloppe van de track nabij de huidige afspeelpositie. +Kies uit verschillende soorten weergaven voor de waveform, die voornamelijk verschillen in het detailniveau dat in de waveform wordt weergegeven. Waveform overview type - + Waveform overzichtstype fps - + fps Synchronize zoom level across all waveform displays. - + Synchroniseer het zoomniveau over alle waveform weergaven. Synchronize zoom level across all waveforms - + Synchroniseer het zoomniveau over alle waveforms Caching - + Caching Mixxx caches the waveforms of your tracks on disk the first time you load a track. This reduces CPU usage when you are playing live but requires extra disk space. - + Mixxx buffert de waveforms van je tracks in de cache op schijf wanneer een track voor de eerste keer laadt. Dit vermindert het CPU-gebruik tijdens het live spelen, maar vereist extra schijfruimte. Enable waveform caching - + Schakel waveform caching in Generate waveforms when analyzing library - + Genereer waveforms bij het analyseren van de bibliotheek Beat grid opacity - + Beat-raster opaciteit Set amount of opacity on beat grid lines. - + Stel de opaciteitswaarde in voor beat-rasterlijnen % - + % Play marker position - + Positie afspeelmarkering Moves the play marker position on the waveforms to the left, right or center (default). - + Verplaatst de speelmarkeringspositie op de waveforms naar links, rechts of midden (standaard). Clear Cached Waveforms - + Wis gebufferde Waveforms @@ -6412,27 +6448,27 @@ Sound Hardware - + Geluidshardware Controllers - + Controllers Library - + Bibliotheek Interface - + Omgeving Waveforms - + Waveforms @@ -6442,12 +6478,12 @@ Equalizers - + Equalizers Decks - + Spelers @@ -6457,48 +6493,48 @@ Effects - + Effecten LV2 Plugins - + LV2 Plugins Recording - + Opname Beat Detection - + Beat detectie Key Detection - + Key detectie Normalization - + Normalisatie Vinyl Control - + Vinyl Control Live Broadcasting - + Live uitzenden Modplug Decoder - + Modplug Decoder @@ -6506,12 +6542,12 @@ Preferences - + Voorkeuren 1 - + 1 @@ -6519,28 +6555,28 @@ Recordings - + Opnames Status: - + Status: Start Recording - + Opname Starten Stop Recording - + Opname Stoppen Recording to file: %1 (%2 MiB written in %3) - + Opname naar bestand: %1 (%2 MB geschreven in %3) @@ -6548,18 +6584,18 @@ MusicBrainz - + MusicBrainz Select best possible match - + Selecteer best mogelijke overeenkomst Track - + Track @@ -6587,84 +6623,84 @@ Fetching track data from the MusicBrainz database - + Trackgegevens ophalen uit de MusicBrainz-database Mixxx could not find this track in the MusicBrainz database. - + Mixxx kon dit nummer niet terugvinden in de MusicBrainz-database. Get API-Key To be able to submit audio fingerprints to the MusicBrainz database, a free application programming interface key (API key) is required. - + haal API-key op Submit Submits audio fingerprints to the MusicBrainz database. - + Indienen New Column - + Nieuwe kolom New Item - + Nieuw Item &Previous - + &Vorige &Next - + V&olgende &Apply - + &Pas toe &Close - + &Sluit Status: %1 - + Status: %1 HTTP Status: %1 - + HTTP Status: %1 Mixxx can't connect to %1 for an unknown reason. - + Mixxx kan om onbekende reden geen verbinding maken met %1. Mixxx can't connect to %1. - + Mixxx kan geen verbinding maken met %1. Original tags - + Originele tags Suggested tags - + Voorgestelde tags @@ -6672,22 +6708,22 @@ Export Tracks - + Exporteer Tracks Exporting Tracks - + Tracks aan het exporteren (status text) - + (status tekst) &Cancel - + &Annuleer @@ -6695,37 +6731,37 @@ Track Editor - + Track Verwerker Summary - + Samenvatting Filetype: - + Bestandstype: BPM: - + BPM: Location: - + Locatie: Bitrate: - + Bitrate: Comments - + Opmerkingen @@ -6735,27 +6771,27 @@ Sets the BPM to 75% of the current value. - + Stelt de BPM in op 75% van de huidige waarde. 3/4 BPM - + 3/4 BPM Sets the BPM to 50% of the current value. - + Stelt de BPM in op 50% van de huidige waarde. Displays the BPM of the selected track. - + Geeft de BPM weer van de geselecteerde track. Details - + Details @@ -6780,7 +6816,7 @@ Grouping - + Groeperen @@ -6810,204 +6846,206 @@ File - + Bestand ReplayGain: - + ReplayGain: Converts beats detected by the analyzer into a fixed-tempo beatgrid. Use this setting if your tracks have a constant tempo (e.g. most electronic music). Often results in higher quality beatgrids, but will not do well on tracks that have tempo shifts. - + Zet de door de analysator gedetecteerde beats om in een beat-raster met een vast tempo. +Gebruik deze instelling als uw tracks een constant tempo hebben (bijv. De meeste elektronische muziek). +Dit resulteert vaak in beat-rasters van hogere kwaliteit, maar zal het niet goed doen op tracks met tempoveranderingen. Sets the BPM to 200% of the current value. - + Stelt de BPM in op 200% van de huidige waarde. Double BPM - + Dubbele BPM Halve BPM - + Halve BPM Clear BPM and Beatgrid - + Wis BPM en Beat-raster Cuepoints - + Cuepoints Move to the previous item. "Previous" button - + Ga naar het vorige item. &Previous - + &Vorige Move to the next item. "Next" button - + Ga naar het volgende item &Next - + V&olgende Duration: - + Duur: Import Metadata from MusicBrainz - + Metadata importeren uit MusicBrainz Import Metadata from File - + Importeer Metadata vanaf bestand Open in File Browser - + Open bestand in Browser Track BPM: - + Track BPM: Assume constant tempo - + Ga uit van een constant tempo Sets the BPM to 66% of the current value. - + Stelt de BPM in op 66% van de huidige waarde. 2/3 BPM - + 2/3 BPM Sets the BPM to 150% of the current value. - + Stelt de BPM in op 150% van de huidige waarde. 3/2 BPM - + 3/2 BPM Sets the BPM to 133% of the current value. - + Stelt de BPM in op 133% van de huidige waarde. 4/3 BPM - + 4/3 BPM Tap with the beat to set the BPM to the speed you are tapping. - + Tik op het ritme om de BPM in te stellen op je tik-snelheid. Tap to Beat - + Tik op maat Hint: Use the Library Analyze view to run BPM detection. - + Tip: gebruik de weergave Bibliotheekanalyse om BPM-detectie uit te voeren. Cue Id - + Cue Id Position - + Positie Hotcue - + Hotcue Label - + Label Activate Cue - + Activeer Cue Save changes and close the window. "OK" button - + Sla wijzigingen op en sluit het venster. &OK - + &OK Delete Cue - + Verwijder Cue Discard changes and close the window. "Cancel" button - + Negeer wijzigingen en sluit het venster. Save changes and keep the window open. "Apply" button - + Sla wijzigingen op en houd het venster open. &Apply - + &Pas toe &Cancel - + &Annuleer @@ -7016,7 +7054,7 @@ Empty Chain Name for an empty effect chain, that is created after eject - + Lege keten @@ -7024,7 +7062,7 @@ No effect loaded. - + Geen effect geladen. @@ -7032,7 +7070,7 @@ Visible - + Zichtbaar @@ -7050,37 +7088,37 @@ Flanger - + Flanger BitCrusher - + BitCrusher Filter - + Filter Reverb - + Reverb Echo - + Echo AutoPan - + AutoPan Tremolo - + Tremolo @@ -7088,7 +7126,7 @@ Empty - + Leeg @@ -7096,17 +7134,17 @@ Soundtouch (faster) - + Soundtouch (sneller) Rubberband (better) - + Rubberband (beter) Unknown (bad value) - + Onbekend (slechte waarde) @@ -7114,27 +7152,27 @@ Fatal error - + Fatale fout Critical error - + Kritieke fout Warning - + Waarschuwing Information - + Informatie Question - + Vraag @@ -7142,7 +7180,7 @@ RGB - + RGB @@ -7150,7 +7188,7 @@ Filtered - + Gefilterd @@ -7158,7 +7196,7 @@ RGB - + RGB @@ -7166,7 +7204,7 @@ Simple - + Eenvoudig @@ -7174,7 +7212,7 @@ VSyncTest - + VSyncTest @@ -7182,7 +7220,7 @@ Filtered - + Gefilterd @@ -7190,7 +7228,7 @@ HSV - + HSV @@ -7198,52 +7236,52 @@ Generic HID Mouse - + Generieke HID Muis Generic HID Joystick - + Generieke HID Joystick Generic HID Gamepad - + Generieke HID Gamepad Generic HID Keyboard - + Generieke HID Toetsenbord Generic HID Multiaxis Controller - + Generieke HID multi-axis-controller Unknown HID Desktop Device - + Onbekend HID Desktop Apparaat HID Infrared Control - + HID Infraroodbediening Unknown Apple HID Device - + Onbekend Apple HID-apparaat HID Unknown Device - + HID Onbekend Apparaat HID Interface Number - + HID interface-nummer @@ -7252,38 +7290,38 @@ iTunes - + iTunes Select your iTunes library - + Selecteer je iTunes-bibliotheek (loading) iTunes - + iTunes (aan het laden) Use Default Library - + Gebruik de standaardbibliotheek Choose Library... - + Kies bibliotheek... Error Loading iTunes Library - + Fout bij het laden van iTunes-bibliotheek There was an error loading your iTunes library. Some of your iTunes tracks or playlists may not have loaded. - + Er is een fout opgetreden bij het laden van je iTunes-bibliotheek. Sommige van uw iTunes-nummers of afspeellijsten zijn mogelijk niet geladen. @@ -7292,7 +7330,7 @@ Safe Mode Enabled Shown when Mixxx is running in safe mode. - + Veilige modus ingeschakeld @@ -7300,62 +7338,63 @@ support. Shown when Spinny can not be displayed. Please keep unchanged - + Geen OpenGL +ondersteuning. activate - + Activeer toggle - + Wisselen right - + rechts left - + links right small - + rechts klein left small - + links klein up - + omhoog down - + omlaag up small - + omhoog klein down small - + omlaag klein Shortcut - + Snelkoppeling @@ -7363,25 +7402,41 @@ Add Directory to Library - + Map aan bibliotheek toevoegen Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - + Kon de map niet toevoegen aan uw bibliotheek. Ofwel bevindt deze map zich al in uw bibliotheek of u scant momenteel uw bibliotheek opnieuw. LibraryFeature - + Import Playlist Importeer Afspeellijst - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) - + Afspeellijstbestanden (*.m3u *.m3u8 *.pls *.csv) + + + + Overwrite File? + Bestand Overschrijven? + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + Er bestaat al een afspeellijstbestand met de naam "%1". +De standaard "m3u" -extensie is toegevoegd omdat er geen is opgegeven. + +Wil je het echt overschrijven? @@ -7389,27 +7444,27 @@ Library Scanner - + Bibliotheekscanner It's taking Mixxx a minute to scan your music library, please wait... - + Mixxx heeft ongeveer een minuut nodig om je muziekbibliotheek te scannen, even geduld... Cancel - + Annuleren Scanning: - + Scannen: Scanning cover art (safe to cancel) - + Hoezen aan het scannen (veilig om te annuleren) @@ -7417,7 +7472,7 @@ Sort items randomly - + Sorteer items willekeurig @@ -7425,33 +7480,34 @@ MIDI Controller - + MIDI Controller MixxxControl(s) not found - + Mixxx bediening(en) niet gevonden One or more MixxxControls specified in the outputs section of the loaded preset were invalid. - + Een of meer MixxxControls gespecificeerd in de uitgangen sectie van de geladen preset waren ongeldig. Some LEDs or other feedback may not work correctly. - + Sommige LED's of andere feedback werken mogelijk niet correct. * Check to see that the MixxxControl names are spelled correctly in the mapping file (.xml) - + * Controleer of de MixxxControl-namen correct zijn gespeld in het koppelingsbestand (.xml) + * Make sure the MixxxControls in question actually exist. Visit this wiki page for a complete list: - + * Controleerr dat de MixxxControls in kwestie echt bestaan. Bezoek deze wikipagina voor een volledige lijst: @@ -7459,42 +7515,42 @@ Click OK to exit. - + Klik OK om te verlaten. Cannot upgrade database schema - + Kan databaseschema niet upgraden Unable to upgrade your database schema to version %1 - + Onmogelijk om de databaseschema te upgraden naar versie %1 For help with database issues contact: - + Voor hulp bij database problemen contacteer: Your mixxxdb.sqlite file may be corrupt. - + Uw mixxxdb.sqlite bestand is mogelijk corrupt. Try renaming it and restarting Mixxx. - + Probeer te hernoemen en Mixxx te herstarten. Your mixxxdb.sqlite file was created by a newer version of Mixxx and is incompatible. - + Uw mixxxdb.sqlite-bestand is gemaakt door een nieuwere versie van Mixxx en is niet compatibel. The database schema file is invalid. - + Het database-schemabestand is ongeldig. @@ -7502,17 +7558,17 @@ Missing Tracks - + Ontbrekende Tracks Hidden Tracks - + Verborgen Tracks Tracks - + Tracks @@ -7520,47 +7576,47 @@ Choose music library directory - + Kies de map voor de muziekbibliotheek Sound Device Busy - + Geluisapparaat bezig <b>Retry</b> after closing the other application or reconnecting a sound device - + <b>Probeer opnieuw</b> na het afsluiten van de andere applicatie of het opnieuw aansluiten van een geluidsapparaat <b>Reconfigure</b> Mixxx's sound device settings. - + <b>Configureer</b> opnieuw de Mixxx instellingen van het geluidsapparaat. Get <b>Help</b> from the Mixxx Wiki. - + <b>Hulp</b>zoeken in de Mixxx Wiki. <b>Exit</b> Mixxx. - + <b>Verlaat</b> Mixxx. Retry - + Opnieuw Proberen Cannot open database - + Kan database niet openen @@ -7568,140 +7624,146 @@ Mixxx requires QT with SQLite support. Please read the Qt SQL driver documentation for information on how to build it. Click OK to exit. - + Kan geen databaseverbinding tot stand brengen. +Mixxx vereist QT met SQLite-ondersteuning. Lees de QT SQL-driver documentatie voor meer informatie over het opbouwen ervan. + +Klik op OK om af te sluiten. Reconfigure - + Opnieuw configureren Help - + Help Exit - + Afsluiten Mixxx was unable to open all the configured sound devices. - + Mixxx kon niet alle geconfigureerde geluidsapparaten openen. Sound Device Error - + Fout met geluidsapparaat <b>Retry</b> after fixing an issue - + <b>Probeer opnieuw</b> na het oplossen van een probleem No Output Devices - + Geen uitvoerapparaten Mixxx was configured without any output sound devices. Audio processing will be disabled without a configured output device. - + Mixxx is ingesteld zonder uitvoerapparaten voor geluid. Geluidsverwerking wordt uitgeschakeld zonder een geconfigureerd uitvoerapparaat. <b>Continue</b> without any outputs. - + <b>Ga door</b> zonder uitvoer. Continue - + Verdergaan Load track to Deck %1 - + Laad track in Speler %1 Deck %1 is currently playing a track. - + Deck %1 speelt momenteel een track af. Are you sure you want to load a new track? - + Bent u zeker dat u een nieuwe track wil laden? There is no input device selected for this vinyl control. Please select an input device in the sound hardware preferences first. - + Er is geen invoerapparaat geselecteerd voor deze vinylbesturing. +Selecteer eerst een invoerapparaat in de voorkeuren voor geluidshardware. There is no input device selected for this passthrough control. Please select an input device in the sound hardware preferences first. - + Er is geen invoerapparaat geselecteerd voor dit doorvoerapparaat. +Selecteer eerst een invoerapparaat in de voorkeuren voor geluidsapparatuur. There is no input device selected for this microphone. Please select an input device in the sound hardware preferences first. - + Er is geen invoerapparaat geselecteerd voor deze microfoon. +Selecteer eerst een invoerapparaat in de voorkeuren voor geluidsapparatuur. Error in skin file - + Fout in themabestand The selected skin cannot be loaded. - + Het geselecteerde thema kan niet worden geladen. - + OpenGL Direct Rendering - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + Directe weergave is niet ingeschakeld op uw computer.<br><br> Dit betekent dat de weergave van de golfvormen erg<br><b> traag zal zijn en uw CPU zwaar kan belasten</b>. Werk uw <br> configuratie bij om directe weergave mogelijk te maken of schakel<br>de waveform weergaven uit in de Mixxx-voorkeuren door "Leeg" te selecteren<br> als de waveform weergave in het gedeelte "Interface". - - - + + + Confirm Exit - + Afsluiten bevestigen - + A deck is currently playing. Exit Mixxx? - + Er is momenteel een speler actief. Mixxx afsluiten? - + A sampler is currently playing. Exit Mixxx? - + Er is momenteel een sampler actief. Mixxx afsluiten? - + The preferences window is still open. - + Het scherm "Voorkeuren" staat nog open. - + Discard any changes and exit Mixxx? - + Wijzigingen negeren en Mixxx afsluiten? @@ -7714,18 +7776,18 @@ Playlist Export Failed - + Afspeellijst exporteren mislukt Could not create file - + Kon bestand niet aanmaken Readable text Export Failed - + Export leesbare tekst mislukt @@ -7734,24 +7796,25 @@ Playlist Export Failed - + Afspeellijst exporteren mislukt File path contains characters, not allowed in m3u playlists. - + Bestandspad bevat karakters die niet toegelaten zijn in m3u-afspeellijsten. Export a m3u8 playlist instead! - + Exporteer in plaats daarvan een m3u8 afspeellijst! + Could not create file - + Kon bestand niet aanmaken @@ -7759,12 +7822,12 @@ Playlist Export Failed - + Afspeellijst exporteren mislukt Could not create file - + Kon bestand niet aanmaken @@ -7776,37 +7839,37 @@ - + Playlists - + Speellijsten Unlock - + Ontgrendel - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Afspeellijsten zijn geordende lijsten met nummers waarmee u uw DJ-sets kunt plannen. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + Sommige DJ's maken afspeellijsten voordat ze live optreden, maar anderen bouwen ze liever on-the-fly tijdens hun optreden. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + Wanneer u een afspeellijst gebruikt tijdens een live DJ-set, vergeet dan niet om goed op te letten hoe uw publiek reageert op de muziek die u hebt gekozen om te spelen. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Het kan nodig zijn om sommige tracks over te slaan in je voorbereide afspeellijst of om een aantal tracks toe te voegen teneinde de energie van je publiek te behouden. - + Create New Playlist Nieuwe Afspeellijst aanmaken @@ -7816,13 +7879,14 @@ Upgrading Mixxx - + Mixxx Upgraden Mixxx now supports displaying cover art. Do you want to scan your library for cover files now? - + Mixxx ondersteunt nu het weergeven van albumhoezen. +Wilt u nu uw bibliotheek scannen op albumhoezen? @@ -7832,42 +7896,42 @@ Later - + Later Upgrading Mixxx from v1.9.x/1.10.x. - + Mixxx upgraden van v1.9.x/1.10.x. Mixxx has a new and improved beat detector. - + Mixxx bevat een nieuwe en verbeterde beat detector. When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - + Wanneer je tracks laadt, kan Mixxx ze opnieuw analyseren en nieuwe, nauwkeurigere beat-rasters genereren. Dit maakt automatische beatsync en looping betrouwbaarder. This does not affect saved cues, hotcues, playlists, or crates. - + Dit heeft geen invloed op opgeslagen cues, hotcues, afspeellijsten of kratten. If you do not want Mixxx to re-analyze your tracks, choose "Keep Current Beatgrids". You can change this setting at any time from the "Beat Detection" section of the Preferences. - + Als je niet wilt dat Mixxx je tracks opnieuw analyseert, kies dan "Huidige beat-rasters behouden". Je kunt deze instelling op elk moment wijzigen in het "Beat Detectie" gedeelte in de Voorkeuren. Keep Current Beatgrids - + Huidige beat-rasters behouden Generate New Beatgrids - + Nieuwe beat-rasters genereren @@ -7876,194 +7940,194 @@ Invalid - + Ongeldig Note On - + Note On Note Off - + Note Uit CC - + CC Pitch Bend - + Pitch Bend Unknown (0x%1) - + Onbekend (0x%1) Normal - + Normaal Invert - + Draai Om Rot64 - + Rot64 Rot64Inv - + Rot64Inv Rot64Fast - + Rot64Fast Diff - + Diff Button - + Knop Switch - + Switch Spread64 - + Spread64 HercJog - + HercJog SelectKnob - + Keuzeknop SoftTakeover - + SoftTakeover Script - + Script 14-bit (LSB) - + 14-bit (LSB) 14-bit (MSB) - + 14-bit (MSB) Master - + Master Booth - + Booth Headphones - + Hoofdtelefoon Left Bus - + Bus Links Center Bus - + Bus Centraal Right Bus - + Bus Rechts Invalid Bus - + Ongeldinge Bus Deck - + Deck Record/Broadcast - + Opnemen/Uitzenden Vinyl Control - + Vinyl Control Microphone - + Microfoon Auxiliary - + Auxiliary Unknown path type %1 - + Ongekend pad-type %1 Encoder - + Encoder <html>Mixxx cannot record or stream in MP3 without the MP3 encoder &quot;lame&quot;. Due to licensing issues, we cannot include this with Mixxx. To record or stream in MP3, you must download <b>libmp3lame</b> and install it on your system. <p>See <a href='http://mixxx.org/wiki/doku.php/internet_broadcasting#%1'>Mixxx Wiki</a> for more information. </html> - + <html>Mixxx kan niet opnemen of streamen in MP3 zonder de MP3 encoder &quot;lame&quot;. Vanwege licentieproblemen kunnen we dit niet toevoegen in Mixxx. Om op te nemen of te streamen in MP3, moet u de<b>libmp3lame</b> downloaden en installeren op uw systeem. <p>Zie <a href='http://mixxx.org/wiki/doku.php/internet_broadcasting#%1'>Mixxx Wiki</a> voor meer informatie. </html> <html>Mixxx has detected that you use a modified version of libmp3lame. See <a href='http://mixxx.org/wiki/doku.php/internet_broadcasting'>Mixxx Wiki</a> for more information.</html> - + <html>Mixxx heeft gedetecteerd dat je een aangepaste versie van libmp3lame gebruikt. Zie <a href='http://mixxx.org/wiki/doku.php/internet_broadcasting'>Mixxx Wiki</a> voor meer informatie.</html> Mixxx Needs Access to: %1 - + Mixxx heeft toegang nodig tot: %1 @@ -8074,67 +8138,73 @@ After clicking OK, you will see a file picker. To give Mixxx permission, you must select '%2' to proceed. If you do not want to grant Mixxx access click Cancel on the file picker. We're sorry for this inconvenience. To abort this action, press Cancel on the file dialog. - + Vanwege Mac Sandboxing hebben we uw toestemming nodig om dit bestand te openen: + +% 1 + +Nadat u op OK heeft geklikt, ziet u een bestandskiezer. Om Mixxx toestemming te geven, moet je '% 2' selecteren om door te gaan. Als u Mixxx geen toegang wilt verlenen, klikt u op Annuleren in de bestandskiezer. Onze excuses voor het ongemak. + +Om deze actie af te breken, drukt u op Annuleren in het bestandsdialoogvenster. You selected the wrong file. To grant Mixxx access, please select the file '%1'. If you do not want to continue, press Cancel. - + Je selecteerde het verkeerde bestand. Om Mixxx toegang te verlenen, selecteer het bestand% 1 . Als u niet wil doorgaan, druk op Annuleren. Bit Depth - + Bit Diepte Bitcrusher - + Bitcrusher Adds noise by the reducing the bit depth and sample rate - + Voegt ruis toe door de bitdiepte en samplefrequentie te reduceren The bit depth of the samples - + De bitdiepte van de samples Downsampling - + Downsampling Down - + Omlaag The sample rate to which the signal is downsampled - + De samplefrequentie waarop het signaal omlaag wordt gesampled Echo - + Echo Time - + Tijd Ping Pong - + Ping Pong @@ -8142,12 +8212,12 @@ Send - + Verstuur How much of the signal to send into the delay buffer - + Hoeveel van het signaal moet naar de vertragingsbuffer gestuurd worden @@ -8155,29 +8225,31 @@ Feedback - + Feedback Stores the input signal in a temporary buffer and outputs it after a short time - + Slaat het ingangssignaal op in een tijdelijke buffer en voert het na korte tijd uit Delay time 1/8 - 2 beats if tempo is detected 1/8 - 2 seconds if no tempo is detected - + Vertragingstijd +1/8 - 2 tellen als tempo wordt gedetecteerd +1/8 - 2 seconden als er geen tempo wordt gedetecteerd Amount the echo fades each time it loops - + Hoeveel keer de echo vervaagt elke keer deze een loop maakt How much the echoed sound bounces between the left and right sides of the stereo field - + Hoe dikwijls het echogeluid weerkaatst tussen de linker- en rechterkant van het stereoveld @@ -8185,12 +8257,12 @@ Quantize - + Quantize Round the Time parameter to the nearest 1/4 beat. - + Rond de parameter Tijd af naar de dichtstbijzijnde 1/4 tel. @@ -8201,68 +8273,69 @@ Triplets - + Trio When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3. - + Als de Quantize-parameter is ingeschakeld, deelt u de afgeronde 1/4 beats van de Tijd-parameter door 3. Filter - + Filter Allows only high or low frequencies to play. - + Laat enkel hoge of lage frequenties toe te spelen. Low Pass Filter Cutoff - + Lage Doorlaatfilter Cutoff LPF - + LPF Corner frequency ratio of the low pass filter - + Hoekfrequentieverhouding van het laagdoorlaatfilter Q - + Q Resonance of the filters Default: flat top - + Resonantie van de filters +Standaard: flat top High Pass Filter Cutoff - + Hoge Doorlaatfilter Cutoff HPF - + HPF Corner frequency ratio of the high pass filter - + Hoekfrequentieverhouding van het hoogdoorlaatfilter @@ -8270,81 +8343,84 @@ Depth - + Diepte Flanger - + Flanger Speed - + Snelheid Manual - + Manueel Mixes the input with a delayed, pitch modulated copy of itself to create comb filtering - + Mengt de invoer met een vertraagde, met pitch gemoduleerde kopie van zichzelf om kamfiltering te creëren Speed of the LFO (low frequency oscillator) 32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected 1/32 - 4 Hz if no tempo is detected - + Snelheid van de LFO (laagfrequente oscillator) +32 - 1/4 beats afgerond op 1/2 beat per LFO-cyclus als het tempo wordt gedetecteerd +1/32 - 4 Hz als er geen tempo wordt gedetecteerd Delay amplitude of the LFO (low frequency oscillator) - + Amplitudevertraging van de LFO (laagfrequente oscillator) Delay offset of the LFO (low frequency oscillator). With width at zero, this allows for manually sweeping over the entire delay range. - + Vertraag de offset van de LFO (laagfrequente oscillator). +Met een breedte van nul, maakt dit het mogelijk handmatig over het gehele vertragingsbereik te vegen. Regeneration - + Regeneratie Regen - + Regen How much of the delay output is feed back into the input - + Hoeveel van de vertraagde output wordt teruggevoerd naar de input Intensity of the effect - + Intensiteit van het effect Divide rounded 1/2 beats of the Period parameter by 3. - + Verdeel afgeronde 1/2 beats van de Period parameter door 3. Mix - + Mix @@ -8354,17 +8430,17 @@ Width - + Breedte Metronome - + Metronoom Adds a metronome click sound to the stream - + Voegt het klikgeluid van een metronoom toe aan de stream @@ -8374,17 +8450,17 @@ Set the beats per minute value of the click sound - + Stel de BPM waarde van het klikgeluid in Sync - + Sync Synchronizes the BPM with the track if it can be retrieved - + Synchroniseert de BPM met de track als deze kan worden opgehaald @@ -8392,550 +8468,557 @@ Period - + Periode Autopan - + Autopan Bounce the sound left and right across the stereo field - + Kaats het geluid links en rechts over het stereoveld How fast the sound goes from one side to another 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Hoe snel gaat het geluid van de ene naar de andere kant +1/4 - 4 beats afgerond op 1/2 beat als het tempo wordt gedetecteerd +1/4 - 4 seconden als er geen tempo wordt gedetecteerd Smoothing - + Effenen Smooth - + Effen How smoothly the signal goes from one side to the other - + Hoe vlot het signaal overgaat van de ene kant naar de andere How far the signal goes to each side - + Hoe ver het signaal reikt naar iedere kant. Reverb - + Reverb Emulates the sound of the signal bouncing off the walls of a room - + Bootst het geluid van het signaal dat tegen de muren van een kamer weerkaatst na Decay - + Verval Lower decay values cause reverberations to fade out more quickly. - + Lagere vervalwaarden zorgen ervoor dat weerkaatsingen sneller vervagen. Bandwidth of the low pass filter at the input. Higher values result in less attenuation of high frequencies. - + Bandbreedte van het laagdoorlaatfilter aan de ingang. +Hogere waarden resulteren in minder vervagen van hoge frequenties. + + How much of the signal to send in to the effect - + Hoeveel van het signaal er naar het effect moet worden gestuurd Bandwidth - + Bandbreedte BW - + BW Damping - + Demping Higher damping values cause high frequencies to decay more quickly than low frequencies. - + Hogere dempingswaarden zorgen ervoor dat hoge frequenties sneller vervallen dan lage frequenties. Low - + Laag Gain for Low Filter - + Versterking voor lage filter Kill Low - + Demp Laag Kill the Low Filter - + Lage Filter uitzetten Mid - + Midden Bessel4 LV-Mix Isolator - + Bessel4 LV-Mix Isolator Bessel4 ISO - + Bessel4 ISO A Bessel 4th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -24 dB/octave). - + Een Bessel 4e-order filterisolator met Lipshitz en Vanderkooy mix (perfecte bit eenheid, roll-off -24 dB/octaaf). Gain for Mid Filter - + Versterking voor middenfilter Kill Mid - + Midden uitzetten Kill the Mid Filter - + Demp de middenfilter High - + Hoog Gain for High Filter - + Versterking voor hoge filter Kill High - + Hoog uitzetten Kill the High Filter - + Demp de hoge filter To adjust frequency shelves, go to Preferences -> Equalizers. - + Ga naar Voorkeuren -> Equalizers om frequentieschalen aan te passen. Graphic Equalizer - + Graphische Equalizer Graphic EQ - + Grafische EQ An 8-band graphic equalizer based on biquad filters - + Een 8-bands grafische equalizer op basis van biquad-filters Gain for Band Filter %1 - + Versterking voor Band filter %1 Moog Ladder 4 Filter - + Moog Ladder 4 Filter Moog Filter - + Moog Filter A 4-pole Moog ladder filter, based on Antti Houvilainen's non linear digital implementation - + Een 4-polig Moog ladderfilter, gebaseerd op Antti Houvilainen's niet-lineaire digitale implementatie Res - + Res Resonance - + Resonantie Resonance of the filters. 4 = self oscillating - + Resonantie van de filters. 4 = zelfoscillerend Deck %1 EQ Effect - + Speler %1 EQ Effect EQ Effect - + EQ Effect Deck 1 EQ Effect - + EQ Effect Speler 1 Gain for Low Filter (neutral at 1.0) - + Versterking voor Lage filter (neutraal op 1.0) Network stream - + Netwerkstream Phaser - + Phaser Stereo - + Stereo Stages - + Stadia Mixes the input signal with a copy passed through a series of all-pass filters to create comb filtering - + Mengt het ingangssignaal met een kopie, die door een reeks all-pass filters gaat, om kamfiltering te creëren Period of the LFO (low frequency oscillator) 1/4 - 4 beats rounded to 1/2 beat if tempo is detected 1/4 - 4 seconds if no tempo is detected - + Periode van de LFO (laagfrequente oscillator) +1/4 - 4 beats afgerond op 1/2 beat als het tempo wordt gedetecteerd +1/4 - 4 seconden als er geen tempo wordt gedetecteerd Controls how much of the output signal is looped - + Bepaalt hoeveel van het uitgangssignaal wordt gelooped Range - + Bereik Controls the frequency range across which the notches sweep. - + Regelt het frequentiebereik dat door de inkepingen wordt geveegd. Number of stages - + Aantal stadia Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others - + Stelt de LFO's (laagfrequente oscillatoren) voor de linker- en rechterkanalen uit fase (out of phase) zijn met elkaar %1 minutes - + %1 minuten %1:%2 - + %1:%2 Ctrl+t - + Ctrl+t Ctrl+y - + Ctrl+y Ctrl+u - + Ctrl+u Ctrl+i - + Ctrl+i Ctrl+o - + Ctrl+o Ctrl+Shift+O - + Ctrl+Shift+O Ctrl+, - + Ctrl+, Ctrl+P - + Ctrl+P Ctrl+Shift+F - + Ctrl+Shift+F F11 - + F11 Bessel8 LV-Mix Isolator - + Bessel8 LV-Mix Isolator Bessel8 ISO - + Bessel8 ISO A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave). - + Een Bessel 8ste-order filterisolator met Lipshitz en Vanderkooy mix (perfecte bit eenheid, roll-off -48 dB/octaaf). LinkwitzRiley8 Isolator - + LinkwitzRiley8 Isolator LR8 ISO - + LR8 ISO A Linkwitz-Riley 8th-order filter isolator (optimized crossover, constant phase shift, roll-off -48 dB/octave). - + Een Linkwitz-Riley 8ste-order filterisolator (geoptimaliseerde crossover, constante faseverschuiving, roll-off -48 dB/octaaf). Biquad Equalizer - + Biquad Equalizer BQ EQ - + BQ EQ A 3-band Equalizer with two biquad bell filters, a shelving high pass and kill switches. - + Een 3-bands equalizer met twee biquad-belfilters, een hoge schaaldoorlaat en demp-schakelaars. Device not found - + Apparaat niet gevonden Biquad Full Kill Equalizer - + Biquad Full Kill Equalizer BQ EQ/ISO - + BQ EQ/ISO A 3-band Equalizer that combines an Equalizer and an Isolator circuit to offer gentle slopes and full kill. - + Een 3-bands equalizer die een equalizer en een isolatorcircuit combineert voor zachte responscurven en volledige demping. Loudness Contour - + Geluidomtrek Loudness - + Geluidsterkte Amplifies low and high frequencies at low volumes to compensate for reduced sensitivity of the human ear. - + Versterkt lage en hoge frequenties bij lage volumes om de verminderde gevoeligheid van het menselijk oor te compenseren. Set the gain of the applied loudness contour - + Stel de versterking van de toegepaste geluidsterktecontour in Use Gain - + Gebruik versterking Follow Gain Knob - + Volgknop versterking This stream is online for testing purposes! - + Deze stream is enkel online voor testdoeleinden! Live Mix - + Live Mix 16 bits - + 16 bits 24 bits - + 24 bits Bit depth - + Bit diepte Bitrate Mode - + Bitrate Modus 32 bits float - + 32 bits float Balance - + Balans Adjust the left/right balance and stereo width - + Pas de balans links/rechts en de stereobreedte aan Adjust balance between left and right channels - + Balans aanpassen tussen de linker en rechter kanalen Mid/Side - + Miden/Zijkant Bypass Fr. - + FR. omleiden Bypass Frequency - + Frequentie omleiden Stereo Balance - + Stereo Balans @@ -8943,195 +9026,210 @@ Fully left: mono Fully right: only side ambiance Center: does not change the original signal. - + Pas de stereobreedte aan door de balans tussen het midden en de zijkant van het signaal te veranderen. +Volledig links: mono +Geheel rechts: enkel zijdelingse sfeer +Centrum: verandert het originele signaal niet. Frequencies below this cutoff are not adjusted in the stereo field - + Frequenties onder deze cutoff worden niet aangepast in het stereoveld Parametric Equalizer - + Parametrische Equalizer Param EQ - + Param EQ An gentle 2-band parametric equalizer based on biquad filters. It is designed as a complement to the steep mixing equalizers. - + Een zachte 2-bands parametrische equalizer op basis van biquad-filters. +Het is ontworpen als aanvulling op de sterke meng-equalizers Gain 1 - + Versterking 1 Gain for Filter 1 - + Versterking voor Filter 1 Q 1 - + Q 1 Controls the bandwidth of Filter 1. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Regelt de bandbreedte van filter 1. +Een lagere Q beïnvloedt een bredere frequentieband, +een hogere Q beïnvloedt een smallere frequentieband. Center 1 - + Center 1 Center frequency for Filter 1, from 100 Hz to 14 kHz - + Centrale frequentie voor Filter 1, van 100 Hz tot 14 kHz Gain 2 - + Versterking 2 Gain for Filter 2 - + Versterking voor Filter 2 Q 2 - + Q 2 Controls the bandwidth of Filter 2. A lower Q affects a wider band of frequencies, a higher Q affects a narrower band of frequencies. - + Regelt de bandbreedte van filter 2. +Een lagere Q beïnvloedt een bredere frequentieband, +een hogere Q beïnvloedt een smallere frequentieband. Center 2 - + Center 2 Center frequency for Filter 2, from 100 Hz to 14 kHz - + Centrale frequentie voor Filter 2, van 100 Hz tot 14 kHz Tremolo - + Tremolo Cycles the volume up and down - + Schakelt het volume omhoog en omlaag How much the effect changes the volume - + Hoeveel het effect het volume verandert Rate - + Snelheid Rate of the volume changes 4 beats - 1/8 beat if tempo is detected 1/4 Hz - 8 Hz if no tempo is detected - + De snelheid van het volume verandert +4 beats - 1/8 beat als tempo wordt gedetecteerd +1/4 Hz - 8 Hz als er geen tempo wordt gedetecteerd Width of the volume peak 10% - 90% of the effect period - + Breedte van de volumepiek +10% - 90% van de effectperiode Shape of the volume modulation wave Fully left: Square wave Fully right: Sine wave - + Vorm van de volumemodulatiegolf +Volledig links: blokgolf +Helemaal rechts: sinusgolf When the Quantize parameter is enabled, divide the effect period by 3. - + Wanneer de Quantize-parameter is ingeschakeld, deelt u de effectperiode door 3. Waveform - + Waveform Phase - + Fase Shifts the position of the volume peak within the period Fully left: beginning of the effect period Fully right: end of the effect period - + Verschuift de positie van de volumepiek binnen de periode +Volledig links: begin van de effectperiode +Volledig rechts: einde van de effectperiode Round the Rate parameter to the nearest whole division of a beat. - + Rond de parametersnelheid af op de dichtstbijzijnde hele deling van een beat. Triplet - + Drievoudig Built-in Used for effects that are built into Mixxx - + Ingebouwd This plugin does not support stereo samples as input/output - + Deze plug-in ondersteunt geen stereosamples als invoer / uitvoer This plugin has features which are not yet supported - + Deze plug-in heeft functies die nog niet worden ondersteund Unknown status - + Onbekende status @@ -9139,7 +9237,7 @@ Simple - + Eenvoudig @@ -9147,7 +9245,7 @@ Filtered - + Gefilterd @@ -9155,7 +9253,7 @@ RGB - + RGB @@ -9163,7 +9261,7 @@ Recordings - + Opnames @@ -9171,32 +9269,32 @@ Low Disk Space Warning - + Waarschuwing voor onvoldoende schijfruimte There is less than 1 GiB of useable space in the recording folder - + Er is minder dan 1 Gb bruikbare ruimte in de opnamemap Recording - + Opname Could not create audio file for recording! - + Kan geen audiobestand maken voor opname! Ensure there is enough free disk space and you have write permission for the Recordings folder. - + Zorg ervoor dat er voldoende vrije schijfruimte is en dat u schrijfrechten heeft voor de map Opnamen. You can change the location of the Recordings folder in Preferences -> Recording. - + U kunt de locatie van de map Opnamen wijzigen in Voorkeuren -> Opname. @@ -9214,7 +9312,7 @@ Rhythmbox - + Rhythmbox @@ -9222,39 +9320,39 @@ Save Sampler Bank - + Save Sampler opslaan Mixxx Sampler Banks (*.xml) - + Mixxx Sampler Banks (*.xml) Error Saving Sampler Bank - + Fout bij opslaan van Sampler Bank Could not write the sampler bank to '%1'. - + Kan de sampler bank niet wegschrijven naar '% 1'. Load Sampler Bank - + Sampler Bank laden Error Reading Sampler Bank - + Fout bij lezen van de Sampler Bank Could not open the sampler bank file '%1'. - + Het sampler bank-bestand %1 kon niet worden geopend. @@ -9262,23 +9360,23 @@ Join with previous - + Voeg toe aan vorige Create new history playlist - + Maak een nieuwe historiekafspeellijst - + History - + Historiek Unlock - + Ontgrendel @@ -9286,24 +9384,24 @@ Vergrendelen - + The history section automatically keeps a list of tracks you play in your DJ sets. - + De geschiedenissectie houdt automatisch een lijst bij van de tracks die je in je dj-sets afspeelt. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Dit is handig om te onthouden wat werkte in uw DJ-sets, set-lijsten te plaatsen of uw set-lijsten te rapporteren aan auteursrechtenorganisaties. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + Telkens wanneer je Mixxx start, wordt er een nieuwe geschiedenissectie aangemaakt. Je kan deze exporteren als afspeellijst in verschillende formaten of het opnieuw afspelen met Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". - + U kan de huidige geschiedenissessie samenvoegen met een vorige door met de rechtermuisknop te klikken en "samenvoegen met vorige" te selecteren. @@ -9312,172 +9410,172 @@ Mixxx encountered a problem - + Mixxx ondervond een probleem Could not allocate shout_t - + Kon shout_t niet toewijzen Could not allocate shout_metadata_t - + Kon shout_metadata_t niet toewijzen Error setting non-blocking mode: - + Fout bij instellen van niet-blokkerende modus: Error setting tls mode: - + Fout bij instellen van de tls modus Error setting hostname! - + Fout bij instellen hostname! Error setting port! - + Fout bij het instellen poort! Error setting password! - + Fout bij het instellen van paswoord! Error setting mount! - + Fout bij het instellen van koppeling! Error setting username! - + Fout bij het instellen van gebruikersnaam! Error setting stream name! - + Fout bij het instellen van stream-naam! Error setting stream description! - + Fout bij het instellen van de stream-omschrijving! Error setting stream genre! - + Fout bij het instellen van het stream-genre! Error setting stream url! - + Fout bij het instellen van de stream-url! Error setting stream IRC! - + Fout bij het instellen van het stream-IRC! Error setting stream AIM! - + Fout bij het instellen van de stream-AIM! Error setting stream ICQ! - + Fout bij het instellen van de stream-ICQ! Error setting stream public! - + Fout bij het instellen van de openbare stream! Broadcasting at 96kHz with Ogg Vorbis is not currently supported. Please try a different sample-rate or switch to a different encoding. - + Uitzending op 96kHz met Ogg Vorbis wordt momenteel niet ondersteund. Probeer een andere sample-rate of schakel over naar een andere codering. See https://bugs.launchpad.net/mixxx/+bug/686212 for more information. - + Zie https://bugs.launchpad.net/mixxx/+bug/686212 voor meer informatie. Error setting bitrate - + Fout bij het instellen van de bitrate Error: unknown server protocol! - + Fout: onbekend serverprotocol! Error: libshout only supports Shoutcast with MP3 format! - + Fout: libshout ondersteunt alleen Shoutcast met MP3-formaat! Error setting protocol! - + Fout bij het instellen van het protocol! Network cache overflow - + Netwerk cache overflow Connection error - + Connectiefout One of the Live Broadcasting connections raised this error:<br><b>Error with connection '%1':</b><br> - + Een van de Live Uitzending-verbindingen veroorzaakte deze fout:<br><b>Fout met verbinding '%1':</b><br> Connection message - + Connectiebericht <b>Message from Live Broadcasting connection '%1':</b><br> - + <b>Bericht van Live Uitzending-verbinding '%1':</b><br> Lost connection to streaming server and %1 attempts to reconnect have failed. - + Verbinding met streaming-server is verbroken en %1 pogingen om opnieuw verbinding te maken, zijn mislukt. Lost connection to streaming server. - + Verbinding met de streaming-server verbroken. Please check your connection to the Internet. - + Controleer uw verbinding met internet. Can't connect to streaming server - + Kan niet verbinden met de streaming-server Please check your connection to the Internet and verify that your username and password are correct. - + Controleer uw verbinding met internet en controleer of uw gebruikersnaam en wachtwoord correct zijn. @@ -9485,31 +9583,31 @@ Filtered - + Gefilterd SoundManager - - + + a device - + Een apparaat - + An unknown error occurred - + Er is een onbekende fout opgetreden - + Two outputs cannot share channels on "%1" - + Twee uitgangen kunnen geen kanalen delen op %1 - + Error opening "%1" - + Fout bij het openen van "%1" @@ -9522,7 +9620,7 @@ Count - + Tellen @@ -9532,37 +9630,37 @@ Units - + Eenheden Sum - + Som Min - + Min Max - + Max Mean - + Gemiddeld Variance - + Variantie Standard Deviation - + Standaard omleiding @@ -9570,17 +9668,17 @@ Fingerprinting track - + Vingerafdruk maken van track Identifying track - + Track identificeren Downloading Metadata - + Downloaden van Metadata @@ -9588,203 +9686,203 @@ Reset to default value. - + Reset naar standaardwaarde. Left-click - + Linkerklik Right-click - + Rechterklik Scroll-wheel - + Scrollwiel loop active - + loop actief loop inactive - + loop inactief Effects within the chain must be enabled to hear them. - + Effecten binnen de keten moeten ingeschakeld zijn om ze te kunnen horen. Waveform Overview - + Waveform Overzicht Shows information about the track currently loaded in this channel. - + Toont informatie over de track die momenteel in dit kanaal is geladen. Use the mouse to scratch, spin-back or throw tracks. - + Gebruik de muis om te scratchen, te backenspinnen of de track in je set te gooien. Waveform Display - + Waveform weergave Shows the loaded track's waveform near the playback position. - + Toont de waveform van de geladen track nabij de afspeelpositie. Drag with mouse to make temporary pitch adjustments. - + Sleep met de muis om de toonhoogte tijdelijk aan te passen. Scroll to change the waveform zoom level. - + Scroll om het zoomniveau van de waveform te wijzigen. Waveform Zoom Out - + Waveform Uitzoomen Waveform Zoom In - + Waveform Inzoomen Waveform Zoom - + Waveform Zoom Spinning Vinyl - + Spinnend Vinyl Rotates during playback and shows the position of a track. - + Draait tijdens het afspelen en toont de positie van een track. Right click to show cover art of loaded track. - + Klik rechtermuisknop om de albumhoes van het geladen nummer weer te geven. Gain - + Versterken Adjusts the pre-fader gain of the track (to avoid clipping). - + Past de pre-fader versterking van de track aan (om clipping te voorkomen). (too loud for the hardware and is being distorted). - + (te luid voor de hardware en wordt vervormd). Indicates when the signal on the channel is clipping, - + Geeft aan wanneer het signaal op het kanaal wordt verknipt, Master Peak Indicator - + Master Peak Indicator Indicates when the signal on the master output is clipping, - + Geeft aan wanneer het signaal op de hoofduitgang wordt verknipt. Channel Volume Meter - + Volumemeter van het kanaal Shows the current channel volume. - + Toont het huidige kanaalvolume Microphone Volume Meter - + Microfoon Volume Meter Shows the current microphone volume. - + Toont het huidige microfoonvolume. Shows the current master volume for the left channel. - + Toont het huidige hoofdvolume voor het linker kanaal. Master Channel R Volume Meter - + Volumemeter voor Master-kanaal R Volume Control - + Volumeregelaar Adjusts the volume of the selected channel. - + Past het volume van het geselecteerd kanaal aan. Master Volume - + Hoofdvolume Adjusts the master output volume. - + Past het volume van de masteruitgang aan. Master Gain - + Hoofduitgang Versterking Adjusts the master output gain. - + Past de versterking van de hoofduitgang aan. Booth Gain - + Booth Versterking Adjusts the booth output gain. - + Pas de booth uitgang aan. @@ -9794,97 +9892,97 @@ Determines the master output by fading between the left and right channels. - + Bepaalt wat de hoofduitgang is door te faden tussen de linker- en rechterkanalen. Balance - + Balans Adjusts the left/right channel balance on the master output. - + Past de balans van het linker/rechter kanaal op de hoofduitgang aan. Headphone Volume - + Volume Hoofdtelefoon Adjusts the headphone output volume. - + Past het volume van de hoofdtelefoon aan. Headphone Gain - + Hoofdtelefoon Versterking Adjusts the headphone output gain. - + Past de versterking van de hoofdtelefoonuitgang aan. Headphone Mix - + Hoofdtelefoon Mix Headphone Split Cue - + Hoofdtelefoon Split Cue If activated, the master signal plays in the right channel, while the cueing signal plays in the left channel. - + Indien geactiveerd, speelt het mastersignaal in het rechterkanaal, terwijl het cueing-signaal in het linkerkanaal speelt. Adjust the Headphone Mix so in the left channel is not the pure cueing signal. - + Pas de hoofdtelefoonmix zo aan dat in het linkerkanaal niet het pure cueing-signaal word weergegeven. Microphone - + Microfoon Show/hide the Microphone section. - + Toon/verberg de microfoonsectie. Sampler - + Sampler Show/hide the Sampler section. - + Toon/verberd de Samplersectie. Vinyl Control - + Vinyl Control Show/hide the Vinyl Control section. - + Toon/verberg de sectie Vinylbesturing. Preview Deck - + Preview Deck Show/hide the Preview deck. - + Toon/verberg de Preview speler. @@ -9895,257 +9993,257 @@ Show/hide Cover Art. - + Toon/verberg Albumhoezen Toggle 4 Decks - + Wissel naar 4 Spelers Switches between showing 2 decks and 4 decks. - + Schakelt tussen weergave van 2 spelers en 4 spelers. Show Library - + Toon bibliotheek Show or hide the track library. - + Toon of verberg de track bibliotheek. Show Effects - + Toon Effecten Show or hide the effects. - + Toon of verberg de effecten. Toggle Mixer - + Schakel Mixer Show or hide the mixer. - + Toon of verberg de mixer. Microphone Volume - + Microfoonvolume Adjusts the microphone volume. - + Past het volume voor de microfoon aan. Microphone Gain - + Microfoon versterking Adjusts the pre-fader microphone gain. - + Past de pre-fader versterking van de microfoon aan. Microphone Talk-Over - + Microfoon Talk-Over Hold-to-talk or short click for latching to - + Vasthouden voor praten of kort klikken voor vergrendeling om mix microphone input into the master output. - + mix de microfooninvoer naar de hoofduitgang Microphone Talkover Mode - + Microfoon Talkover Modus Off: Do not reduce music volume - + Uit: verlaag het muziekvolume niet Auto: Automatically reduce music volume when microphones are in use. Adjust the amount the music volume is reduced with the Strength knob. - + Auto: verlaagt automatisch het muziekvolume wanneer microfoons worden gebruikt. Aanpassen van het muziekvolume wordt verlaagd met de knop voor dempingssterkte. Manual: Reduce music volume by a fixed amount set by the Strength knob. - + Manueel: Verlaag het muziekvolume met een vaste waarde, die wordt ingesteld met de knop voor dempingssterkte. Behavior depends on Microphone Talkover Mode: - + Het gedrag is afhankelijk van de Talkover-modus van de microfoon: Off: Does nothing - + Uit: Doet niets Auto: Sets how much to reduce the music volume when microphones are in use. - + Auto: hiermee stelt u in hoeveel het muziekvolume moet worden verlaagd wanneer microfoons worden gebruikt. Manual: Sets how much to reduce the music volume, regardless of volume of microphone inputs. - + Manueel: Stelt in hoeveel het muziekvolume moet worden verlaagd, ongeacht het volume van de microfooningangen. Raise Pitch - + Verhoog de toon Sets the pitch higher. - + Stelt de toon hoger in Sets the pitch higher in small steps. - + Toon hoger instellen in kleine stappen. Lower Pitch - + Verlaag toon Sets the pitch lower. - + Stelt de toon lager in. Sets the pitch lower in small steps. - + Zet de toon lager in kleine stappen. Raise Pitch Temporary (Nudge) - + Verhoog toon tijdelijk (aanduwen) Holds the pitch higher while active. - + Houdt de toonhoogte hoger terwijl deze actief is. Holds the pitch higher (small amount) while active. - + Houdt de toonhoogte hoger terwijl deze actief is. Lower Pitch Temporary (Nudge) - + Verlaag toon tijdelijk (aanduwen) Holds the pitch lower while active. - + Houdt de toonhoogte lager terwijl deze actief is. Holds the pitch lower (small amount) while active. - + Houdt de toonhoogte lager (kleine hoeveelheid) terwijl deze actief is. Low EQ - + Low EQ Adjusts the gain of the low EQ filter. - + Past de versterking van het lage EQ-filter aan. Mid EQ - + Mid EQ Adjusts the gain of the mid EQ filter. - + Past de versterking van het midden EQ-filter aan. High EQ - + High EQ Adjusts the gain of the high EQ filter. - + Past de versterking van het hoge EQ-filter aan. Hold-to-kill or short click for latching. - + Vasthouden om te dempen of kort klikken om te vergrendelen. High EQ Kill - + Demp Hoge EQ Holds the gain of the high EQ to zero while active. - + Houdt de versterking van de hoge EQ op nul terwijl deze actief is. Mid EQ Kill - + Demp Midden EQ Holds the gain of the mid EQ to zero while active. - + Houdt de versterking van de midden EQ op nul terwijl deze actief is. Low EQ Kill - + Demp Lage EQ Holds the gain of the low EQ to zero while active. - + Houdt de versterking van de lage EQ op nul terwijl deze actief is. Displays the tempo of the loaded track in BPM (beats per minute). - + Toont het tempo van het geladen track in BPM (slagen per minuut). Tempo - + Tempo @@ -10155,485 +10253,487 @@ BPM Tap - + BPM Tik When tapped repeatedly, adjusts the BPM to match the tapped BPM. - + Bij herhaaldelijk tikken, wordt de BPM aangepast zodat deze overeenkomt met de getikte BPM. Adjust BPM Down - + Pas BPM aan naar omlaag When tapped, adjusts the average BPM down by a small amount. - + Wanneer erop wordt getikt, wordt de gemiddelde BPM met een kleine waarde verlaagd. Adjust BPM Up - + Pas BPM aan naar omhoog When tapped, adjusts the average BPM up by a small amount. - + Wanneer erop wordt getikt, wordt de gemiddelde BPM met een kleine waarde verhoogd. Adjust Beats Earlier - + Verschuift de beats naar voor When tapped, moves the beatgrid left by a small amount. - + Wanneer erop getikt wordt, zal het beat-raster naar links verplaatst worden met een kleine waarde. Adjust Beats Later - + Verschuift de beats naar achter When tapped, moves the beatgrid right by a small amount. - + Wanneer erop getikt wordt, zal het beat-raster naar rechts verplaatst worden met een kleine waarde. Tempo and BPM Tap - + Tempo en BPM Tap Show/hide the spinning vinyl section. - + Toon/verberg de draaiende vinylsectie Keylock - + Keylock Toggling keylock during playback may result in a momentary audio glitch. - + Het omschakelen van de toetsvergrendeling tijdens het afspelen kan resulteren in een kortstondige audio-storing. Toggle visibility of Rate Control - + Omschakeling van de zichtbaarheid van Rate Control Places a cue point at the current position on the waveform. - + Plaatst een cue-punt op de huidige positie op de waveform. Stops track at cue point, OR go to cue point and play after release (CUP mode). - + Stopt track op cue point, OF ga naar cue point en speel na loslaten (CUP-modus). Set cue point (Pioneer/Mixxx/Numark mode), set cue point and play after release (CUP mode) OR preview from it (Denon mode). - + Stel het cue-punt in (Pioneer/Mixxx/Numark-modus), stel het cue-punt in en speel na het loslaten (CUP-modus) OF bekijk er een voorbeeld van (Denon-modus). Seeks the track to the cue point and stops. - + Doorzoekt de track naar het cue-punt en stopt. Play - + Speel Plays track from the cue point. - + Speelt de track vanaf het cuepunt Changes the track playback speed (affects both the tempo and the pitch). If keylock is enabled, only the tempo is affected. - + Wijzigt de afspeelsnelheid van de track (beïnvloedt zowel het tempo als de toonhoogte). Als keylock is ingeschakeld, wordt alleen het tempo beïnvloed. Recording Duration - + Opnameduur Displays the duration of the running recording. - + Geeft de duur van de lopende opname weer. Sets the track Loop-In Marker to the current play position. - + Stelt de track Loop-In Marker in op de huidige afspeelpositie. Press and hold to move Loop-In Marker. - + Houd ingedrukt om Loop-In Marker te verplaatsen. Jump to Loop-In Marker. - + Spring naar Loop-In Marker. Sets the track Loop-Out Marker to the current play position. - + Stelt de track Loop-Out Marker in op de huidige afspeelpositie. Press and hold to move Loop-Out Marker. - + Houd ingedrukt om Loop-Out Marker te verplaatsen. Jump to Loop-Out Marker. - + Spring naar Loop-Out Marker. Beatloop Size - + Beatloop maat Select the size of the loop in beats to set with the Beatloop button. - + Selecteer de maat van de loop in beats om de Beatloop-knop in te stellen. Changing this resizes the loop if the loop already matches this size. - + Als u dit wijzigt, wordt de maat van de loop aangepast als de loop al overeenkomt met deze grootte. Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - + Halveer de maat van een bestaande beatloop of halveer de maat van de volgende beatloop die ingesteld is met de Beatloop-knop. Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - + Verdubbel de maat van een bestaande beatloop of verdubbel de maat van de volgende beatloop die ingesteld is met de Beatloop-knop. Start a loop over the set number of beats. - + Start een loop over het ingestelde aantal beats. Temporarily enable a rolling loop over the set number of beats. - + Schakel tijdelijk een loop-roll in over het ingestelde aantal beats. Beatjump/Loop Move Size - + Beatjump / Loop Move Maat Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - + Selecteer het aantal beats om te verspringen of de loop te verplaatsen met de Beatjump Vooruit/Achteruit knoppen. Beatjump Forward - + Beatjump voorwaarts Jump forward by the set number of beats. - + Spring vooruit met het ingestelde aantal beats. Move the loop forward by the set number of beats. - + Verplaats de loop vooruit met het ingestelde aantal beats. Jump forward by 1 beat. - + Spring 1 beat vooruit. Move the loop forward by 1 beat. - + Verplaats de loop met 1 beat vooruit. Beatjump Backward - + Beatjump achteruit Jump backward by the set number of beats. - + Spring achteruit met het ingestelde aantal beats. Move the loop backward by the set number of beats. - + Verplaats de loop achteruit met het ingestelde aantal beats. Jump backward by 1 beat. - + Spring 1 beat achteruit. Move the loop backward by 1 beat. - + Verplaats de loop 1 beat achteruit. Reloop - + Reloop If the loop is ahead of the current position, looping will start when the loop is reached. - + Als de loop voor de huidige positie ligt, begint het loopen wanneer de loop is bereikt. Works only if Loop-In and Loop-Out Marker are set. - + Werkt alleen als Loop-In en Loop-Out Markeerpunten zijn ingesteld. Enable loop, jump to Loop-In Marker, and stop playback. - + Schakel loop in, spring naar het Loop-In Markeerpunt en stop het afspelen. Displays the elapsed and/or remaining time of the track loaded. - + Geeft de verstreken en/of resterende tijd van de geladen track weer. Click to toggle between time elapsed/remaining time/both. - + Klik om te wisselen tussen verstreken/resterende tijd of beide. Mix - + Mix Adjust the mixing of the dry (input) signal with the wet (output) signal of the effect unit - + Pas de mix van het onbewerkte (droge) ingangssignaal aan met het verwerkte (natte) uitgangssignaal van de effecteenheid D/W mode: Crossfade between dry and wet - + D/W-modus: overgang tussen onbewerkt en verwerkt D+W mode: Add wet to dry - + D+W modus: voeg verwerkt (wet) toe aan onbewerkt (dry) Mix Mode - + Mix Modus Adjust how the dry (input) signal is mixed with the wet (output) signal of the effect unit - + Pas aan hoe het onbewerkte (invoer) signaal wordt gemengd met het bewerkte (uitvoer) signaal van de effecteenheid Dry/Wet mode (crossed lines): Mix knob crossfades between dry and wet Use this to change the sound of the track with EQ and filter effects. - + Dry/Wet-modus (gekruiste lijnen): Mix-knop vloeit over tussen bewerkt en onbewerkt +Gebruik dit om het geluid van de track te veranderen met EQ en filtereffecten. Dry+Wet mode (flat dry line): Mix knob adds wet to dry Use this to change only the effected (wet) signal with EQ and filter effects. - + Dry + Wet Mode (Flat Dry Line): Mix-knop voegt Wet to Dry toe +Gebruik deze optie om alleen het verwerkte (Wet) signaal met EQ en filtereffecten te wijzigen. Route the left crossfader bus through this effect unit. - + Leid de linker crossfaderbus door dit effectapparaat. Route the right crossfader bus through this effect unit. - + Leid de rechter crossfaderbus door dit effectapparaat. Right side active: parameter moves with right half of Meta Knob turn - + Rechterkant actief: parameter beweegt met de rechterhelft van de Meta-knop Skin Settings Menu - + Menu Skin-instellingen Show/hide skin settings menu - + Toon/verberg menu Skin-instellingen Save Sampler Bank - + Save Sampler opslaan Save the collection of samples loaded in the samplers. - + Sla de collectie van samples op die in de samplers zijn geladen. Load Sampler Bank - + Sampler Bank laden Load a previously saved collection of samples into the samplers. - + Laad een eerder opgeslagen collectie samples op in de samplers. Show Effect Parameters - + Toon Effect Parameters Enable Effect - + Effect inschakelen Meta Knob Link - + Meta Knob Link Set how this parameter is linked to the effect's Meta Knob. - + Stel in hoe deze parameter wordt gekoppeld aan het effect van de metaknop. Meta Knob Link Inversion - + Meta Knob Link Inversie Inverts the direction this parameter moves when turning the effect's Meta Knob. - + Keert de richting om die deze parameter beweegt, wanneer u aan de metaknop van het effect draait. Super Knob - + Super knop Next Chain - + Volgende Schakel Previous Chain - + Vorige keten Next/Previous Chain - + Volgende/Vorige Keten Clear - + Wissen Clear the current effect. - + Wis het huidige effect. Toggle - + Omschakelen Toggle the current effect. - + Schakel het huidige effect om. Next - + Volgende Clear Unit - + Wis Eenheid Clear effect unit. - + Wis de effect-eenheid Show/hide parameters for effects in this unit. - + Toon/verberg parameters voor effecten in deze unit. Toggle Unit - + Wissel Eenheid Enable or disable this whole effect unit. - + In of uitschakelen van deze hele effecteneenheid. Controls the Meta Knob of all effects in this unit together. - + Bestuurt de metaknop van alle effecten samen in deze eenheid. Load next effect chain preset into this effect unit. - + Laad de volgende vooraf ingestelde effectketen in deze effecteenheid. Load previous effect chain preset into this effect unit. - + Laad vorige vooraf ingestelde effectenketen in deze effecteneenheid. Load next or previous effect chain preset into this effect unit. - + Laad vorige of volgende vooraf ingestelde effectenketen in deze effecteneenheid. @@ -10646,1059 +10746,1059 @@ Assign Effect Unit - + Wijs effecteneenheid toe Assign this effect unit to the channel output. - + Wijs deze effecteneenheid toe aan de kanaaluitvoer. Route the headphone channel through this effect unit. - + Stuur het hoofdtelefoonkanaal door deze effecteneenheid. Route the master mix through this effect unit. - + Stuur de hoofd-mix door deze effecteneenheid. Route this deck through the indicated effect unit. - + Stuur deze spelen door de aangegeven effecteneenheid. Route this sampler through the indicated effect unit. - + Stuur deze sampler door de aangegeven effecteneenheid. Route this microphone through the indicated effect unit. - + Stuur de microfoon door de aangegeven effecteneenheid. Route this auxiliary input through the indicated effect unit. - + Stuur de auxiliary ingang door de aangegeven effecteneenheid. The effect unit must also be assigned to a deck or other sound source to hear the effect. - + De effecteenheid moet ook zijn toegewezen aan een speler of andere geluidsbron om het effect te horen. Switch to the next effect. - + Schakel over naar het volgende effect. Previous - + Vorige Switch to the previous effect. - + Schakel over naar het vorige effect. Next or Previous - + Volgende of Vorige Switch to either the next or previous effect. - + Schakel over naar het volgende of vorige effect. Meta Knob - + Meta Knop Controls linked parameters of this effect - + Bestuurt gekoppelde parameters van dit effect Effect Focus Button - + Effect Focus knop Focuses this effect. - + Focust op dit effect Unfocuses this effect. - + Neemt de focus weg van dit effect. Refer to the web page on the Mixxx wiki for your controller for more information. - + Raadpleeg voor meer informatie de webpagina op de Mixxx-wiki voor je controller . Effect Parameter - + Effect Parameter Adjusts a parameter of the effect. - + Past een parameter van het effect aan. Inactive: parameter not linked - + Inactief: parameter niet gekoppeld. Active: parameter moves with Meta Knob - + Actief: parameter beweegt met metaknop Left side active: parameter moves with left half of Meta Knob turn - + Linkerkant actief: parameter beweegt met linkerhelft van de metaknopdraai Left and right side active: parameter moves across range with half of Meta Knob turn and back with the other half - + Linker- en rechterkant actief: parameter beweegt over bereik met de helft van de metaknopdraai en terug met de andere helft Equalizer Parameter Kill - + Demp Equalizer Parameter Holds the gain of the EQ to zero while active. - + Houdt de versterking van de EQ op nul terwijl deze actief is. Quick Effect Super Knob - + Superknop Quick Effect Quick Effect Super Knob (control linked effect parameters). - + Superknop Quick Effect ( controle op gekoppelde effectparameters). Hint: Change the default Quick Effect mode in Preferences -> Equalizers. - + Hint: Wijzig de standaard Quick Effect-modus in Voorkeuren -> Equalizers. Equalizer Parameter - + Equalizer Parameter Adjusts the gain of the EQ filter. - + Pas de versterking van het EQ filter aan. Hint: Change the default EQ mode in Preferences -> Equalizers. - + Hint: Wijzig de standaard EQ-modus in Voorkeuren -> Equalizers. Adjust Beatgrid - + Pas Beat-raster aan Adjust beatgrid so the closest beat is aligned with the current play position. - + Pas het beat-raster aan zodat de dichtstbijzijnde beat uitgelijnd is met de huidige afspeelpositie. Adjust beatgrid to match another playing deck. - + Pas Beat-raster overeenkomstig aan andere speler If quantize is enabled, snaps to the nearest beat. - + Als quantize is ingeschakeld, springt het naar de dichtstbijzijnde tel. Quantize - + Quantize Toggles quantization. - + Schakelt quantisatie in/uit. Loops and cues snap to the nearest beat when quantization is enabled. - + Loops en cues springen naar de dichtstbijzijnde beat wanneer kwantisering is ingeschakeld. Reverse - + Omkeren Reverses track playback during regular playback. - + Keert het afspelen van de track om tijdens normaal afspelen. Puts a track into reverse while being held (Censor). - + Keert een track om wanneer deze wordt vastgehouden (Censor). Playback continues where the track would have been if it had not been temporarily reversed. - + Het afspelen gaat verder waar het nummer zou zijn geweest als het niet tijdelijk was omgekeerd. Play/Pause - + Speel/Pauze Jumps to the beginning of the track. - + Spring naar het begin van de track. Syncs the tempo (BPM) and phase to that of the other track, if BPM is detected on both. - + Synchroniseert het tempo (BPM) en fase met dat van de andere track, als BPM op beide wordt gedetecteerd. Syncs the tempo (BPM) to that of the other track, if BPM is detected on both. - + Synchroniseert het tempo (BPM) met dat van de andere track, als BPM op beide wordt gedetecteerd. Sync and Reset Key - + Synchroniseer en herstel Key Increases the pitch by one semitone. - + Verhoogt de toonhoogte met een halve toon. Decreases the pitch by one semitone. - + Verlaagt de toonhoogte met een halve toon. Enable Vinyl Control - + Schakel Vinylbediening in When disabled, the track is controlled by Mixxx playback controls. - + Indien uitgeschakeld, wordt de track bestuurd door Mixxx-afspeelknoppen. When enabled, the track responds to external vinyl control. - + Indien ingeschakeld, reageert de track op externe vinylbediening. Enable Passthrough - + Passthrough inschakelen Indicates that the audio buffer is too small to do all audio processing. - + Geeft aan dat de audiobuffer te klein is om alle audiobewerking uit te voeren. Displays cover artwork of the loaded track. - + Toont hoes van de geladen track. Displays options for editing cover artwork. - + Toont de bewerkopties voor de hoes. Star Rating - + Sterwaardering Assign ratings to individual tracks by clicking the stars. - + Ken waarderingen toe aan individuele tracks door op de sterren te klikken. Channel Peak Indicator - + Kanaal piekindicator Channel L Peak Indicator - + Kanaal L piekindicator Indicates when the left signal on the channel is clipping, - + Geeft aan wanneer het signaal op de hoofduitgang wordt vervormd. Channel R Peak Indicator - + Kanaal R piekindicator Indicates when the right signal on the channel is clipping, - + Geeft aan wanneer het rechtersignaal op het kanaal wordt vervormd. Master L Peak Indicator - + Master L piekindicator Indicates when the left signal on the master output is clipping, - + Geeft aan wanneer het linkersignaal op de hoofduitgang wordt vervormd, Master R Peak Indicator - + Master R piekindicator Indicates when the right signal on the master output is clipping, - + Geeft aan wanneer het rechtersignaal op de hoofduitgang wordt vervormd, Channel L Volume Meter - + Kanaal L volumemeter Shows the current channel volume for the left channel. - + Toont het huidige kanaalvolume voor het linkerkanaal. Channel R Volume Meter - + Kanaal R volumemeter Shows the current channel volume for the right channel. - + Toont het huidige kanaalvolume voor het rechterkanaal. Microphone Peak Indicator - + Microfoon piekindicator Indicates when the signal on the microphone is clipping, - + Geeft aan wanneer het signaal op de microfoon wordt vervormd, Sampler Volume Meter - + Sampler Volumemeter Shows the current sampler volume. - + Toont het huidige sampler-volume Sampler Peak Indicator - + Sampler piekindicator Indicates when the signal on the sampler is clipping, - + Geeft aan wanneer het signaal op de sampler wordt vervormd. Preview Deck Volume Meter - + Volumemeter voorbeluistering Shows the current Preview Deck volume. - + Toont het huidige voorbeluisteringsvolume Preview Deck Peak Indicator - + Voorbeluistering piekindicator Indicates when the signal on the Preview Deck is clipping, - + Geeft aan wanneer het signaal op de voorbeluistering wordt vervormd, Master Channel L Volume Meter - + Hoofdkanaal L volumemeter Maximize Library - + Maximaliseer bibliotheek Maximize the track library to take up all the available screen space. - + Maximaliseer de trackbibliotheek in de beschikbare schermruimte. Microphone Talkover Ducking Strength - + Dempsterkte microfoon Talkover Prevents the pitch from changing when the rate changes. - + Voorkomt dat de toonhoogte verandert wanneer de snelheid verandert. Changes the number of hotcue buttons displayed in the deck - + Wijzigt het aantal hotcue-knoppen dat in de speler wordt weergegeven Starts playing from the beginning of the track. - + Begint te spelen vanaf het begin van de track. Jumps to the beginning of the track and stops. - + Sprint naar het begin van de track en stopt. Plays or pauses the track. - + Speelt of pauzeert de track. (while playing) - + (tijdens het spelen) (while stopped) - + (terwijl gestopt) Cue - + Verwijzing Headphone - + Hoofdtelefoon Mute - + Dempen Mutes the selected channel's audio in the master output. - + Dempt de audio van het geselecteerde kanaal in de masteruitgang. Old Synchronize - + Oude synchronisatie (This skin should be updated to use Master Sync!) - + (Deze skin moet worden bijgewerkt om Master Sync te gebruiken!) Syncs to the first deck (in numerical order) that is playing a track and has a BPM. - + Synchroniseert met het eerste speler (in numerieke volgorde) dat een track afspeelt en een BPM heeft. If no deck is playing, syncs to the first deck that has a BPM. - + Als er geen speler speelt, wordt het gesynchroniseerd met het eerste deck met een BPM. Decks can't sync to samplers and samplers can only sync to decks. - + Spelers kunnen niet worden gesynchroniseerd met samplers en samplers kunnen alleen worden gesynchroniseerd met spelers. Enable Master Sync - + Schakel Master Sync in Tap to sync the tempo to other playing tracks or the master clock. - + Tik om het tempo te synchroniseren met andere tracks die worden afgespeeld of met de hoofdklok. Hold for at least a second to enable sync lock for this deck. - + Houd minimaal één seconde ingedrukt om het synchronisatieslot voor deze speler in te schakelen. Decks with sync locked will all play at the same tempo, and decks that also have quantize enabled will always have their beats lined up. - + Spelers met synchronisatievergrendeling, spelen allemaal in hetzelfde tempo, en spelers waarvoor ook quantisering is ingeschakeld, hebben altijd hun uitgelijnde beats. Resets the key to the original track key. - + Herstelt de toonaard naar de originele track-toonaard. Enable Sync Clock Master - + Schakel Sync Clock Master in When enabled, this device will serve as the master clock for all other decks. - + Indien ingeschakeld, zal dit apparaat dienen als de masterklok voor alle andere spelers. Speed Control - + Snelheidsbediening Changes the track pitch independent of the tempo. - + Verandert de track toonhoogte onafhankelijk van het tempo. Increases the pitch by 10 cents. - + Verhoogt de toonhoogte met 10 cent. Decreases the pitch by 10 cents. - + Verlaagt de toonhoogte met 10 cent. Pitch Adjust - + Aanpassen Pitch Adjust the pitch in addition to the speed slider pitch. - + Pas de toonhoogte als aanvulling bij de snelheid van de schuifregelaar. Record Mix - + Record Mix Toggle mix recording. - + Mix opname omschakelen. Enable Live Broadcasting - + Live-uitzenden inschakelen Stream your mix over the Internet. - + Stream je mix over het Internet. Provides visual feedback for Live Broadcasting status: - + Voorziet visuele feedback voor de status van live-uitzendingen: disabled, connecting, connected, failure. - + uitgeschakeld, verbinden, verbonden, fout. When enabled, the deck directly plays the audio arriving on the vinyl input. - + Indien ingeschakeld, speelt de speler direct de audio af die op de vinyl-invoer binnenkomt. Blue for passthrough enabled. - + Blauw voor doorvoer ingeschakeld. Playback will resume where the track would have been if it had not entered the loop. - + Het afspelen wordt hervat waar de track zou zijn geweest als deze niet in de loop was terechtgekomen. Loop Exit - + Verlaat Loop Turns the current loop off. - + Schakelt de huidige loop uit. Slip Mode - + Slip Modus When active, the playback continues muted in the background during a loop, reverse, scratch etc. - + Indien actief, gaat het afspelen op de achtergrond gedempt door tijdens een loop, achteruitspelen, scratch etc. Once disabled, the audible playback will resume where the track would have been. - + Eenmaal uitgeschakeld, wordt het hoorbare afspelen hervat waar de track zou zijn geweest. Track Key - + Track toonaard Displays the musical key of the loaded track. - + Geeft de muziekale toonaard van het geladen nummer weer. Clock - + Klok Displays the current time. - + Geeft de huidige tijd weer. Audio Latency Usage Meter - + Gebruiksmeter voor Audio Latency Displays the fraction of latency used for audio processing. - + Geeft het deel van de latentie weer dat wordt gebruikt voor audioverwerking. A high value indicates that audible glitches are likely. - + Een hoge waarde geeft aan dat hoorbare storingen waarschijnlijk zijn. Do not enable keylock, effects or additional decks in this situation. - + Schakel in deze situatie geen keylock, effecten of extra spelers in. Audio Latency Overload Indicator - + indicator voor overbelasting van de Audio Latency If Vinyl control is enabled, displays time-coded vinyl signal quality (see Preferences -> Vinyl Control). - + Als Vinylbediening is ingeschakeld, wordt de tijd-gecodeerde vinylsignaalkwaliteit weergegeven (zie Voorkeuren -> Vinylcontrole). Drop tracks from library, external file manager, or other decks/samplers here. - + Zet tracks van de bibliotheek, extern bestandsbeheer of andere spelers/samplers hier neer. Jump around in the track by clicking anywhere on the waveform. - + Spring door de track door ergens op de golfvorm te klikken. Shows the current master volume for the right channel. - + Toont het huidige mastervolume voor het rechterkanaal. Change the crossfader curve in Preferences -> Crossfader - + Wijzig de crossfader-curve in Voorkeuren -> Crossfader Crossfades the headphone output between the master mix and cueing (PFL or Pre-Fader Listening) signal. - + Crossfade de hoofdtelefoonuitgang tussen de mastermix en cueing (PFL of Pre-Fader Listening) signaal. Crossfader Orientation - + Crossfader Orientatie Set the channel's crossfader orientation. - + Stel de oriëntatie van de crossfader van het kanaal in. Either to the left side of crossfader, to the right side or to the center (unaffected by crossfader) - + Ofwel aan de linkerkant van de crossfader, aan de rechterkant of naar het midden (niet beïnvloed door crossfader) Activate Vinyl Control from the Menu -> Options. - + Activeer Vinylbediening vanuit het Menu -> Opties. Change the step-size in the Preferences -> Interface menu. - + Wijzig de stapgrootte in het menu Voorkeuren -> Interface. Displays the current musical key of the loaded track after pitch shifting. - + Toont de huidige muzikale toonaard van de geladen track na het veranderen van de toonhoogte. Sends the selected channel's audio to the headphone output, - + Stuurt de audio van het geselecteerde kanaal naar de hoofdtelefoonuitgang, selected in Preferences -> Sound Hardware. - + geselecteerd in Voorkeuren -> Geluidshardware. Fast Rewind - + Snel Terugspoelen Fast rewind through the track. - + Snel terugspoelen in de track. Fast Forward - + Snel Voorwaarts Fast forward through the track. - + Snel doorspoelen in de track. Jumps to the end of the track. - + Sprint naar het einde van de track. Sets the pitch to a key that allows a harmonic transition from the other track. Requires a detected key on both involved decks. - + Stelt de toonhoogte in op een toonaard die een harmonische overgang van de andere track mogelijk maakt. Vereist een gedetecteerde toonaard op beide betrokken dekken. Pitch Control - + Toonhoogte regeling Pitch Rate - + Toonhoogtesnelheid Displays the current playback rate of the track. - + Geeft de huidige afspeelsnelheid van de track weer. Repeat - + Herhaal When active the track will repeat if you go past the end or reverse before the start. - + Indien actief, wordt de track herhaald als u voorbij het einde gaat of wordt achteruit gespeeld vóór de start achteruit. Eject - + Uitwerpen Ejects track from the player. - + Werpt de track uit de speler. Hotcue - + Hotcue If hotcue is set, jumps to the hotcue. - + Springt naar de Hotcue als er een Hotcue is ingesteld. If hotcue is not set, sets the hotcue to the current play position. - + Stelt de hotcue in op de huidige afspeelpositie als er nog geen hotcue is ingesteld. If hotcue is set, clears the hotcue. - + Verwijdert de hotcue als er een hotcue is ingesteld. Vinyl Control Mode - + Vinyl Control Modus Absolute mode - track position equals needle position and speed. - + Absolute modus - trackpositie is gelijk aan naaldpositie en snelheid. Relative mode - track speed equals needle speed regardless of needle position. - + Relatieve modus - tracksnelheid is gelijk aan naaldsnelheid, ongeacht de naaldpositie. Constant mode - track speed equals last known-steady speed regardless of needle input. - + Constante modus - tracksnelheid is gelijk aan laatst bekende constante snelheid, ongeacht de naaldinvoer. Vinyl Status - + Vinyl Status Provides visual feedback for vinyl control status: - + Biedt visuele feedback over de vinylstatus: Green for control enabled. - + Groen als de besturing is ingeschakeld. Blinking yellow for when the needle reaches the end of the record. - + Geel knipperend wanneer de naald het einde van de plaat bereikt. Loop-In Marker - + Loop-In Markering Loop-Out Marker - + Loop-Out Markering Loop Halve - + Halve Loop Halves the current loop's length by moving the end marker. - + Halveert de lengte van de huidige loop door de eindmarkering te verplaatsen. Deck immediately loops if past the new endpoint. - + De speler zal onmiddellijk in een loop gaan als het voorbij het nieuwe eindpunt is. Loop Double - + Dubbele Loop Doubles the current loop's length by moving the end marker. - + Verdubbelt de lengte van de huidige loop door de eindmarkering te verplaatsen. Beatloop - + Beatloop Toggles the current loop on or off. - + Schakelt de huidige loop in of uit. Works only if Loop-In and Loop-Out marker are set. - + Werkt alleen als de Loop-In- en Loop-Out-markeringen zijn ingesteld. Hint: Change the default cue mode in Preferences -> Interface. - + Tip: Wijzig de standaard cue-modus in Voorkeuren -> Interface. Vinyl Cueing Mode - + Vinyl Cueing Modus Determines how cue points are treated in vinyl control Relative mode: - + Bepaalt hoe cue-punten worden behandeld in Relatieve modus met vinylbediening: Off - Cue points ignored. - + Off - Cue punten genegeerd. One Cue - If needle is dropped after the cue point, track will seek to that cue point. - + One Cue - Als de naald na het cue-punt valt, zoekt de track naar dat cue-punt. Hot Cue - Track will seek to nearest previous hot cue point. - + Hot Cue - Track zoekt naar het dichtstbijzijnde vorige hot cue punt. Track Time - + Track-tijd Track Duration - + Track-tijd Displays the duration of the loaded track. - + Geeft de duur van de geladen track weer. Information is loaded from the track's metadata tags. - + Informatie wordt geladen uit de metadata-tags van de track. Track Artist - + Track Artiest Displays the artist of the loaded track. - + Geeft de artiest van de geladen track weer. Track Title - + Track Titel Displays the title of the loaded track. - + Geeft de titel van de geladen track weer. Track Album - + Track Album Displays the album name of the loaded track. - + Toont de albumnaam van de geladen track. Track Artist/Title - + Track Artiest/Titel Displays the artist and title of the loaded track. - + Geeft de artiest en titel van de geladen track weer. TrackCollection - + Hiding tracks - + Tracks verbergen - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? - + De geselecteerde tracks staan in de volgende afspeellijsten:% 1 Door ze te verbergen, worden ze uit deze afspeellijsten verwijderd. Verdergaan? @@ -11706,47 +11806,47 @@ Export finished - + Export voltooid Exporting %1 - + %1 exporteren Overwrite Existing File? - + Bestaande file overschrijven? "%1" already exists, overwrite? - + "%1" bestaat reeds, overschrijven? &Overwrite - + &Overschrijven Over&write All - + Over&Schrijf Alles &Skip - + &Overslaan Skip &All - + Sla &Alles Over Export Error - + Fout bij exporteren @@ -11754,7 +11854,7 @@ Export Track Files To - + Exporteer trackbestanden Naar @@ -11763,22 +11863,22 @@ Export process was canceled - + Het exportproces werd geannuleerd Error removing file %1: %2. Stopping. - + Fout bij het verwijderen van bestand %1:%2. Stoppen. Error exporting track %1 to %2: %3. Stopping. - + Fout bij het exporteren van bestand %1 naar %2: %3. Stoppen. Error exporting tracks - + Fout bij exporteren van tracks @@ -11787,22 +11887,22 @@ Traktor - + Traktor (loading) Traktor - + (laden) Tractor Error Loading Traktor Library - + Fout bij het laden van de Traktor-bibliotheek There was an error loading your Traktor library. Some of your Traktor tracks or playlists may not have loaded. - + Er is een fout opgetreden bij het laden van uw Traktor-bibliotheek. Sommige van uw Traktor-tracks of afspeellijsten zijn mogelijk niet geladen. @@ -11810,27 +11910,27 @@ Timer (Fallback) - + Timer (Fallback) MESA vblank_mode = 1 - + MESA vblank_mode = 1 Wait for Video sync - + Wacht op Video synchronisatie Sync Control - + Synchronisatiebediening Free + 1 ms (for benchmark only) - + Vrij + 1 ms (enkel voor benchmark) @@ -11838,32 +11938,32 @@ Time until charged unknown. - + Tijd tot opgeladen onbekend. Time until charged: %1 - + Tijd tot opladen: %1 Time left unknown. - + Resterende tijd onbekend. Time left: %1 - + Resterende tijd: %1 Battery fully charged. - + Batterij volledig opgeladen. Battery status unknown. - + Batterij-status onbekend. @@ -11872,29 +11972,29 @@ Choose new cover change cover art location - + Kies nieuwe hoes Clear cover clears the set cover art -- does not touch files on disk - + Verwijder hoes Reload from file/folder reload cover art from file metadata or folder - + Herlaad van bestand/map Image Files - + Afbeeldingen Change Cover Art - + Wijzig hoesafbeelding @@ -11903,17 +12003,17 @@ %1: %2 %1 = effect name; %2 = effect description - + %1: %2 None - + geen No effect loaded. - + Geen effect geladen. @@ -11921,12 +12021,12 @@ None - + geen No effect chain loaded. - + Geen effectketen geladen. @@ -11934,12 +12034,12 @@ None - + geen No effect loaded. - + Geen effect geladen. @@ -11948,18 +12048,18 @@ %1: %2 %1 = effect name; %2 = effect description - + %1: %2 None Displayed when no effect is loaded - + geen No effect loaded. - + Geen effect geladen. @@ -11967,418 +12067,418 @@ &File - + &Bestand Load Track to Deck &%1 - + Laad Track in Speler %1 Loads a track in deck %1 - + Laad een track in speler %1 Open - + Openen &Exit - + &Afsluiten Quits Mixxx - + Sluit Mixxx af Ctrl+q - + Ctrl+q &Library - + &Bibliotheek &Rescan Library - + Bibliotheek &Herscannen Rescans library folders for changes to tracks. - + Bibliotheekmappen worden opnieuw gescand op wijzigingen in tracks. Create &New Playlist - + Maan &Nieuwe speellijst Create a new playlist - + Maak een nieuwe afspeellijst Ctrl+n - + Ctrl+n Create New &Crate - + Maak nieuwe &Krat Create a new crate - + Maak een nieuwe krat Ctrl+Shift+N - + Ctrl+Shift+N &View - + &Bekijk May not be supported on all skins. - + Wordt mogelijk niet op alle thema's ondersteund. Show Skin Settings Menu - + Menu thema-instellingen weergeven Show the Skin Settings Menu of the currently selected Skin - + Toon het menu thema-instellingen van de huidig geselecteerde thema Ctrl+1 Menubar|View|Show Skin Settings - + Ctrl+1 Show Microphone Section - + Toon Microfoonsectie Show the microphone section of the Mixxx interface. - + Toon het microfoonsectie van de Mixxx-interface. Ctrl+2 Menubar|View|Show Microphone Section - + Ctrl+2 Show Vinyl Control Section - + Toon sectie Vinylbediening Show the vinyl control section of the Mixxx interface. - + Toon de sectie vinylbediening van de Mixxx-interface. Ctrl+3 Menubar|View|Show Vinyl Control Section - + Ctrl+3 Show Preview Deck - + Toon voorbeluisterspeler Show the preview deck in the Mixxx interface. - + Toon de voorbeluisterspeler in de mixxx-interface. Ctrl+4 Menubar|View|Show Preview Deck - + Ctrl+4 Show Cover Art - + Toon hoesafbeeldingen Show cover art in the Mixxx interface. - + Toon hoesafbeeldingen in de Mixxx-interface. Ctrl+6 Menubar|View|Show Cover Art - + Ctrl+6 Maximize Library - + Maximaliseer bibliotheek Maximize the track library to take up all the available screen space. - + Maximaliseer de trackbibliotheek in de beschikbare schermruimte. Space Menubar|View|Maximize Library - + Ruimte &Full Screen - + &Volledig scherm Display Mixxx using the full screen - + Geef Mixxx weer in volledig scherm &Options - + &Opties &Vinyl Control - + &Vinylbediening Use timecoded vinyls on external turntables to control Mixxx - + Gebruik tijdgecodeerde vinyl op externe draaitafels om Mixxx te bedienen Enable Vinyl Control &%1 - + Activeer vinylbediening &%1 &Record Mix - + Mix &Opnemen Record your mix to a file - + Neem je mix op naar een bestand Ctrl+R - + Ctrl+R Enable Live &Broadcasting - + Schakel Live &Uitzenden in Stream your mixes to a shoutcast or icecast server - + Stream je mixen naar een Shoutcast- of Icecast-server Ctrl+L - + Ctrl+L Enable &Keyboard Shortcuts - + Schakel &Sneltoetsen in Toggles keyboard shortcuts on or off - + Schakel sneltoetsen in of uit Ctrl+` - + Ctrl+` &Preferences - + &Voorkeuren Change Mixxx settings (e.g. playback, MIDI, controls) - + Mixxx-instellingen wijzigen (bijv. Afspelen, MIDI, bedieningselementen) &Developer - + &Ontwikkelaar &Reload Skin - + &Herlaad skin Reload the skin - + Herlaad de skin Ctrl+Shift+R - + Ctrl+Shift+R Developer &Tools - + Developer &Tools Opens the developer tools dialog - + Opent het dialoogvenster hulpprogramma's voor ontwikkelaars Ctrl+Shift+T - + Ctrl+Shift+T Stats: &Experiment Bucket - + Statistieken: &Experiment Bucket Enables experiment mode. Collects stats in the EXPERIMENT tracking bucket. - + Schakel experiment-modus in. Verzamelt statistieken in de EXPERIMENT-tracking bucket. Ctrl+Shift+E - + Ctrl+Shift+E Stats: &Base Bucket - + Statistieken: &Base Bucket Enables base mode. Collects stats in the BASE tracking bucket. - + Schakel base modus in. Verz Ctrl+Shift+B - + Ctrl+Shift+B Deb&ugger Enabled - + Deb&ugger ingeschakeld Enables the debugger during skin parsing - + Activeert de debugger tijdens het ontleden van het thema Ctrl+Shift+D - + Ctrl+Shift+D &Help - + &Help &Community Support - + &Community Support Get help with Mixxx - + Zoek hulp bij Mixxx &User Manual - + &Handleiding Read the Mixxx user manual. - + Lees de Mixxx gebruikershandleiding &Keyboard Shortcuts - + &Sneltoetsen Speed up your workflow with keyboard shortcuts. - + Versnel je werktempo met sneltoetsen. Send Us &Feedback - + Stuur ons &Feedback Send feedback to the Mixxx team. - + Feedback sturen naar het Mixxx team. &Translate This Application - + &Vertaal deze Applicatie Help translate this application into your language. - + Help ons de applicatie te vertalen naar uw taal. &About - + &Over About the application - + Over de applicatie @@ -12387,20 +12487,20 @@ Ready to play, analyzing .. Text on waveform overview when file is playable but no waveform is visible - + Gereed om af te spelen, analyzeren .. Loading track .. Text on waveform overview when file is cached from source - + Track wordt geladen .. Finalizing .. Text on waveform overview during finalizing of waveform analysis - + Finaliseren .. @@ -12410,62 +12510,62 @@ Clear input Clear the search bar input field - + Invoer wissen Ctrl+F Search|Focus - + Ctrl+F Search... noun - + Zoeken... Search noun - + Zoeken Enter a string to search for - + Voer een tekenreeks in om naar te zoeken Shortcut - + Snelkoppeling Ctrl+F - + Ctrl+F Focus Give search bar input focus - + Focus Ctrl+Backspace - + Ctrl+Backspace Esc - + Esc Exit search Exit search bar and leave focus - + Zoeken afsluiten @@ -12473,13 +12573,13 @@ Add to Playlist - + Voeg toe aan Speellijst Reset Reset metadata in right click track context menu in library - + Resetten @@ -12490,88 +12590,88 @@ ESC Focus - + ESC - + Remove Verwijderen - + Remove from Playlist - + Verwijderen uit Speellijst - + Remove from Crate - + Verwijder uit krat - + Hide from Library - + Verbergen voor Bibliotheek - + Unhide from Library - + Zichtbaar maken voor bibliotheek - + Purge from Library - + Wissen uit Bibliotheek - + Properties - + Eigenschappen - + Open in File Browser - + Open bestand in Browser - + 4/3 BPM - + 4/3 BPM - + 3/2 BPM - + 3/2 BPM - - + + Create New Playlist Nieuwe Afspeellijst aanmaken - + Create New Crate - + Maak nieuwe krat - + Enter name for new playlist: Voer naam in voor nieuwe afspeellijst: Load to - + Laad naar Deck - + Deck Sampler - + Sampler @@ -12581,147 +12681,147 @@ Change BPM - + BPM wijzigen - + Add to Auto DJ Queue (Bottom) - + Voeg toe aan Auto DJ wachtrij (Einde) - + Add to Auto DJ Queue (Top) - + Voeg toe aan Auto DJ wachtrij (Begin) - + Add to Auto DJ Queue (Replace) - + Voeg toe aan Auto DJ wachtrij (Vervang) - + Import From File Tags - + Importeer van bestandslabels - + Import From MusicBrainz - + Importeer van MusicBrainz - + Export To File Tags - + Exporteer naar bestandslabels - + Preview Deck - + Preview Deck - + BPM and Beatgrid - + BPM en Beat-raster - + Play Count - + Play Count - + Cue Point - + Cue Punt - + Hotcues - + Hotcues - + Loop - + Loop - + ReplayGain ReplayGain - + Waveform - + Waveform - + All - + Alle - + Deck %1 Deck %1 - + New Playlist Nieuwe Afspeellijst - - - + + + Playlist Creation Failed Aanmaak van afspeellijst mislukt - + A playlist by that name already exists. Een afspeellijst met deze naam bestaan reeds. - + A playlist cannot have a blank name. Een Afspeellijst kan geen blanco naam bevatten. - + An unknown error occurred while creating playlist: Er is een onbekende fout opgetreden tijdens het maken van de afspeellijst: - + Lock BPM - + Vergrendel BPM - + Unlock BPM - + Ontgrendel BPM - + Double BPM - + Dubbele BPM - + Halve BPM - + Halve BPM - + 2/3 BPM - + 2/3 BPM - + 3/4 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 @@ -12731,7 +12831,7 @@ Show or hide columns. - + Toon of verberg kolommen. @@ -12739,22 +12839,22 @@ (GLSL) - + (GLSL) (GL) - + (GL) (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) @@ -12762,12 +12862,12 @@ Export Modified Track Metadata - + Gewijzigde track metagegevens exporteren Mixxx may wait to modify files until they are not loaded to any decks or samplers. If you do not see changed metadata in other programs immediately, eject the track from all decks and samplers or shutdown Mixxx. - + Mixxx kan wachten met het wijzigen van bestanden zolang ze niet in decks of samplers zijn geladen. Als je niet meteen gewijzigde metadata in andere programma's ziet, verwijder dan de track uit alle spelers en samplers of schakel Mixxx uit. \ No newline at end of file Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_nl-NL.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_nl-NL.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_nl-NL.ts mixxx-2.2.4~dfsg/res/translations/mixxx_nl-NL.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_nl-NL.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_nl-NL.ts 2020-05-15 21:26:10.000000000 +0000 @@ -26,17 +26,17 @@ Remove Crate as Track Source - + Verwijder Krat als Muziekbron Auto DJ - + Auto DJ - + Add Crate as Track Source - + Voeg Krat toe als Muziekbron @@ -73,12 +73,12 @@ Add to Auto DJ Queue (bottom) - + Voeg toe aan Auto DJ Wachtrij (onderaan) Add to Auto DJ Queue (top) - + Voeg toe aan Auto DJ Wachtrij (boven) @@ -99,25 +99,25 @@ BasePlaylistFeature - + New Playlist Nieuwe afspeellijst Add to Auto DJ Queue (bottom) - + Voeg toe aan Auto DJ Wachtrij (onderaan) - + Create New Playlist Creëer nieuwe afspeellijst Add to Auto DJ Queue (top) - + Voeg toe aan Auto DJ Wachtrij (boven) @@ -148,7 +148,7 @@ Export Track Files - + Exporteer Track Bestanden @@ -156,84 +156,84 @@ Analyseer hele afspeellijst - + Enter new name for playlist: Geef nieuwe naam voor afspeellijst: - + Duplicate Playlist Dupliceer afspeellijst - - + + Enter name for new playlist: Geef naam voor nieuwe afspeellijst: - + Export Playlist Exporteer afspeellijst - + Rename Playlist Hernoem afspeellijst - - + + Renaming Playlist Failed Hernoemen Afspeellijst Mislukt - - - + + + A playlist by that name already exists. Een afspeellijst met die naam bestaat al. - - - + + + A playlist cannot have a blank name. Een afspeellijst kan geen blanco naam hebben. - + _copy [noun] Appendix to default name when duplicating a playlist - + _kopie - - - - - - + + + + + + Playlist Creation Failed Aanmaken Afspeellijst Mislukt - - + + An unknown error occurred while creating playlist: Een onbekende fout trad op bij het creëren van afspeellijst: - + M3U Playlist (*.m3u) - + M3U Afspeellijst (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U Afspeellijst (*.m3u);;M3U8 Afspellijst (*.m3u8);;PLS Playlist (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) @@ -306,7 +306,7 @@ Rating - + Waardering @@ -316,12 +316,12 @@ BPM - + BPM Track # - + Track # @@ -331,12 +331,12 @@ # - + # Timestamp - + Tijdstempel @@ -346,30 +346,30 @@ BPM Lock - + BPM Vergrendeling Preview - + Voorvertoning Cover Art - + Albumhoes ReplayGain - + HerspeelVolume BaseTrackPlayerImpl - + Couldn't load track. - + Kan track niet laden. @@ -382,7 +382,7 @@ Please enable at least one connection to use Live Broadcasting. - + Zet minstens één connectie aan om Live Uitzenden te gebruiken. @@ -400,12 +400,12 @@ Settings error - + Fout in Instellingen <b>Error with settings for '%1':</b><br> - + <b>Fout met instellingen voor '%1':</b><br> @@ -428,7 +428,7 @@ Disconnected - + Verbinding verbroken @@ -456,12 +456,12 @@ Add to Quick Links - + Voeg toe aan Snelkoppelingen Remove from Quick Links - + Verwijder uit Snelkoppelingen @@ -471,18 +471,18 @@ Quick Links - + Snelkoppelingen Devices - + Apparaten Removable Devices - + Verwisselbare Apparaten @@ -498,7 +498,7 @@ You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Je hebt één of meerdere muziekmappen toegevoegd. De tracks in deze mappen zullen niet beschikbaar zijn totdat je de bibliotheek opnieuw scant. Wil je de bibliotheek nu scannen? @@ -508,7 +508,7 @@ "Computer" lets you navigate, view, and load tracks from folders on your hard disk and external devices. - + "Computer" laat je tracks bekijken en laden vanuit mappen op je harde schijf en externe apparaten. @@ -516,7 +516,7 @@ Preview - + Voorvertoning @@ -541,7 +541,7 @@ Track # - + Track # @@ -571,7 +571,7 @@ BPM - + BPM @@ -591,7 +591,7 @@ ReplayGain - + HerspeelVolume @@ -626,7 +626,7 @@ Could not load the following file because it is in use by Mixxx or another application. - + Kan het volgende bestand niet laden, omdat het in gebruik is door Mixxx of een andere applicatie. @@ -634,7 +634,7 @@ USB Controller - + USB Controller @@ -642,7 +642,7 @@ No control chosen. - + Geen bediening gekozen. @@ -660,7 +660,7 @@ Item - + Ding @@ -688,29 +688,29 @@ Master Output - + Master Output Headphone Output - + Hoofdtelefoon Uitvoer Deck %1 - + Deck %1 Sampler %1 - + Sampler %1 Preview Deck %1 - + Voorvertoning Deck %1 @@ -720,57 +720,57 @@ Auxiliary %1 - + Hulpmiddel %1 Reset to default - + Reset naar standaard Effect Rack %1 - + Effecten Rack %1 Parameter %1 - + Parameter %1 Mixer - + Mixer Crossfader - + Crossfader Master balance - + Master balans Master delay - + Master vertraging Headphone mix (pre/main) - + Hoofdtelefoon mix (pre/main) Toggle headphone split cueing - + Schakel hoofdtelefoon split cueën Headphone delay - + Hoofdtelefoon vertraging @@ -780,7 +780,7 @@ Strip-search through track - + Strip-zoek door track @@ -807,284 +807,284 @@ Jump to start of track and play - + Spring naar begin van track en speel af Jump to end of track - + Spring naar einde van track Reverse roll (Censor) button - + Rol achterwaarts (Censor) knop Headphone listen button - + Hoofdtelefoon luister knop Mute button - + Demp knop Toggle repeat mode - + Schakel herhaal modus Eject track - + Werp track uit Mix orientation (e.g. left, right, center) - + Mix oriëntatie (bijv. links, rechts, midden) Set mix orientation to left - + Zet mix richting naar links Set mix orientation to center - + Zet mix richting naar midden Set mix orientation to right - + Zet mix richting naar rechts Toggle slip mode - + Schakel slip modus BPM - + BPM Increase BPM by 1 - + Verhoog BPM met 1 Decrease BPM by 1 - + Verlaag BPM met 1 Increase BPM by 0.1 - + Verhoog BPM met 0,1 Decrease BPM by 0.1 - + Verlaag BPM met 0,1 BPM tap button - + BPM tik knop Toggle quantize mode - + Schakel kwantiseer modus Increase internal master BPM by 1 - + Verhoog interne master BPM met 1 Decrease internal master BPM by 1 - + Verlaag interne master BPM met 1 Increase internal master BPM by 0.1 - + Verhoog interne master BPM met 0,1 Decrease internal master BPM by 0.1 - + Verlaag interne master BPM met 0,1 Toggle sync master - + Schakel sync master Sync mode 3-state toggle (OFF, FOLLOWER, MASTER) - + Sync modus 3-staats schakelaar (OFF, FOLLOWER, MASTER) One-time beat sync (tempo only) - + Eenmalige beat sync (alleen tempo) One-time beat sync (phase only) - + Eenmalige beat sync (alleen fase) Toggle keylock mode - + Schakel toonvergrendeling modus Equalizers - + Equalizers Vinyl Control - + Vinyl Besturing Toggle vinyl-control cueing mode (OFF/ONE/HOT) - + Schakel vinylbestuuring cue modus (OFF/ONE/HOT) Toggle vinyl-control mode (ABS/REL/CONST) - + Schakel vinylbesturing cue modus (ABS/REL/CONST) Pass through external audio into the internal mixer - + Laat externe audio door naar de interne mixer Cues - + Cues Cue button - + Cue knop Set cue point - + Zet cuepoint Go to cue point - + Ga naar cuepoint Go to cue point and play - + Ga naar cuepoint en speel af Go to cue point and stop - + Ga naar cuepoint en stop Preview from cue point - + Voorvertoning vanaf cuepoint Cue button (CDJ mode) - + Cue knop (CDJ modus) Stutter cue - + Stotter cue Hotcues - + Hotcues Set, preview from or jump to hotcue %1 - + Zet, voorvertoon vanaf of spring naar hotcue %1 Clear hotcue %1 - + Wis hotcue %1 Set hotcue %1 - + Zet hotcue %1 Jump to hotcue %1 - + Spring naar hotcue %1 Jump to hotcue %1 and stop - + Spring naar hotcue %1 en stop Jump to hotcue %1 and play - + Spring naar hotcue %1 en speel af Preview from hotcue %1 - + Voorvertoon vanaf hotcue %1 Hotcue %1 - + Hotcue %1 Looping - + Loop'en Loop In button - + Loop In knop Loop Out button - + Loop Out knop Loop Exit button - + Loop Exit knop @@ -1129,27 +1129,27 @@ Move loop forward by %1 beats - + Verplaats loop %1 beats vooruit Move loop backward by %1 beats - + Verplaats loop %1 beats achteruit Beat-Looping - + Beat-Loop'en Create %1-beat loop - + Maak %1-beat loop Create temporary %1-beat loop roll - + Maak tijdelijke %1-beat loop roll @@ -1160,42 +1160,42 @@ Unit %1 - + Eenheid %1 Slot %1 - + Spoor %1 Master crossfader - + Master crossfader Master Balance - + Master Balans Master Delay - + Master Vertraging Headphone Mix - + Hoofdtelefoon Mix Headphone Split Cue - + Hoofdtelefoon Split Cue Headphone Delay - + Hoofdtelefoon Vertraging @@ -1225,7 +1225,7 @@ Strip Search - + Strip Search @@ -1240,7 +1240,7 @@ Reverse Roll (Censor) - + Omgekeerde Roll (Censor) @@ -1250,7 +1250,7 @@ Jumps to start of track - + Spring naar begin van track @@ -1270,7 +1270,7 @@ Stop playback and jump to start of track - + Stop afsprelen en spring naar begin van track @@ -1287,7 +1287,7 @@ Volume Fader - + Volume Fader @@ -1299,23 +1299,23 @@ Zero Volume - + Nul Volume Track Gain - + Track Versterking Track Gain knob - + Track Versterking knop Mute - + Dempen @@ -1326,22 +1326,22 @@ Headphone Listen - + Hoofdtelefoon Luisteren Headphone listen (pfl) button - + Hoofdtelefoon luisteren (pfl) knop Repeat Mode - + Herhaal Modus Slip Mode - + Slip Modus @@ -1353,109 +1353,109 @@ Orient Left - + Richting Links Orient Center - + Richting Rechts Orient Right - + Richting Rechts BPM +1 - + BPM +1 BPM -1 - + BPM -1 BPM +0.1 - + BPM +0,1 BPM -0.1 - + BPM -0,1 BPM Tap - + BPM Tikken Adjust Beatgrid Faster +.01 - + Versnel Beatgrid +0,01 Increase track's average BPM by 0.01 - + Versnel track's gemiddelde BPM met 0,01 Adjust Beatgrid Slower -.01 - + Vertraag Beatgrid -,01 Decrease track's average BPM by 0.01 - + Vertraag track's gemiddelde BPM met 0,01 Move Beatgrid Earlier - + Verplaats Beatgrid naar Voren Adjust the beatgrid to the left - + Stel de beatgrid bij naar links Move Beatgrid Later - + Verplaats Beatgrid naar Achteren Adjust the beatgrid to the right - + Stel de beatgrid bij naar rechts Adjust Beatgrid - + Stel Beatgrid bij Align beatgrid to current position - + Lijn beatgrid uit met huidige positie Adjust Beatgrid - Match Alignment - + Stel Beatgrid bij - Huidige Uitlijning Adjust beatgrid to match another playing deck. - + Stel de beatgrid bij met een ander spelend deck. Quantize Mode - + Kwantiseer Modus @@ -1466,88 +1466,88 @@ Sync Mode - + Sync Modus Internal Sync Master - + Interne Sync Master Toggle Internal Sync Master - + Schakel Interne Sync Master Internal Master BPM - + Interne Master BPM Internal Master BPM +1 - + Interne Master BPM +1 Internal Master BPM -1 - + Interne Master BPM -1 Internal Master BPM +0.1 - + Interne Master BPM +0,1 Internal Master BPM -0.1 - + Interne Master BPM -0,1 Sync Master - + Sync Master Beat Sync One-Shot - + Beat Sync One-Shot Sync Tempo One-Shot - + Sync Tempo One-Shot Sync Phase One-Shot - + Sync Fase One-Shot Speed (Pitch/Tempo) - + Snelheid (Toonhoogte/Tempo) Keylock Mode - + Toonvergrendelings Modus Pitch control (does not affect tempo), center is original pitch - + Toonhoogte besturing (heeft geen invloed op tempo), midden is de originele toonhoogte Pitch Adjust - + Toonhoogte Bijstellen Adjust pitch from speed slider pitch - + Stel toonhoogte bij van snelheidsslider toonhoogte @@ -1767,7 +1767,7 @@ Add to Auto DJ Queue (bottom) - + Voeg toe aan Auto DJ Wachtrij (onderaan) @@ -1777,7 +1777,7 @@ Add to Auto DJ Queue (top) - + Voeg toe aan Auto DJ Wachtrij (boven) @@ -2526,7 +2526,7 @@ Auto DJ - + Auto DJ @@ -2768,14 +2768,14 @@ - + Lock Zet vast Export Track Files - + Exporteer Track Bestanden @@ -2793,7 +2793,7 @@ - + Enter new name for crate: Geef nieuwe naam voor krat @@ -2811,40 +2811,40 @@ - + Export Crate Exporteer krat - + Unlock Onsluit - + An unknown error occurred while creating crate: Een onbekende fout heeft plaatsgevonden bij het aanmaken van de krat: - + Rename Crate Hernoem krat - - + + Renaming Crate Failed Hernoemen krat mislukt - + Crate Creation Failed Aanmaken krat mislukt - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) - + M3U Afspeellijst (*.m3u);;M3U8 Afspellijst (*.m3u8);;PLS Playlist (*.pls);;Tekst CSV (*.csv);;Leesbare Tekst (*.txt) @@ -2862,12 +2862,12 @@ Met kratten kun je je muziek organiseren zoals je wilt! - + A crate cannot have a blank name. Een krat kan geen blanco naam hebben. - + A crate by that name already exists. Een krat met die naam bestaat al. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Geef naam voor nieuwe krat: - - + + Creating Crate Failed Aanmaken krat mislukt - + A crate cannot have a blank name. Een krat kan geen blanco naam hebben. - - + + A crate by that name already exists. Een krat met die naam bestaat al. - - + + An unknown error occurred while creating crate: Een onbekende fout heeft plaatsgevonden bij het aanmaken van de krat: - + copy [noun] kopieer - + Duplicate Crate Dupliceer krat - - - + + + Duplicating Crate Failed Dupliceren krat mislukt @@ -3073,7 +3073,7 @@ Auto DJ - + Auto DJ @@ -5140,7 +5140,7 @@ You added one or more music directories. The tracks in these directories won't be available until you rescan your library. Would you like to rescan now? - + Je hebt één of meerdere muziekmappen toegevoegd. De tracks in deze mappen zullen niet beschikbaar zijn totdat je de bibliotheek opnieuw scant. Wil je de bibliotheek nu scannen? @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None Geen - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock Geluidskaart Klok - + Network Clock Netwerk Klok - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Uitgeschakeld - + Enabled Ingeschakeld - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -5953,7 +5953,7 @@ Headphone Delay - + Hoofdtelefoon Vertraging @@ -5992,7 +5992,7 @@ Master Delay - + Master Vertraging @@ -6437,12 +6437,12 @@ Auto DJ - + Auto DJ Equalizers - + Equalizers @@ -6452,7 +6452,7 @@ Crossfader - + Crossfader @@ -6488,7 +6488,7 @@ Vinyl Control - + Vinyl Besturing @@ -6730,7 +6730,7 @@ BPM - + BPM @@ -6760,7 +6760,7 @@ Track # - + Track # @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist Importeer afspeellijst - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists Afspeellijsten @@ -7786,27 +7799,27 @@ Onsluit - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Creëer nieuwe afspeellijst @@ -8027,7 +8040,7 @@ Vinyl Control - + Vinyl Besturing @@ -8369,7 +8382,7 @@ BPM - + BPM @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ Zet vast - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -9789,7 +9802,7 @@ Crossfader - + Crossfader @@ -9829,12 +9842,12 @@ Headphone Mix - + Hoofdtelefoon Mix Headphone Split Cue - + Hoofdtelefoon Split Cue @@ -9869,7 +9882,7 @@ Vinyl Control - + Vinyl Besturing @@ -9890,7 +9903,7 @@ Cover Art - + Albumhoes @@ -10155,7 +10168,7 @@ BPM Tap - + BPM Tikken @@ -10819,7 +10832,7 @@ Adjust Beatgrid - + Stel Beatgrid bij @@ -10830,7 +10843,7 @@ Adjust beatgrid to match another playing deck. - + Stel de beatgrid bij met een ander spelend deck. @@ -11136,7 +11149,7 @@ Mute - + Dempen @@ -11228,7 +11241,7 @@ Pitch Adjust - + Toonhoogte Bijstellen @@ -11293,7 +11306,7 @@ Slip Mode - + Slip Modus @@ -11691,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12484,7 +12497,7 @@ Cover Art - + Albumhoes @@ -12493,68 +12506,68 @@ ESC - + Remove Verwijder - + Remove from Playlist Verwijder uit afspeellijst - + Remove from Crate Verwijder uit krat - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties Eigenschappen - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Creëer nieuwe afspeellijst - + Create New Crate Maak nieuwe krat - + Enter name for new playlist: Geef naam voor nieuwe afspeellijst: @@ -12584,146 +12597,146 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz Importeer van MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Hotcues - + Loop - + ReplayGain - + HerspeelVolume - + Waveform - + All Alles - + Deck %1 - + Deck %1 - + New Playlist Nieuwe afspeellijst - - - + + + Playlist Creation Failed Aanmaken Afspeellijst Mislukt - + A playlist by that name already exists. Een afspeellijst met die naam bestaat al. - + A playlist cannot have a blank name. Een afspeellijst kan geen blanco naam hebben. - + An unknown error occurred while creating playlist: Een onbekende fout trad op bij het creëren van afspeellijst: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_nl.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_nl.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_nl.ts mixxx-2.2.4~dfsg/res/translations/mixxx_nl.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_nl.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_nl.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ AutoDJ - + Add Crate as Track Source Voeg krat toe als bron @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nieuwe afspeellijst @@ -110,7 +110,7 @@ - + Create New Playlist Maak nieuwe afspeellijst @@ -156,82 +156,82 @@ Analyseer volledige afspeellijst - + Enter new name for playlist: Voer nieuwe naam in voor afspeellijst: - + Duplicate Playlist Dupliceer afspeellijst - - + + Enter name for new playlist: Voer naam in voor nieuwe afspeellijst: - + Export Playlist Exporteer afspeellijst - + Rename Playlist Hernoem afspeellijst - - + + Renaming Playlist Failed Hernoemen afspeellijst mislukt - - - + + + A playlist by that name already exists. Een afspeellijst met die naam bestaat al. - - - + + + A playlist cannot have a blank name. Een afspeellijst moet een naam hebben - + _copy [noun] Appendix to default name when duplicating a playlist _kopieer - - - - - - + + + + + + Playlist Creation Failed Aanmaken afspeellijst mislukt - - + + An unknown error occurred while creating playlist: Er is een onbekende fout opgetreden bij het aanmaken van de afspeellijst: - + M3U Playlist (*.m3u) M3U Afspeellijst (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Afspeellijst (*.m3u);;M3U8 Afspeellijst (*.m3u8);;PLS Afspeellijst (*.pls);; CSV-tekst (*.csv);;Leesbare tekst (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kon track niet laden. @@ -428,17 +428,17 @@ Disconnected - + Niet Verbonden Connecting... - + Verbinden... Connected - + Verbonden @@ -2768,7 +2768,7 @@ - + Lock Vergrendel @@ -2793,7 +2793,7 @@ AutoDJ-trackbron - + Enter new name for crate: Geef nieuwe naam voor krat: @@ -2811,38 +2811,38 @@ - + Export Crate Exporteer krat - + Unlock Ontgrendel - + An unknown error occurred while creating crate: Er is een onbekende fout opgetreden bij het aanmaken van de krat: - + Rename Crate Hernoem krat - - + + Renaming Crate Failed Hernoemen van de krat is mislukt - + Crate Creation Failed Krat aanmaken mislukt - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Afspeellijst (*.m3u);;M3U8 Afspeellijst (*.m3u8);;PLS Afspeellijst (*.pls);; CSV-tekst (*.csv);;Leesbare tekst (*.txt) @@ -2862,12 +2862,12 @@ Met kratten kun je je muziek organiseren zoals jij het wil! - + A crate cannot have a blank name. Een krat kan geen lege naam hebben. - + A crate by that name already exists. Er bestaat al een krat met deze naam. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Geef naam voor nieuwe krat: - - + + Creating Crate Failed Krat aanmaken mislukt - + A crate cannot have a blank name. Een krat kan geen lege naam hebben. - - + + A crate by that name already exists. Er bestaat al een krat met deze naam. - - + + An unknown error occurred while creating crate: Er is een onbekende fout opgetreden bij het aanmaken van de krat: - + copy [noun] Kopieer - + Duplicate Crate Dupliceer krat - - - + + + Duplicating Crate Failed Krat dupliceren mislukt @@ -2972,7 +2972,7 @@ Credits - + Verdiensten @@ -5612,7 +5612,7 @@ DlgPrefRecord - + Choose recordings directory Kies opnamenmap @@ -5829,113 +5829,113 @@ DlgPrefSound - + None Geen - + %1 Hz %1 Hz - + Default (long delay) Standaard (lange vertraging) - + Experimental (no delay) Experimenteel (geen vertraging) - + Disabled (short delay) Uitgeschakeld (korte vertraging) - + Soundcard Clock Geluidskaart Klok - + Network Clock Netwerk Klok - + Master output only Hoofduitgang alleen - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Uitgeschakeld - + Enabled Ingeschakeld - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. Ga naar de Mixxx Gebruikers Handleiding voor details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. Real-Time plannen is actief. - + %1 ms %1 ms - + Configuration error Configuratiefout @@ -7408,15 +7408,28 @@ LibraryFeature - + Import Playlist Importeer afspeellijst - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Afspeellijstbestanden (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7709,39 +7722,39 @@ Het geselecteerde thema kan niet geladen worden. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Bevestig afsluiten - + A deck is currently playing. Exit Mixxx? Er is momenteel een speler actief. Mixxx Afsluiten? - + A sampler is currently playing. Exit Mixxx? Er speelt momenteel een sampler. Mixxx toch afsluiten? - + The preferences window is still open. Het venster "Voorkeuren" staat nog open. - + Discard any changes and exit Mixxx? Alle wijzigingen annuleren en Mixxx afsluiten? @@ -7820,7 +7833,7 @@ - + Playlists Afspeellijsten @@ -7830,27 +7843,27 @@ Ontgrendel - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Afspeellijsten zijn gesorteerde lijsten van tracks die je toelaten om je DJ-sets te plannen. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Sommige DJ's stellen afspeellijsten samen vóór hun optreden, anderen verkiezen om ze in de vlucht op te bouwen. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Wanneer je een afspeellijst gebruikt tijdens een live DJ-set, vergeet dan niet om altijd aandacht te schenken aan hoe je publiek reageert op de muziek die je hebt gekozen om te spelen. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Het kan nodig zijn om sommige tracks over te slaan in je voorbereide afspeellijst of om tracks toe te voegen teneinde de energie van je publiek te behouden. - + Create New Playlist Maak nieuwe afspeellijst @@ -8339,7 +8352,7 @@ Manual - + Handleiding @@ -9322,7 +9335,7 @@ - + History Geschiedenis @@ -9337,22 +9350,22 @@ Vergrendel - + The history section automatically keeps a list of tracks you play in your DJ sets. De historieksectie houdt automatisch een lijst bij met tracks die je in je DJ-sets speelt. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Dit is handig om te onthouden wat werkte in je DJ-sets, om te publiceren als set-lijst of om te rapporteren aan auteursrechtenorganisaties. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Telkens wanneer je Mixxx start, wordt een nieuwe historieksectie gemaakt. Je kunt die exporteren als een afspeellijst in verscheidene formaten of weer spelen met AutoDJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Je kunt de huidige historieksessie samenvoegen met een vorige door rechts te klikken en te kiezen voor "Samenvoegen met vorige". @@ -9542,23 +9555,23 @@ SoundManager - - + + a device een apparaat - + An unknown error occurred Er is een onbekende fout opgetreden - + Two outputs cannot share channels on "%1" Twee uitgangen kunnen geen kanalen delen op "%1" - + Error opening "%1" Fout bij openen "%1" @@ -11742,12 +11755,12 @@ TrackCollection - + Hiding tracks Verbergen tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12544,68 +12557,68 @@ ESC - + Remove Verwijder - + Remove from Playlist Verwijder uit Afspeellijst - + Remove from Crate Verwijder uit Krat - + Hide from Library Verberg in de bibliotheek - + Unhide from Library Toon opnieuw in de bibliotheek - + Purge from Library Ruim op uit bibliotheek - + Properties Eigenschappen - + Open in File Browser Open in verkenner - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Maak nieuwe afspeellijst - + Create New Crate Maak een nieuwe krat aan - + Enter name for new playlist: Voer naam in voor nieuwe afspeellijst: @@ -12635,144 +12648,144 @@ Wijzig BPM - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz Importeer Van MusicBrainz - + Export To File Tags - + Preview Deck Voorbeeldspeler - + BPM and Beatgrid BPM en Beatgrid - + Play Count Afspeel Teller - + Cue Point Cue Punt - + Hotcues Hotcues - + Loop - + ReplayGain Afspeelversterking - + Waveform - + All Alles - + Deck %1 Speler %1 - + New Playlist Nieuwe afspeellijst - - - + + + Playlist Creation Failed Aanmaken afspeellijst mislukt - + A playlist by that name already exists. Een afspeellijst met die naam bestaat al. - + A playlist cannot have a blank name. Een afspeellijst moet een naam hebben - + An unknown error occurred while creating playlist: Er is een onbekende fout opgetreden bij het aanmaken van de afspeellijst: - + Lock BPM Vergrendel BPM - + Unlock BPM Ontgrendel BPM - + Double BPM Verdubbel BPM - + Halve BPM Halveer BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_nn.ts mixxx-2.2.4~dfsg/res/translations/mixxx_nn.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_nn.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_nn.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Automatisk DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kunne ikkje åpna sangen @@ -2766,7 +2766,7 @@ - + Lock Lås @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock Lås opp - + An unknown error occurred while creating crate: Ein ukjend feil hende under laginga av kasse: - + Rename Crate Endra namn på Kasse - - + + Renaming Crate Failed Endringa av kasse namnet feila - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Ein kasse kan ikkje ha eit blankt namn. - + A crate by that name already exists. Ein kasse med det namnet finnst allereie @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Laginga av kassen feila - + A crate cannot have a blank name. Ein kasse kan ikkje ha eit blankt namn. - - + + A crate by that name already exists. Ein kasse med det namnet finnst allereie - - + + An unknown error occurred while creating crate: Ein ukjend feil hende under laginga av kasse: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importer Speleliste - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Lås opp - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Lås - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Fjern - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_oc.ts mixxx-2.2.4~dfsg/res/translations/mixxx_oc.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_oc.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_oc.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Impossible de cargar la pista. @@ -2766,7 +2766,7 @@ - + Lock Varrolhar @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Exportar un contenidor - + Unlock Desvarrolhar - + An unknown error occurred while creating crate: Una error desconeguda s'es producha al moment de la creacion del contenidor : - + Rename Crate Tornar nomenar lo contenidor - - + + Renaming Crate Failed Fracàs al moment del cambiament de nom del contenidor - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Un contenidor deu aver un nom. - + A crate by that name already exists. Un nauc amb aqueste nom existís ja. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed La creacion del nauc a fracassat - + A crate cannot have a blank name. Un contenidor deu aver un nom. - - + + A crate by that name already exists. Un nauc amb aqueste nom existís ja. - - + + An unknown error occurred while creating crate: Una error desconeguda s'es producha al moment de la creacion del contenidor : - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Pas cap - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Activat - + Stereo Esterèo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Error de configuracion @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importar una lista de lectura - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Desvarrolhar - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Varrolhar - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred Una error desconeguda s'es producha - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Suprimir - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_pl.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_pl.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_pl.ts mixxx-2.2.4~dfsg/res/translations/mixxx_pl.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_pl.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_pl.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Dodaj Skrzynkę jako źródło utworów @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nowa Lista Odtwarzania @@ -110,7 +110,7 @@ - + Create New Playlist Utwórz nową listę odtwarzania @@ -156,82 +156,82 @@ Analizuj całą listę odtwarzania - + Enter new name for playlist: Podaj nową nazwę listy odtwarzania: - + Duplicate Playlist Duplikuj listę odtwarzania - - + + Enter name for new playlist: Podaj nazwę dla nowej listy odtwarzania: - + Export Playlist Eksportuj listę odtwarzania - + Rename Playlist Zmień nazwę listy odtwarzania - - + + Renaming Playlist Failed Zmiana nazwy listy odtwarzania nie powiodła się - - - + + + A playlist by that name already exists. Lista odtwarzania o tej nazwie już istnieje. - - - + + + A playlist cannot have a blank name. Lista odtwarzania nie może mieć pustej nazwy. - + _copy [noun] Appendix to default name when duplicating a playlist _kopiuj - - - - - - + + + + + + Playlist Creation Failed Tworzenie listy odtwarzania nie powiodło się - - + + An unknown error occurred while creating playlist: Wystąpił nieznany błąd podczas tworzenia listy odtwarzania: - + M3U Playlist (*.m3u) Lista odtwarzania M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista odtwarzania M3U (*.m3u);;Lista odtwarzania M3U8 (*.m3u8);;Lista odtwarzania PLS (*.pls);;Tekst CSV (*.csv);;Odczytywalny Tekst (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nie mogę załadować ścieżki. @@ -377,7 +377,7 @@ Action failed - + Akcja zakończona niepowodzeniem @@ -390,12 +390,12 @@ Can't use secure password storage: keychain access failed. - + Nie można użyć bezpiecznej bazy haseł: dostęp do pęku kluczy nie powiódł się. Secure password retrieval unsuccessful: keychain access failed. - + Nie udało się otrzymać hasła: dostęp do pęku kluczy nie powiódł się. @@ -405,7 +405,7 @@ <b>Error with settings for '%1':</b><br> - + <b>Błąd ustawień dla '%1':</b><br> @@ -765,7 +765,7 @@ Toggle headphone split cueing - + Przełącz dzielenie Cue na słuchawki @@ -817,7 +817,7 @@ Reverse roll (Censor) button - + Przycisk reverse roll (cenzuruj) @@ -933,17 +933,17 @@ Sync mode 3-state toggle (OFF, FOLLOWER, MASTER) - + Przełącznik 3-stanowy trybu sync (WYŁĄCZONY, REPLIKA, GŁÓWNY) One-time beat sync (tempo only) - + Jednorazowa synchronizacja rytmu (tylko tempo) One-time beat sync (phase only) - + Jednorazowa synchronizacja rytmu (tylko faza) @@ -973,7 +973,7 @@ Pass through external audio into the internal mixer - + Przepuść zewnętrzne audio do wewnętrznego miksera @@ -1008,7 +1008,7 @@ Preview from cue point - + Podejrzyj od Cue @@ -1018,7 +1018,7 @@ Stutter cue - + Stutter cue @@ -1028,7 +1028,7 @@ Set, preview from or jump to hotcue %1 - + Ustaw, przejrzyj od lub przejdź do hotcue %1 @@ -1058,7 +1058,7 @@ Preview from hotcue %1 - + Przejrzyj od hotcue %1 @@ -2395,7 +2395,7 @@ Add to Auto DJ Queue (replace) - + Dodaj do kolejki Auto DJ (zamień) @@ -2768,7 +2768,7 @@ - + Lock Zablokuj @@ -2793,7 +2793,7 @@ Źródło utworów Auto DJ'a - + Enter new name for crate: Podaj nową nazwę skrzynki: @@ -2811,38 +2811,38 @@ - + Export Crate Eksportuj Skrzynkę - + Unlock Odblokuj - + An unknown error occurred while creating crate: Podczas tworzenia skrzynki pojawił się nieznany błąd: - + Rename Crate Zmień nazwę skrzynki - - + + Renaming Crate Failed Zmiana nazwy skrzynki nie powiodła się - + Crate Creation Failed Tworzenie skrzynki nie powiodło się - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista odtwarzania M3U (*.m3u);;Lista odtwarzania M3U8 (*.m3u8);;Lista odtwarzania PLS (*.pls);;Tekst CSV (*.csv);;Odczytywalny Tekst (*.txt) @@ -2862,12 +2862,12 @@ Skrzynki pozwalają Ci organizować muzyke jak chcesz! - + A crate cannot have a blank name. Musisz nazwać skrzynkę. - + A crate by that name already exists. Skrzynka o tej nazwie już istnieje. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Podaj nazwę nowej skrzynki: - - + + Creating Crate Failed Tworzenie skrzynki nie powiodło się - + A crate cannot have a blank name. Musisz nazwać skrzynkę. - - + + A crate by that name already exists. Skrzynka o tej nazwie już istnieje. - - + + An unknown error occurred while creating crate: Podczas tworzenia skrzynki pojawił się nieznany błąd: - + copy [noun] kopiuj - + Duplicate Crate Duplikuj skrzynkę - - - + + + Duplicating Crate Failed @@ -3656,7 +3656,7 @@ Action failed - + Akcja zakończona niepowodzeniem @@ -5589,7 +5589,7 @@ DlgPrefRecord - + Choose recordings directory Wybierz katalog nagrań @@ -5804,113 +5804,113 @@ DlgPrefSound - + None Żadne - + %1 Hz %1 Hz - + Default (long delay) Domyślne (długie opóźnienie) - + Experimental (no delay) Eksperymentalne (bez opóźnienia) - + Disabled (short delay) Wyłączone (krótkie opóźnienie) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Wyłączone - + Enabled Włączony - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. Ustawione opóźnienie zostało zmienione. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Błąd konfiguracji @@ -7383,15 +7383,28 @@ LibraryFeature - + Import Playlist Importuj listę odtwarzania - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Pliki list odtwarzania (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7682,39 +7695,39 @@ Wybrana skórka nie może być załadowana. - + OpenGL Direct Rendering Renderowanie bezpośrednie OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Potwierdź zamknięcie - + A deck is currently playing. Exit Mixxx? Deck właśnie gra! Wyjść z Mixxx'a? - + A sampler is currently playing. Exit Mixxx? Sampler aktualnie odtwarza. Wyjśc z Mixxx? - + The preferences window is still open. Okno właściwości jest nadal otwarte. - + Discard any changes and exit Mixxx? Porzucić wszystkie zmiany i wyjść z Mixxx? @@ -7793,7 +7806,7 @@ - + Playlists Listy odtwarzania @@ -7803,27 +7816,27 @@ Odblokuj - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Listy odtwarzania to uporządkowane listy utworów, które pozwalają zaplanować twoje zestawy DJ-skie. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Niektórzy didżeje tworzą playlisty przed ich występem na żywo, natomiast inni preferują tworzyć je w locie. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Przy zastosowaniu list odtwarzania podczas występu na żywo, pamiętaj, aby zawsze zwracać baczną uwagę na to, jak publiczność reaguje na muzykę, którą wybrałeś do gry. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Może okazać się koniecznym pominięcie kilka utworów z przygotowanej listy lub dodanie kilka różnych piosenek w celu zachowania energii odbiorców. - + Create New Playlist Utwórz nową listę odtwarzania @@ -9295,7 +9308,7 @@ - + History Historia @@ -9310,22 +9323,22 @@ Zablokuj - + The history section automatically keeps a list of tracks you play in your DJ sets. Sekcja Historii automatycznie zachowuje listę odtworzonych przez Ciebie utworów w Twoim zestawie DJ-skim. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Jest to przydatne dla zapamiętywania zestawów DJ-skich na których pracowałeś, publikowania list odtwarzania oraz zgłaszania Twojego odtwarzania do organizacji koncesjonujących. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Przy każdym uruchomieniu Mixxx jest tworzona nowa sekcja Historii. Możesz ją wyeksportować jako listę odtwarzania w różnych formatach lub odtworzyć ponownie za pomocą AutoDJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Możesz połączyć bieżącą sesję Historii z poprzednią klikając prawy przycisk myszki i wybierając "Połącz z poprzdenią" @@ -9515,23 +9528,23 @@ SoundManager - - + + a device urządzenie - + An unknown error occurred Wystąpił nieznany błąd - + Two outputs cannot share channels on "%1" - + Error opening "%1" Wystąpił błąd podczas otwierania "%1" @@ -11715,12 +11728,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12519,68 +12532,68 @@ ESC - + Remove Usuń - + Remove from Playlist - + Remove from Crate - + Hide from Library Ukryj w bibliotece - + Unhide from Library Odkryj w bibliotece - + Purge from Library Usuń z biblioteki - + Properties Właściwości - + Open in File Browser Otwórz plik w przeglądarce - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Utwórz nową listę odtwarzania - + Create New Crate Utwórz nową skrzynkę - + Enter name for new playlist: Podaj nazwę dla nowej listy odtwarzania: @@ -12610,144 +12623,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Podgląd Decka - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Skróty - + Loop - + ReplayGain GainPowtórki - + Waveform - + All Wszystko - + Deck %1 Deck %1 - + New Playlist Nowa Lista Odtwarzania - - - + + + Playlist Creation Failed Tworzenie listy odtwarzania nie powiodło się - + A playlist by that name already exists. Lista odtwarzania o tej nazwie już istnieje. - + A playlist cannot have a blank name. Lista odtwarzania nie może mieć pustej nazwy. - + An unknown error occurred while creating playlist: Wystąpił nieznany błąd podczas tworzenia listy odtwarzania: - + Lock BPM Zablokuj BPM - + Unlock BPM Odblokuj BPM - + Double BPM Podwójny BPM - + Halve BPM Połowa BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_pt_BR.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_pt_BR.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_pt_BR.ts mixxx-2.2.4~dfsg/res/translations/mixxx_pt_BR.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_pt_BR.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_pt_BR.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Adicionar Caixa como Fonte de Faixas @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nova Lista de Reprodução @@ -110,7 +110,7 @@ - + Create New Playlist Criar Nova Lista de Reprodução @@ -156,82 +156,82 @@ Analisar Toda a Lista de Reprodução - + Enter new name for playlist: Digite o novo nome para a lista: - + Duplicate Playlist Duplicar a Lista de Reprodução - - + + Enter name for new playlist: Digite o nome para a nova lista de reprodução: - + Export Playlist Exportar Lista de Reprodução - + Rename Playlist Renomear Lista de Reprodução - - + + Renaming Playlist Failed Falha ao Renomear a Lista de Reprodução - - - + + + A playlist by that name already exists. Uma lista de reprodução com esse nome já existe. - - - + + + A playlist cannot have a blank name. Uma lista de reprodução não pode ter um nome em branco. - + _copy [noun] Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed Falha ao Criar Lista de Reprodução - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a lista de reprodução: - + M3U Playlist (*.m3u) Lista de Reprodução M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de Reprodução M3U (*.m3u);;Lista de Reprodução M3U8 (*.m3u8);;Lista de Reprodução PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Não foi possível carregar a faixa. @@ -2057,12 +2057,12 @@ Tap to sync tempo (and phase with quantize enabled), hold to enable permanent sync - + Toque para sincronizar o tempo (e fase com a quantização ativada), segure para ativar a sincronização permanente One-time beat sync tempo (and phase with quantize enabled) - + Tempo de sincronização de batida única (e fase com quantização ativada) @@ -2175,27 +2175,27 @@ Loop Selected Beats - + Loop de Batidas Selecionadas Create a beat loop of selected beat size - + Criar um loop de batida do tamanho de batida selecionada Loop Roll Selected Beats - + Batidas Selecionadas da Lista de Loop Create a rolling beat loop of selected beat size - + Crie um loop de batida contínua do tamanho de batida selecionada Toggle loop on/off and jump to Loop In point if loop is behind play position - + Ative / desative o loop e pule para o ponto Loop In se o loop estiver atrás da posição de reprodução @@ -2205,12 +2205,12 @@ Enable loop, jump to Loop In point, and stop - + Ative o loop, pule para o ponto Loop In e pare Halve the loop length - + Reduzir o loop pela metade @@ -2768,7 +2768,7 @@ - + Lock Travar @@ -2793,7 +2793,7 @@ Fonte de Faixas do Auto DJ - + Enter new name for crate: Digite um novo nome para a caixa: @@ -2811,38 +2811,38 @@ - + Export Crate Exportar Caixa - + Unlock Destravar - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação do caixa: - + Rename Crate Renomear Caixa - - + + Renaming Crate Failed Falha ao Renomear Caixa - + Crate Creation Failed Criação da Caixa Falhou - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista de Reprodução M3U (*.m3u);;Lista de Reprodução M3U8 (*.m3u8);;Lista de Reprodução PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -2862,12 +2862,12 @@ Este recurso de caixas permite que você organize sua música do jeito que preferir! - + A crate cannot have a blank name. A caixa não pode ter um nome em branco. - + A crate by that name already exists. Já existe uma caixa com este nome. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Digite um nome para a nova caixa: - - + + Creating Crate Failed Falha ao criar Caixa - + A crate cannot have a blank name. A caixa não pode ter um nome em branco. - - + + A crate by that name already exists. Já existe uma caixa com este nome. - - + + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação do caixa: - + copy [noun] copiar - + Duplicate Crate Duplicar Caixa - - - + + + Duplicating Crate Failed Falha ao duplicar a caixa @@ -5612,7 +5612,7 @@ DlgPrefRecord - + Choose recordings directory Escolher diretório de gravações @@ -5829,113 +5829,113 @@ DlgPrefSound - + None Nenhum - + %1 Hz %1 Hz - + Default (long delay) Padrão (atraso longo) - + Experimental (no delay) Experimental (sem atraso) - + Disabled (short delay) Desativada (atraso curto) - + Soundcard Clock Relógio da Placa de Som - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Desativado - + Enabled Ativada - + Stereo Estéreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. O agendamento em tempo real está ativado. - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7409,15 +7409,28 @@ LibraryFeature - + Import Playlist Importar Lista de Reprodução - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Arquivos de Lista de Reprodução (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7708,39 +7721,39 @@ A skin selecionada não pôde ser carregada. - + OpenGL Direct Rendering Renderização Direta OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar a Saída - + A deck is currently playing. Exit Mixxx? Um deck está tocando neste momento. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Um sampler está tocando neste momento. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Descartar quaisquer mudanças e sair do Mixxx? @@ -7819,7 +7832,7 @@ - + Playlists Listas de Reprodução @@ -7829,27 +7842,27 @@ Destravar - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Listas de reprodução são listas ordenadas de músicas que permitem que você planeje suas apresentações como DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs constroem listas de reprodução antes de apresentações ao vivo, mas outros preferem construí-las na hora. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Ao utilizar uma lista de reprodução durante uma apresentação ao vivo, lembre-se de sempre prestar atenção em como o público reage à música que você escolheu tocar. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Pode ser necessário pular algumas músicas da sua lista de reprodução ou adicionar algumas músicas diferentes para manter a energia do seu público. - + Create New Playlist Criar Nova Lista de Reprodução @@ -9321,7 +9334,7 @@ - + History Histórico @@ -9336,22 +9349,22 @@ Travar - + The history section automatically keeps a list of tracks you play in your DJ sets. A seção histórico automaticamente mantém uma lista de músicas que você toca nas suas apresentações como DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Isto é útil para lembrar o que funcionou nas suas apresentações, postando listas de músicas ou parar dizer o que você tocou para organizações de licenciamento. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Cada vez que você iniciar o Mixxx, uma nova seção de histórico é criada. Você pode exportá-la como uma lista de reprodução em vários formatos ou tocá-la de novo com o Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Você pode juntar a seção de histórico atual com uma anterior clicando com o botão direito e selecionando "Juntar com a anterior". @@ -9541,23 +9554,23 @@ SoundManager - - + + a device o dispositivo - + An unknown error occurred Ocorreu um erro desconhecido - + Two outputs cannot share channels on "%1" Duas saídas não podem compartilhar o canal "%1" - + Error opening "%1" Erro abrindo "%1" @@ -11741,12 +11754,12 @@ TrackCollection - + Hiding tracks Faixas ocultas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? As faixas selecionadas estão na seguinte playlist: %1Ocultá-las as removerá dessas playlists. Continuar? @@ -12543,68 +12556,68 @@ ESC - + Remove Remover - + Remove from Playlist - + Remove from Crate - + Hide from Library Ocultar da Biblioteca - + Unhide from Library Desocultar da Biblioteca - + Purge from Library Eliminar da Biblioteca - + Properties Propriedades - + Open in File Browser Abrir no Navegador de Arquivos - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Criar Nova Lista de Reprodução - + Create New Crate Criar Nova Caixa - + Enter name for new playlist: Digite o nome para a nova lista de reprodução: @@ -12634,144 +12647,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags Importar das Etiquetas do Arquivo - + Import From MusicBrainz Importar do MusicBrainz - + Export To File Tags - + Preview Deck Deck de Pré-escuta - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcues - + Loop - + ReplayGain ReplayGain - + Waveform - + All Todos - + Deck %1 Deck %1 - + New Playlist Nova Lista de Reprodução - - - + + + Playlist Creation Failed Falha ao Criar Lista de Reprodução - + A playlist by that name already exists. Uma lista de reprodução com esse nome já existe. - + A playlist cannot have a blank name. Uma lista de reprodução não pode ter um nome em branco. - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a lista de reprodução: - + Lock BPM Travar o BPM - + Unlock BPM Destravar o BPM - + Double BPM Dobrar o BPM - + Halve BPM Diminuir o BPM pela metade - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_pt-PT.ts mixxx-2.2.4~dfsg/res/translations/mixxx_pt-PT.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_pt-PT.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_pt-PT.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Adicionar Caixa como Fonte de Faixas @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Playlist Nova @@ -110,7 +110,7 @@ - + Create New Playlist Criar uma Playlist Nova @@ -156,82 +156,82 @@ Analisar a Playlist inteira - + Enter new name for playlist: Introduzir um novo nome para a playlist: - + Duplicate Playlist Duplicar Playlist - - + + Enter name for new playlist: Introduzir um nome para a nova playlist: - + Export Playlist Exportar Playlist - + Rename Playlist Renomear Playlist - - + + Renaming Playlist Failed Renomeação da Playlist Falhou - - - + + + A playlist by that name already exists. Já existe uma playlist com esse nome. - - - + + + A playlist cannot have a blank name. Uma playlist não pode ter um nome em branco. - + _copy [noun] Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed Criação da Playlist Falhou - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a playlist: - + M3U Playlist (*.m3u) Playlist M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Texto CSV (*.csv);;Documento de Texto (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Não conseguiu carregar a faixa. @@ -2768,7 +2768,7 @@ - + Lock Bloquear @@ -2793,7 +2793,7 @@ Fonte Faixas Auto DJ - + Enter new name for crate: Introduza um novo nome para a caixa: @@ -2811,38 +2811,38 @@ - + Export Crate Exportar Caixa - + Unlock Desbloquear - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido ao criar a caixa: - + Rename Crate Renomear Caixa - - + + Renaming Crate Failed Renomeação da Caixa Falhou - + Crate Creation Failed Criação da Caixa Falhou - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Playlist M3U (*.m3u);;Playlist M3U8 (*.m3u8);;Playlist PLS (*.pls);;Texto CSV (*.csv);;Documento de Texto (*.txt) @@ -2862,12 +2862,12 @@ As caixas deixam-no organizar a sua música da maneira que gostar! - + A crate cannot have a blank name. Uma caixa não pode ter um nome em branco. - + A crate by that name already exists. Já existe uma caixa com esse nome. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Introduza nome para a nova caixa: - - + + Creating Crate Failed Criação da Caixa Falhou - + A crate cannot have a blank name. Uma caixa não pode ter um nome em branco. - - + + A crate by that name already exists. Já existe uma caixa com esse nome. - - + + An unknown error occurred while creating crate: Ocorreu um erro desconhecido ao criar a caixa: - + copy [noun] copiar - + Duplicate Crate Duplicar Caixa - - - + + + Duplicating Crate Failed Duplicação da Caixa Falhou @@ -5614,7 +5614,7 @@ DlgPrefRecord - + Choose recordings directory Escolher pasta para gravações @@ -5830,113 +5830,113 @@ DlgPrefSound - + None Nenhum - + %1 Hz %1 Hz - + Default (long delay) Padrão (atraso longo) - + Experimental (no delay) Experimental (sem atraso) - + Disabled (short delay) Desativado (atraso pequeno) - + Soundcard Clock Relógio Placa de Som - + Network Clock Relógio da Rede - + Master output only Apenas saída Master - + Master and booth outputs Saídas Master e cabine - + Direct monitor (recording and broadcasting only) Monição direta (apenas gravação e emissão) - + Disabled Desativado - + Enabled Ativado - + Stereo Estéreo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. As entradas de microfone estão fora de tempo no sinal gravar e emitir comparado com o que ouve. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - - + + Refer to the Mixxx User Manual for details. Consulte o Manual do Utilizador do Mixxx para detalhes. - + Configured latency has changed. A latência configurada foi alterada. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Volta a medir a latência de ida e volta e introduza-a acima para Compensação da Latência do Microfone de maneira a alinhar o tempo do microfone. - + Realtime scheduling is enabled. Agendamento em tempo real está ativado. - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7412,15 +7412,28 @@ LibraryFeature - + Import Playlist Importar Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Ficheiros Playlist (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7712,39 +7725,39 @@ A Skin selecionada não pode ser carrregada. - + OpenGL Direct Rendering Interpretação Direta de OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar Saída - + A deck is currently playing. Exit Mixxx? Um leitor está presentemente em reprodução. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Um sampler está presentemente em reprodução. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Rejeitar quaisquer alterações e sair do Mixxx? @@ -7823,7 +7836,7 @@ - + Playlists Playlists @@ -7833,27 +7846,27 @@ Desbloquear - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Playlists são listas ordenadas de canções que lhe permitem planear as suas séries de DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs elaboram playlists antes de atuarem ao vivo, mas outros preferem elaborá-las no momento. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quando estiver a usar uma playlist durante uma atuação DJ ao vivo, lembre-se de prestar sempre atenção a como o seu público reage à música que escolheu para tocar. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Pode ser necessário saltar algumas canções na playlist que preparou ou juntar algumas musicas diferentes de forma a manter a energia do seu público. - + Create New Playlist Criar uma Playlist Nova @@ -9350,7 +9363,7 @@ - + History Histórico @@ -9365,22 +9378,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. A seção histórico guarda automaticamente uma lista das faixas que tocou nas suas séries DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Isto é conveniente para lembrança do que funcionou nas suas séries DJ, publicar set-lists, ou reportar as suas execuções a organizações de licenciamento. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Sempre que inicia o Mixxx, é criada uma nova seção de histórico. Pode exportá-la como uma playlist em vários formatos ou tocá-la de novo com Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Pode juntar a sessão histórica presente com uma sessão anterior fazendo clique direito e selecionando "Juntar com a anterior". @@ -9570,23 +9583,23 @@ SoundManager - - + + a device um dispositivo - + An unknown error occurred Ocorreu um erro desconhecido - + Two outputs cannot share channels on "%1" Duas saídas não podem partilhar canais em %1 - + Error opening "%1" Erro ao abrir %1 @@ -11772,12 +11785,12 @@ TrackCollection - + Hiding tracks Ocultar faixas - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? As faixas selecionadas estão na seguintes playlists: %1 Ocultando-as serão removidas destas playlists. Continuar? @@ -12574,68 +12587,68 @@ ESC - + Remove Remover - + Remove from Playlist Remover da Playlist - + Remove from Crate Remover da Caixa - + Hide from Library Ocultar da Biblioteca - + Unhide from Library Mostrar da Bilioteca - + Purge from Library Remover da Biblioteca - + Properties Propriedades - + Open in File Browser Abrir no Explorador de Ficheiros - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Criar uma Playlist Nova - + Create New Crate Criar Caixa Nova - + Enter name for new playlist: Introduzir um nome para a nova playlist: @@ -12665,144 +12678,144 @@ Alterar BPM - + Add to Auto DJ Queue (Bottom) Adicionar à Fila Auto DJ (Baixo) - + Add to Auto DJ Queue (Top) Adicionar à Fila Auto DJ (Cima) - + Add to Auto DJ Queue (Replace) Adicionar à Fila Auto DJ (Substituir) - + Import From File Tags Importar Das Tags Ficheiros - + Import From MusicBrainz Importar De MusicBrainz - + Export To File Tags Exportar Para Tags Ficheiros - + Preview Deck Leitor de Antevisão - + BPM and Beatgrid BPM e Grelha de Batidas - + Play Count Contador de Leitura - + Cue Point Ponto de Marcação - + Hotcues Hot Cues - + Loop Loop - + ReplayGain ReplayGain - + Waveform Forma de Onda - + All Todas - + Deck %1 Leitor %1 - + New Playlist Playlist Nova - - - + + + Playlist Creation Failed Criação da Playlist Falhou - + A playlist by that name already exists. Já existe uma playlist com esse nome. - + A playlist cannot have a blank name. Uma playlist não pode ter um nome em branco. - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a playlist: - + Lock BPM Bloquear BPM - + Unlock BPM Desbloquear BPM - + Double BPM Duplicar BPM - + Halve BPM Reduzir a Metade BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_pt.ts mixxx-2.2.4~dfsg/res/translations/mixxx_pt.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_pt.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_pt.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Nova lista de reprodução @@ -108,7 +108,7 @@ - + Create New Playlist Criar nova lista de reprodução @@ -154,82 +154,82 @@ Analisar toda a Lista de reprodução - + Enter new name for playlist: Insira um novo nome para a lista de reprodução: - + Duplicate Playlist Duplicar Playlist - - + + Enter name for new playlist: Entre o nome da nova lista de reprodução - + Export Playlist Exportar Playlist - + Rename Playlist Renomear Playlist - - + + Renaming Playlist Failed A mudança de nome da Playlist falhou - - - + + + A playlist by that name already exists. Já existe uma Playlist com este nome - - - + + + A playlist cannot have a blank name. A Playlist não pode ter um nome vazio - + _copy [noun] Appendix to default name when duplicating a playlist _copiar - - - - - - + + + + + + Playlist Creation Failed A criação da Lista de reprodução falhou - - + + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a Playlist - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista M3U (*.m3u);;Lista M3U8 (*.m3u8);;Lista PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. NAO FOI Possível carregar a Faixa @@ -2766,7 +2766,7 @@ - + Lock Bloquear @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Exportar caixa - + Unlock Desbloquear - + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação da caixa: - + Rename Crate Renomear Caixa - - + + Renaming Crate Failed Falha AO renomear a Caixa - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Lista M3U (*.m3u);;Lista M3U8 (*.m3u8);;Lista PLS (*.pls);;Texto CSV (*.csv);;Texto (*.txt) @@ -2860,12 +2860,12 @@ Caixas deixam você organizar a sua música, como você prefira! - + A crate cannot have a blank name. Uma caixa não pode ter um nome vazio - + A crate by that name already exists. Já existe uma caixa com este nome. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: Entre o nome da nova caixa: - - + + Creating Crate Failed Falha ao criar a caixa. - + A crate cannot have a blank name. Uma caixa não pode ter um nome vazio - - + + A crate by that name already exists. Já existe uma caixa com este nome. - - + + An unknown error occurred while creating crate: Ocorreu um erro desconhecido durante a criação da caixa: - + copy [noun] - + Duplicate Crate Duplicar caixa - - - + + + Duplicating Crate Failed @@ -5584,7 +5584,7 @@ DlgPrefRecord - + Choose recordings directory Seleccione a pasta das gravações @@ -5799,113 +5799,113 @@ DlgPrefSound - + None Nenhum - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Activado - + Stereo Estéreo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Erro de configuração @@ -7377,15 +7377,28 @@ LibraryFeature - + Import Playlist Importar Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Listas de reprodução (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7673,39 +7686,39 @@ O tema seleccionado não pode ser carregado - + OpenGL Direct Rendering Processamento Direct OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmar saída - + A deck is currently playing. Exit Mixxx? Um leitor está actualmente a tocar. Sair do Mixxx? - + A sampler is currently playing. Exit Mixxx? Uma amostra está actualmente a tocar. Sair do Mixxx? - + The preferences window is still open. A janela de preferências ainda está aberta. - + Discard any changes and exit Mixxx? Rejeitar quaisquer alterações e sair do Mixxx? @@ -7784,7 +7797,7 @@ - + Playlists Listas de reprodução @@ -7794,27 +7807,27 @@ Desbloquear - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Listas de reprodução são listas ordenadas de faixas que lhe permitem planear as suas sessões de mistura. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Alguns DJs preparam listas de reprodução antes das suas actuações, mas outros preferem construi-las na altura em que estão a actuar. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Quando usa listas de reprodução durante uma actuação de DJ ao vivo, lembre-se de prestar uma atenção particular à forma como o seu público reage à música que escolheu para tocar. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Pode ser necessário saltar algumas faixas da lista de reprodução que tinha preparado ou adicionar faixas diferentes a fim de manter a energia do seu público. - + Create New Playlist Criar nova lista de reprodução @@ -9279,7 +9292,7 @@ - + History Histórico @@ -9294,22 +9307,22 @@ Bloquear - + The history section automatically keeps a list of tracks you play in your DJ sets. A secção histórico conserva automaticamente as listas de faixas que tocou durante as suas sessões de mistura. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Isto é prático para se lembrar o que funcionou nas suas actuações de DJ, publicar as listas de sessão, ou comunicar as suas difusões às autoridades de gestão de direitos de autor. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Sempre que inicia o Mixxx, é criada uma nova secção de histórico. Pode exportá-la como uma lista de reprodução em vários formatos ou tocá-la de novo com Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Pode juntar o histórico de sessão corrente com um precedente fazendo um clique-direito e seleccionando "Juntar ao precedente". @@ -9499,23 +9512,23 @@ SoundManager - - + + a device um dispositivo - + An unknown error occurred Ocorreu um erro desconhecido - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11699,12 +11712,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12501,68 +12514,68 @@ - + Remove Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library Ocultar na Biblioteca - + Unhide from Library Reexibir na Biblioteca - + Purge from Library Limpar da Biblioteca - + Properties Propriedades - + Open in File Browser Abrir no Navegador de Ficheiros - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Criar nova lista de reprodução - + Create New Crate Criar nova caixa - + Enter name for new playlist: Entre o nome da nova lista de reprodução @@ -12592,144 +12605,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Deck de Prá-visualização - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Marcações - + Loop - + ReplayGain - + Waveform - + All Tudo - + Deck %1 Leitor %1 - + New Playlist Nova lista de reprodução - - - + + + Playlist Creation Failed A criação da Lista de reprodução falhou - + A playlist by that name already exists. Já existe uma Playlist com este nome - + A playlist cannot have a blank name. A Playlist não pode ter um nome vazio - + An unknown error occurred while creating playlist: Ocorreu um erro desconhecido ao criar a Playlist - + Lock BPM Bloquear o Tempo (BPM) - + Unlock BPM Desbloquear o Tempo (BPM) - + Double BPM Duplicar o BPM - + Halve BPM Reduzir o BPM a metade - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ro.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ro.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ro.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ro.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Adaugă colecția ca sursă pistă @@ -98,7 +98,7 @@ BasePlaylistFeature - + New Playlist Listă de redare nouă @@ -109,7 +109,7 @@ - + Create New Playlist Crează listă de redare nouă @@ -155,82 +155,82 @@ Analizează întreaga listă de redare - + Enter new name for playlist: Introduceți noul nume pentru lista de redare: - + Duplicate Playlist Duplicare listă de redare - - + + Enter name for new playlist: Introduceți numele pentru noua listă de redare: - + Export Playlist Exportare listă de redare - + Rename Playlist Redenumește lista de redare - - + + Renaming Playlist Failed Redenumirea listei de redare a eşuat - - - + + + A playlist by that name already exists. Există deja o listă de redare cu acelaşi nume. - - - + + + A playlist cannot have a blank name. O listă de redare nu poate fi nedenumită. - + _copy [noun] Appendix to default name when duplicating a playlist _copiere - - - - - - + + + + + + Playlist Creation Failed Crearea listei de redare a eşuat - - + + An unknown error occurred while creating playlist: O eroare necunoscută a apărut în timpul creării listei de redare: - + M3U Playlist (*.m3u) Listă de redare M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Text lizibil (*.txt) @@ -366,7 +366,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Nu se poate încărca pista. @@ -2767,7 +2767,7 @@ - + Lock Blochează @@ -2792,7 +2792,7 @@ Sursă pistă Auto DJ - + Enter new name for crate: Introduceți numele nou pentru colecție: @@ -2810,38 +2810,38 @@ - + Export Crate Exportă colecție - + Unlock Deblochează - + An unknown error occurred while creating crate: A apărut o eroare la crearea colecției: - + Rename Crate Redenumește colecția - - + + Renaming Crate Failed Redenumirea colecției a eșuat - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Text lizibil (*.txt) @@ -2861,12 +2861,12 @@ Colecțiile vă permit să organizați muzica oricum vă place! - + A crate cannot have a blank name. O colecție nu poate fi nedenumită. - + A crate by that name already exists. Există o colecție cu acest nume. @@ -2885,50 +2885,50 @@ - + Enter name for new crate: Introduceți numele pentru colecția nouă: - - + + Creating Crate Failed Crearea colecției a eșuat - + A crate cannot have a blank name. O colecție nu poate fi nedenumită. - - + + A crate by that name already exists. Există o colecție cu acest nume. - - + + An unknown error occurred while creating crate: A apărut o eroare la crearea colecției: - + copy [noun] - + Duplicate Crate Dublează colecția - - - + + + Duplicating Crate Failed @@ -5588,7 +5588,7 @@ DlgPrefRecord - + Choose recordings directory Alegeți directorul înregistrări @@ -5803,113 +5803,113 @@ DlgPrefSound - + None Nimic - + %1 Hz %1 Hz - + Default (long delay) Implicit (întârziere lungă) - + Experimental (no delay) Experimental (fără întârziere) - + Disabled (short delay) Dezactivat (întârziere scurtă) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Dezactivat - + Enabled Activat - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Eroare de configurație @@ -7381,15 +7381,28 @@ LibraryFeature - + Import Playlist Importă listă de redare - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Fişiere listă de redare (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7679,39 +7692,39 @@ Aspectul aplicației selectat nu poate fi încărcat. - + OpenGL Direct Rendering Randare directă OpenGL - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Confirmare ieșire - + A deck is currently playing. Exit Mixxx? Un deck actualmente redă. Se oprește Mixxx? - + A sampler is currently playing. Exit Mixxx? Un sampler redă curent. Iese Mixxx? - + The preferences window is still open. Fereastra preferințe este încă deschisă. - + Discard any changes and exit Mixxx? Se descarcă orice modificări și se închide Mixxx? @@ -7788,7 +7801,7 @@ - + Playlists Liste de redare @@ -7798,27 +7811,27 @@ Deblochează - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Listele de redare sunt liste comandate de melodii care vă permit să planificați configurările DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Unii DJ-ei construiesc liste de redare înainte de a se prezenta live, dar alții preferă să le construiască din zbor. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Când utilizați o listă de redare în timpul unei sesiuni DJ live, nu uitați ca întotdeauna să acordați o atenție deosebită cum reacționează ascultătorii la muzica pe care ați ales să o redați. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Poate fi necesar să omiteți câteva melodii în lista de redare preparată sau să adăugați diferite melodii în scopul menținerii energiei audienței dumneavoastră. - + Create New Playlist Crează listă de redare nouă @@ -9284,7 +9297,7 @@ - + History Istoric @@ -9299,22 +9312,22 @@ Blochează - + The history section automatically keeps a list of tracks you play in your DJ sets. Secțiunea istoric păstrează automat o listă a pistelor redate în unitatea DJ. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. De fiecare dată la pornirea Mixxx, este creată o nouă secțiune istoric. O puteți exporta ca o listă de redare în formate diferite sau o puteți reda din nou cu Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Puteți uni istoricul sesiunii curente cu unul anterior apăsând click-dreapta și selectând "Unește cu anteriorul". @@ -9504,23 +9517,23 @@ SoundManager - - + + a device un dispozitiv - + An unknown error occurred A apărut o eroare necunoscută - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11704,12 +11717,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12506,68 +12519,68 @@ ESC - + Remove Elimină - + Remove from Playlist - + Remove from Crate - + Hide from Library Ascunde din bibliotecă - + Unhide from Library Anulează ascunderea din bibliotecă - + Purge from Library Rade din bibliotecă - + Properties Proprietăţi - + Open in File Browser Deschide în navigatorul de fișiere - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Crează listă de redare nouă - + Create New Crate Creează o colecție nouă - + Enter name for new playlist: Introduceți numele pentru noua listă de redare: @@ -12597,144 +12610,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Previzualizare Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcue - + Loop - + ReplayGain Înlocuire câștig - + Waveform - + All Toate - + Deck %1 Deck %1 - + New Playlist Listă de redare nouă - - - + + + Playlist Creation Failed Crearea listei de redare a eşuat - + A playlist by that name already exists. Există deja o listă de redare cu acelaşi nume. - + A playlist cannot have a blank name. O listă de redare nu poate fi nedenumită. - + An unknown error occurred while creating playlist: O eroare necunoscută a apărut în timpul creării listei de redare: - + Lock BPM Blochează BPM - + Unlock BPM Deblochează BPM - + Double BPM Dublează BPM - + Halve BPM Înjumătățește BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_ru.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_ru.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_ru.ts mixxx-2.2.4~dfsg/res/translations/mixxx_ru.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_ru.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_ru.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Авто DJ - + Add Crate as Track Source Добавить контейнер как источник дорожек @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Новый список воспроизведения @@ -110,7 +110,7 @@ - + Create New Playlist Создать новый список воспроизведения @@ -156,82 +156,82 @@ Анализировать весь список воспроизведения - + Enter new name for playlist: Введите новое имя для списка воспроизведения: - + Duplicate Playlist Дублировать список воспроизведения - - + + Enter name for new playlist: Введите имя для нового списка воспроизведения: - + Export Playlist Экспорт списка воспроизведения - + Rename Playlist Переименовать список воспроизведения - - + + Renaming Playlist Failed Не удалось переименовать список воспроизведения - - - + + + A playlist by that name already exists. Список воспроизведения с таким именем уже существует. - - - + + + A playlist cannot have a blank name. Имя списка воспроизведения не может быть пустым. - + _copy [noun] Appendix to default name when duplicating a playlist _копия - - - - - - + + + + + + Playlist Creation Failed Не удалось создать список воспроизведения - - + + An unknown error occurred while creating playlist: Произошла неизвестная ошибка при создании списка воспроизведения: - + M3U Playlist (*.m3u) Список воспроизведения M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Список воспроизведения M3U (*.m3u); Список воспроизведения M3u8 (*.m3u8); Список воспроизведения PLS (*.pls); Текст CSV (*.csv); Читаемый текст (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Не удалось загрузить дорожку. @@ -688,7 +688,7 @@ Master Output - Master Output + Главный выход @@ -700,7 +700,7 @@ Deck %1 - Палуба %1 + Дека %1 @@ -710,7 +710,7 @@ Preview Deck %1 - Предварительный просмотр палубы %1 + Предпросмотр деки %1 @@ -750,12 +750,12 @@ Master balance - Мастер баланс + Баланс главного выхода Master delay - Мастер задержки + Задержка главного выхода @@ -765,7 +765,7 @@ Toggle headphone split cueing - Наушников переключения Сплит намекать + Раздельный сигнал наушников @@ -844,25 +844,25 @@ Mix orientation (e.g. left, right, center) - Mix ориентацию (например влево, вправо, центр) + Направление сведения (например левый, правый, центр) Set mix orientation to left - Установка микс ориентация слева + Установить направления сведения слева Set mix orientation to center - Установка микс ориентацию по центру + Установить направление сведения по центру Set mix orientation to right - Установка микс ориентация справа + Установка направление сведения справа @@ -898,7 +898,7 @@ BPM tap button - BPM нажмите кнопку + Кнопка набивания темпа @@ -978,7 +978,7 @@ Cues - Подсказки + Метки @@ -988,22 +988,22 @@ Set cue point - Задать ключевую точку + Установить стартовую метку Go to cue point - Перейти к точке Cue + Перейти к стартовой метке Go to cue point and play - Перейти к точке Cue и играть + Перейти к стартовой метке и играть Go to cue point and stop - Перейти к точке Cue и остановить + Перейти к стартовой метке и остановить @@ -2405,7 +2405,7 @@ Deck %1 Quick Effect Enable Button - + Включить быстрый эффект на деку %1. @@ -2768,7 +2768,7 @@ - + Lock Заблокировать @@ -2793,7 +2793,7 @@ Источник трек DJ авто - + Enter new name for crate: Введите новое имя для ящиков: @@ -2811,38 +2811,38 @@ - + Export Crate Обрешеткой экспорта - + Unlock Разблокировать - + An unknown error occurred while creating crate: Произошла неизвестная ошибка при создании ящик: - + Rename Crate Переименование обрешеткой - - + + Renaming Crate Failed Переименование обрешеткой сбой - + Crate Creation Failed Ошибка создания контейнера - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Список воспроизведения M3U (*.m3u); Список воспроизведения M3u8 (*.m3u8); Список воспроизведения PLS (*.pls); Текст CSV (*.csv); Читаемый текст (*.txt) @@ -2862,12 +2862,12 @@ Ящики позволяют организовать вашу музыку, однако вы хотели! - + A crate cannot have a blank name. Обрешеткой не может иметь пустое имя. - + A crate by that name already exists. Ящик с таким именем уже существует. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Введите имя для новой ящик: - - + + Creating Crate Failed Создание ящиков не удалось - + A crate cannot have a blank name. Обрешеткой не может иметь пустое имя. - - + + A crate by that name already exists. Ящик с таким именем уже существует. - - + + An unknown error occurred while creating crate: Произошла неизвестная ошибка при создании ящик: - + copy [noun] Копия - + Duplicate Crate Дублировать обрешеткой - - - + + + Duplicating Crate Failed Дублирование контейнера не удалось. @@ -4374,12 +4374,12 @@ Crossfader Preferences - Кроссфейдер предпочтения + Настройки кроссфейдера Crossfader Curve - Кроссфейдер кривая + Кривая кроссфейдера @@ -4414,7 +4414,7 @@ Reverse crossfader (Hamster Style) - Обратный кроссфейдера (хомяк стиль) + Обратный кроссфейдер (Hamster style) @@ -4495,12 +4495,12 @@ Deck Preferences - + Настройки Деки Deck options - + Параметры деки. @@ -4823,7 +4823,7 @@ Resets the deck gain to unity when loading a track. - + Сбросить Gain деки, при загрузки трека @@ -5592,7 +5592,7 @@ DlgPrefRecord - + Choose recordings directory Выбор записи каталога @@ -5809,113 +5809,113 @@ DlgPrefSound - + None Нет - + %1 Hz %1 Гц - + Default (long delay) По умолчанию (задержки) - + Experimental (no delay) Экспериментальные (без задержки) - + Disabled (short delay) Инвалиды (короткие задержки) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Инвалидов - + Enabled Включено - + Stereo Стерео - + Mono Моно - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 мс - + Configuration error Ошибка конфигурации @@ -5984,7 +5984,7 @@ Enable Realtime scheduling (currently disabled), see the <a href="http://mixxx.org/wiki/doku.php/adjusting_audio_latency">Mixxx Wiki</a>. - + Включить планирование в реальном времени (в настоящее время отключено), см. <a href="http://mixxx.org/wiki/doku.php/adjusting_audio_latency">Mixxx Wiki</a> @@ -7388,15 +7388,28 @@ LibraryFeature - + Import Playlist Импортировать список воспроизведения - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Файлы списков воспроизведения (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7688,39 +7701,39 @@ Не удается загрузить выбранный кожи. - + OpenGL Direct Rendering OpenGL Прямой рендеринг - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Подтвердить выход - + A deck is currently playing. Exit Mixxx? В настоящее время играет для загара. Выход Mixxx? - + A sampler is currently playing. Exit Mixxx? В настоящее время играет сэмплер. Выход Mixxx? - + The preferences window is still open. Окно настроек остается открытым. - + Discard any changes and exit Mixxx? Отменить все изменения и закрыть Mixxx? @@ -7799,7 +7812,7 @@ - + Playlists Списки воспроизведения @@ -7809,27 +7822,27 @@ Разблокировать - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Списки отсортированы списки песен, которые позволяют вам планировать ваш DJ наборы. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Некоторые ди-джеи построить плейлисты, прежде чем они вживую, но другие предпочитают строить их на лету. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. При использовании списка воспроизведения во время живой набор DJ, помнить, чтобы всегда уделять пристальное внимание как ваша аудитория реагирует на музыку, вы решили играть. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Это может быть необходимо пропустить некоторые песни в плейлисте подготовленных или добавить некоторые разные песни для того, чтобы сохранить энергию вашей аудитории. - + Create New Playlist Создать новый список воспроизведения @@ -9222,7 +9235,7 @@ You can change the location of the Recordings folder in Preferences -> Recording. - + Вы можете изменить расположение папки для записи в Параметры -> Запись. @@ -9297,7 +9310,7 @@ - + History История @@ -9312,22 +9325,22 @@ Заблокировать - + The history section automatically keeps a list of tracks you play in your DJ sets. Раздел История автоматически сохраняет список треков, когда вы играете в вашем сетов. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Это удобно для вспомнив, что работал в вашем DJ наборы, набор списки или представлять ваши пьесы лицензирование организаций. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Каждый раз, когда вы начинаете Mixxx, создан новый раздел История. Вы можете экспортировать его в виде списка воспроизведения в различных форматах или играть его снова с Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Вы можете присоединиться к нынешней сессии истории с предыдущим один, щелкнув правой кнопкой мыши и выбрав команду «Объединить с предыдущим». @@ -9517,23 +9530,23 @@ SoundManager - - + + a device устройство - + An unknown error occurred Произошла неизвестная ошибка - + Two outputs cannot share channels on "%1" - + Error opening "%1" Ошибка при открытии "%1" @@ -10499,12 +10512,12 @@ Route the left crossfader bus through this effect unit. - + Направить сигнал левой шины через обозначенную цепь эффектов Route the right crossfader bus through this effect unit. - + Направить сигнал правой шины через обозначенную цепь эффектов @@ -11717,12 +11730,12 @@ TrackCollection - + Hiding tracks Cкрыть дорожки - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12519,68 +12532,68 @@ ESC - + Remove Удалить - + Remove from Playlist - + Remove from Crate - + Hide from Library Скрыть из библиотеки - + Unhide from Library Отобразить из библиотеки - + Purge from Library Удалить из библиотеки - + Properties Свойства - + Open in File Browser Открыть в браузере файл - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Создать новый список воспроизведения - + Create New Crate Создать новый ящик - + Enter name for new playlist: Введите имя для нового списка воспроизведения: @@ -12610,144 +12623,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags Импортировать из тегов файла - + Import From MusicBrainz Импортировать из MusicBrainz - + Export To File Tags - + Preview Deck Предварительный просмотр палубы - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcues - + Loop - + ReplayGain Выравнивание громкости - + Waveform - + All Все - + Deck %1 Палуба %1 - + New Playlist Новый список воспроизведения - - - + + + Playlist Creation Failed Не удалось создать список воспроизведения - + A playlist by that name already exists. Список воспроизведения с таким именем уже существует. - + A playlist cannot have a blank name. Имя списка воспроизведения не может быть пустым. - + An unknown error occurred while creating playlist: Произошла неизвестная ошибка при создании списка воспроизведения: - + Lock BPM Блокировка BPM - + Unlock BPM Разблокировать BPM - + Double BPM Двойной BPM - + Halve BPM Сократить вдвое BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Сэмплер %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_si.ts mixxx-2.2.4~dfsg/res/translations/mixxx_si.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_si.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_si.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ ස්වයංක්‍රීය DJ - + Add Crate as Track Source පථයක ආකාරයට අහුරුම් එකතු කරන්න @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist නව වාදන ලැයිස්තුව @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ මුළු වාදන ලැයිස්තුවම විශ්ලේෂණය කරන්න - + Enter new name for playlist: - + Duplicate Playlist වාදන ලැයිස්තුව පිටපත් කරන්න - - + + Enter name for new playlist: - + Export Playlist වාදන ලැයිස්තුව නිර්යාත කරන්න - + Rename Playlist වාදන ලැයිස්තුවේ නම වෙනස් කරන්න - - + + Renaming Playlist Failed වාදන ලැයිස්තුවේ නම වෙනස් කිරීම අසාර්ථකයි - - - + + + A playlist by that name already exists. එම නමින් වාදන ලැයිස්තුවක් දැනටමත් ඇත. - - - + + + A playlist cannot have a blank name. වාදන ලැයිස්තුවක් සඳහා හිස් නමක් තිබිය නොහැක. - + _copy [noun] Appendix to default name when duplicating a playlist _පිටපත් කරන්න - - - - - - + + + + + + Playlist Creation Failed වාදන ලැයිස්තුව හරිහැටි සකස් නොවිණි. - - + + An unknown error occurred while creating playlist: වාදන ලැයිස්තුව නිර්මාණය කරන අතරතුර අඥාත දෝෂයක් හටගත්තා - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U වර්ගයේ වාදන ලැයිස්තුව (*.m3u);;M3U8 වාදන ලැයිස්තුව (*.m3u8);;PLS වාදන ලැයිස්තුව (*.pls);;වගන්ති CSV (*.csv);;කියැවියහැකි වගන්ති (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. පථය ප්‍රවේශණය කල නොහැක. @@ -2766,7 +2766,7 @@ - + Lock අගුළුලන්න @@ -2791,7 +2791,7 @@ ස්වයං DJ පථ ආකාරය - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate ඇහුරුම ලබාගන්න. - + Unlock අගුළු අරින්න - + An unknown error occurred while creating crate: ඇහුරුම නිර්මාණය කරන අතරතුර අඥාත දෝෂයක් හටගත්තා - + Rename Crate අහුරුම් නම වෙනස් කිරීම - - + + Renaming Crate Failed ඇහුරුම් නම වෙනස් කිරීම අසාර්ථකයි - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U වර්ගයේ වාදන ලැයිස්තුව (*.m3u);;M3U8 වාදන ලැයිස්තුව (*.m3u8);;PLS වාදන ලැයිස්තුව (*.pls);;වගන්ති CSV (*.csv);;කියැවියහැකි වගන්ති (*.txt) @@ -2860,12 +2860,12 @@ ඔබගේ සංගීතය ඔබ කැමති ලෙසට පිළියෙළ කිරීමට ඇහුරුම ඔබට ඉඩ දෙයි. - + A crate cannot have a blank name. ඇහුරුමක් සඳහා හිස් නමක් තිබිය නොහැක. - + A crate by that name already exists. එම නමින් ඇහුරුමක් දැනටමත් ඇත. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed ඇහුරුම නිර්මාණය අසාර්ථකයි. - + A crate cannot have a blank name. ඇහුරුමක් සඳහා හිස් නමක් තිබිය නොහැක. - - + + A crate by that name already exists. එම නමින් ඇහුරුමක් දැනටමත් ඇත. - - + + An unknown error occurred while creating crate: ඇහුරුම නිර්මාණය කරන අතරතුර අඥාත දෝෂයක් හටගත්තා - + copy [noun] - + Duplicate Crate ඇහුරුම් පිටපත - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None කිසිවක් නැත - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled ක්‍රියාත්මක කළා - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist වාදන ලැයිස්තුව ආනයනය කරන්න - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) වාදන ලැයිස්තුවේ ගොනු (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ අගුළු අරින්න - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ අගුළුලන්න - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove ඉවත් කරන්න - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All සියළුම - + Deck %1 - + New Playlist නව වාදන ලැයිස්තුව - - - + + + Playlist Creation Failed වාදන ලැයිස්තුව හරිහැටි සකස් නොවිණි. - + A playlist by that name already exists. එම නමින් වාදන ලැයිස්තුවක් දැනටමත් ඇත. - + A playlist cannot have a blank name. වාදන ලැයිස්තුවක් සඳහා හිස් නමක් තිබිය නොහැක. - + An unknown error occurred while creating playlist: වාදන ලැයිස්තුව නිර්මාණය කරන අතරතුර අඥාත දෝෂයක් හටගත්තා - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sk.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sk.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sk.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sk.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Nový playlist @@ -108,7 +108,7 @@ - + Create New Playlist Vytvoriť nový playlist @@ -154,82 +154,82 @@ Analyzovať celý playlist - + Enter new name for playlist: Zadajte nové meno pre playlist - + Duplicate Playlist Duplikovať playlist - - + + Enter name for new playlist: Zadajte meno pre nový playlist - + Export Playlist Exportuj playlist - + Rename Playlist Premenovať playlist - - + + Renaming Playlist Failed Premenovanie playlistu zlyhalo - - - + + + A playlist by that name already exists. Tento názov playlistu už existuje! - - - + + + A playlist cannot have a blank name. Playlist nemôže byť bez názvu! - + _copy [noun] Appendix to default name when duplicating a playlist _kopíruj - - - - - - + + + + + + Playlist Creation Failed Chyba pri vytváraní zoznamu skladieb - - + + An unknown error occurred while creating playlist: Vyskytla sa neznáma chyba pri tvorbe playlistu. - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Súbory zoznamu skladieb typu (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Chyba pri načítaní súboru @@ -2766,7 +2766,7 @@ - + Lock Uzamknúť @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Exportuj DJ Bag - + Unlock Odomkni - + An unknown error occurred while creating crate: Neznáma chyba pri vytváraní DJ Bagu - + Rename Crate Premenuj DJ Bag - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Súbory zoznamu skladieb typu (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ DJ Bagy ti zorganizujú hudbu presne ako to chceš! - + A crate cannot have a blank name. DJ Bag musí mať názov. - + A crate by that name already exists. DJ Bag s týmto názvom už existuje. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Vytváranie DJ Bagu zlyhalo. - + A crate cannot have a blank name. DJ Bag musí mať názov. - - + + A crate by that name already exists. DJ Bag s týmto názvom už existuje. - - + + An unknown error occurred while creating crate: Neznáma chyba pri vytváraní DJ Bagu - + copy [noun] - + Duplicate Crate Skopíruj do nového DJ Bagu - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importovať playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Súbory zoznamu skladieb (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Odomkni - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Vytvoriť nový playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Uzamknúť - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Odobrať - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Vytvoriť nový playlist - + Create New Crate - + Enter name for new playlist: Zadajte meno pre nový playlist @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Nový playlist - - - + + + Playlist Creation Failed Chyba pri vytváraní zoznamu skladieb - + A playlist by that name already exists. Tento názov playlistu už existuje! - + A playlist cannot have a blank name. Playlist nemôže byť bez názvu! - + An unknown error occurred while creating playlist: Vyskytla sa neznáma chyba pri tvorbe playlistu. - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_sl.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_sl.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sl.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sl.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sl.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sl.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Avtomatski DJ (Auto DJ) - + Add Crate as Track Source Dodaj zaboj kot vir skladb. @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Nov seznam predvajanja @@ -110,7 +110,7 @@ - + Create New Playlist Ustvari nov seznam predvajanja @@ -156,82 +156,82 @@ Analiziraj celoten seznam predvajanja - + Enter new name for playlist: Vnesi novo ime seznama predvajanja: - + Duplicate Playlist Podvoji seznam predvajanja - - + + Enter name for new playlist: Vnesi ime seznama predvajanja: - + Export Playlist Izvozi seznam predvajanja - + Rename Playlist Preimenuj seznam predvajanja - - + + Renaming Playlist Failed Preimenovanje seznama predvajanja spodletelo - - - + + + A playlist by that name already exists. Seznam predvajanja s tem imenom že obstaja. - - - + + + A playlist cannot have a blank name. Seznam predvajanja ne more biti brez imena. - + _copy [noun] Appendix to default name when duplicating a playlist _kopija - - - - - - + + + + + + Playlist Creation Failed Ustvarjanje seznama predvajanja spodletelo - - + + An unknown error occurred while creating playlist: Neznana napaka pri kreiranju novega seznama predvajanja: - + M3U Playlist (*.m3u) M3U seznam predvajanja (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) seznam predvajanja M3U (*.m3u);;seznam predvajanja M3U8 (*.m3u8);;seznam predvajanja PLS (*.pls);;tekst CSV (*.csv);;berljiv tekst (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Ne morem naložiti pesmi. @@ -493,7 +493,7 @@ Music Directory Added - Glasbeni imenik je bil dodan + Mapa z glasbo je bila dodana @@ -720,7 +720,7 @@ Auxiliary %1 - Pomožno vodilo %1 + Pomožno AUX vodilo %1 @@ -730,7 +730,7 @@ Effect Rack %1 - Regal za efekte %1 + Regal z učinki %1 @@ -1069,22 +1069,22 @@ Looping - luping + Ponavljanje v zanki Loop In button - Gumb luping In + Gumb V zanko Loop Out button - Iz lupinga gumb + Gumb Iz zanke Loop Exit button - Izhod iz lupinga gumb + Gumb Izhod iz zanke @@ -1129,27 +1129,27 @@ Move loop forward by %1 beats - Premakni luping za %1 udarcev naprej + Premakni zanko za %1 udarcev naprej Move loop backward by %1 beats - Premakni luping za %1 udarcev nazaj + Premakni zanko za %1 udarcev nazaj Beat-Looping - Luping po ritmu + Ponavljanje zanke po ritmu Create %1-beat loop - Ustvari %1-ritmični luping + Ustvari %1-ritmično zanko Create temporary %1-beat loop roll - Začasno ustvari %1-ritmični luping + Začasno ustvari %1-ritmično zanko @@ -1697,32 +1697,32 @@ Loop In - Lupiranje vstop + V zanko Loop Out - Lupiranje izstop + Iz zanke Loop Exit - lupiranje izhod + Izhod iz zanke Reloop/Exit Loop - Ponocni luping/ izhod iz lupinga + Ponovi zanko/ izhod iz zanke Loop Halve - Polovični luping + Polovična zanka Loop Double - Dvojni luping + Dvojna zanka @@ -1747,22 +1747,22 @@ Move Loop +%1 Beats - Premakni luping za +%1 beat + Premakni zanko za +%1 beat Move Loop -%1 Beats - Premakni luping za -%1 beat + Premakni zanko za -%1 beat Loop %1 Beats - Luping %1 beatov + Zanka %1 beatov Loop Roll %1 Beats - rolajoči se luping %1 beatov + Zarolana zanka %1 beatov @@ -1817,38 +1817,38 @@ Effects - Efekti + Učinki Quick Effects - Hitri efekti + Hitri učinki Deck %1 Quick Effect Super Knob - Super regulator za hitre efekte za predvajalnik %1 + Super regulator za hitre učinke za predvajalnik %1 Quick Effect Super Knob (control linked effect parameters) - Super regulator za hitre efekte (kontrola povezanih parametrov efekta) + Super regulator za hitre učinke (kontrola povezanih parametrov učinka) Quick Effect - Hitri efekt + Hitri učinek Clear effect rack - Izprazni regal z efekti + Izprazni regal z učinki Clear Effect Rack - Izprazni regal z efekti + Izprazni regal z učinki @@ -1858,7 +1858,7 @@ Clear effect unit - Odvzemi efekt + Pobriši učinek @@ -1905,7 +1905,7 @@ Clear the current effect - Izbriše trenutni efekt + Izbriše trenutni učinek @@ -1915,7 +1915,7 @@ Toggle the current effect - Preklopi trenutni efekt + Preklopi trenutni učinek @@ -1925,7 +1925,7 @@ Switch to next effect - Pojdi na naslednji efekt + Preklopi na naslednji učinek @@ -1935,7 +1935,7 @@ Switch to the previous effect - Pojdi na prejšnji efekt + Preklopi na prejšnji učinek @@ -1945,7 +1945,7 @@ Switch to either next or previous effect - Preklopi na naslednji ali prejšnji efekt + Preklopi na naslednji ali prejšnji učinek @@ -2007,12 +2007,12 @@ Effect Rack Show/Hide - Prikaži ali skrij regal z efekti + Prikaži/skrij regal z učinki Show/hide the effect rack - Prikaže ali skrije regal v katerem so efekti + Prikaže ali skrije regal v katerem so učinki @@ -2032,7 +2032,7 @@ Toggle Effect Unit - Preklapljaj efekt + Preklapljaj učinke @@ -2175,92 +2175,92 @@ Loop Selected Beats - V lupingu ponavljaj izbrane beate + V zanki ponavljaj izbrane beate Create a beat loop of selected beat size - Ustvari beat luping z izbrano velikostjo beatov + Ustvari beat zanko z izbrano velikostjo beatov Loop Roll Selected Beats - Lupaj izbrane beate + Ponavljaj izbrane beate Create a rolling beat loop of selected beat size - Ustvari rolajoči se beat luping izbrane velikosti beatov + Ustvari zarolano beat zanke izbrane velikosti beatov Toggle loop on/off and jump to Loop In point if loop is behind play position - Vklopi/izklopi luping in skoči na Loop In točko, če je luping za položajem predvajanja + Vklopi/izklopi zanko in skoči na točko V zanko, če je zanka za položajem predvajanja Reloop And Stop - Re-lupaj in ustavi + Ponovi zanko in ustavi Enable loop, jump to Loop In point, and stop - Vklopi luping, skoči na Loop In točko in ustavi + Vklopi zanko, skoči na točko V zanko in ustavi Halve the loop length - Razpolovi dolžino lupinga + Razpolovi dolžino zanke Double the loop length - Podvoji dolžino lupinga + Podvoji dolžino zanke Beat Jump / Loop Move - Skok po beatu / premakni luping + Skok po beatu / premakni zanko Jump / Move Loop Forward %1 Beats - Skok /premakni luping naprej za %1 beatov + Skok /premakni zanko naprej za %1 beatov Jump / Move Loop Backward %1 Beats - Skok /premakni luping nazaj za %1 beatov + Skok /premakni zanko nazaj za %1 beatov Jump forward by %1 beats, or if a loop is enabled, move the loop forward %1 beats - Premakni luping naprej za %1 beatov ali, če je luping vklopljen, premakni luping naprej za %1 beatov + Premakni zanko naprej za %1 beatov ali, če je zanka vklopljena, premakni zanko naprej za %1 beatov Jump backward by %1 beats, or if a loop is enabled, move the loop backward %1 beats - Premakni luping nazaj za %1 beatov ali, če je luping vklopljen, premakni luping nazaj za %1 beatov + Premakni zanko nazaj za %1 beatov ali, če je zanka vklopljena, premakni zanko nazaj za %1 beatov Beat Jump / Loop Move Forward Selected Beats - Skok po beatu / premakni luping naprej za izbrano število beatov + Skok po beatu / premakni zanko naprej za izbrano število beatov Jump forward by the selected number of beats, or if a loop is enabled, move the loop forward by the selected number of beats - Skoči naprej za izbrano število beatov ali, če je luping vklopljen, premakni luping naprej za izbrano število beatov. + Skoči naprej za izbrano število beatov ali, če je zanka vklopljena, premakni zanko naprej za izbrano število beatov. Beat Jump / Loop Move Backward Selected Beats - Skok po beatu / premakni luping nazaj za izbrano število beatov + Skok po beatu / premakni zanko nazaj za izbrano število beatov Jump backward by the selected number of beats, or if a loop is enabled, move the loop backward by the selected number of beats - Skoči nazaj za izbrano število beatov ali, če je luping vklopljen, premakni luping nazaj za izbrano število beatov. + Skoči nazaj za izbrano število beatov ali, če je zanka vklopljena, premakni zanko nazaj za izbrano število beatov. @@ -2405,22 +2405,22 @@ Deck %1 Quick Effect Enable Button - Gumb za vklop hitrega efekta za predvajalnik %1 + Gumb za vklop hitrega učinka za predvajalnik %1 Quick Effect Enable Button - Gumb za vklop hitrega efekta + Gumb za vklop hitrega učinka Enable or disable effect processing - Vklpi ali izklopi delovanje efekta + Vklopi ali izklopi delovanje učinka Super Knob (control effects' Meta Knobs) - Super regulator (nadzoruje Meta regulator efekta) + Super regulator (nadzoruje Meta regulator učinka) @@ -2430,7 +2430,7 @@ Toggle effect unit between D/W and D+W modes - Preklapljaj efekt med D/W in D+W modusom + Preklapljaj način učinka med D/W in D+W @@ -2461,7 +2461,7 @@ Show Effect Parameters - Prikaži parametre efekta + Prikaži parametre učinka @@ -2471,7 +2471,7 @@ Effect Meta Knob (control linked effect parameters) - Meta regulator efekta (kontrola povezanih parametrov efekta) + Meta-regulator učinka (kontrola povezanih parametrov učinka) @@ -2481,7 +2481,7 @@ Set how linked effect parameters change when turning the Meta Knob. - Določi, kako se spreminjajo povezani parametri efekta, kadar vrtimo Meta regulator. + Določi kako se spreminjajo povezani parametri učinka, kadar vrtimo meta-regulator. @@ -2491,7 +2491,7 @@ Invert how linked effect parameters change when turning the Meta Knob. - Obrne (invertira) spreminjanje povezanih parametrov efekta, ko vrtimo Meta regulator. + Obrne oz. invertira spreminjanje povezanih parametrov učinka, ko vrtimo meta-regulator. @@ -2516,7 +2516,7 @@ Auxiliary On/Off - Pomožno vodilo Vklop/izklop + Pomožno AUX vodilo Vklop/izklop @@ -2768,7 +2768,7 @@ - + Lock Zakleni @@ -2793,7 +2793,7 @@ Auto DJ izvor skladbe - + Enter new name for crate: Vnesi novo ime zaboja: @@ -2811,38 +2811,38 @@ - + Export Crate Izvozi zaboj - + Unlock Odkleni - + An unknown error occurred while creating crate: Neznana napaka pri ustvarjanju zaboja: - + Rename Crate Preimenuj zaboj - - + + Renaming Crate Failed Premineovanje zaboja ni uspelo - + Crate Creation Failed Ustvarjanje zaboja ni uspelo - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) seznam predvajanja M3U (*.m3u);;seznam predvajanja M3U8 (*.m3u8);;seznam predvajanja PLS (*.pls);;tekst CSV (*.csv);;berljiv tekst (*.txt) @@ -2862,12 +2862,12 @@ Zaboji omogočajo poljuben način razvrščanja in organizacije! - + A crate cannot have a blank name. Zaboj ne more biti brez imena. - + A crate by that name already exists. Zaboj s tem imenom že obstaja. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Vnesi ime novega zaboja: - - + + Creating Crate Failed Ustvarjanje zaboja ni uspelo - + A crate cannot have a blank name. Zaboj ne more biti brez imena. - - + + A crate by that name already exists. Zaboj s tem imenom že obstaja. - - + + An unknown error occurred while creating crate: Neznana napaka pri ustvarjanju zaboja: - + copy [noun] kopiranje - + Duplicate Crate Podvoji zaboj - - - + + + Duplicating Crate Failed Podvajanje zaboja ni uspelo @@ -3731,7 +3731,7 @@ Public stream - Javni prenos + Javni tok @@ -3741,7 +3741,7 @@ Stream name - Ime prenosa + Ime toka @@ -4323,7 +4323,7 @@ Effect options - Opcije efekta + Opcije učinka @@ -4338,7 +4338,7 @@ Reset metaknob to effect default - Ponastavi meta-regulator na privete nastavitve efekta + Ponastavi meta-regulator na privzete nastavitve učinka @@ -4401,7 +4401,7 @@ Scratching - Praskanje + Drgnjenje @@ -4786,12 +4786,12 @@ Only allow EQ knobs to control EQ-specific effects - Omeji EQ regulatorje, da kontrolirajo zgolj efekte, ki so vezani na izravnalnik. + Omeji EQ regulatorje, da kontrolirajo zgolj učinke, ki so vezani na izravnalnik. Uncheck to allow any effect to be loaded into the EQ knobs. - Odznačite, da dovolite uporabo kateregakoli efekta z EQ regulatorji. + Odznačite, da dovolite uporabo kateregakoli učinka z EQ regulatorji. @@ -4811,7 +4811,7 @@ Quick Effect - Hitri efekt + Hitri učinek @@ -4852,7 +4852,7 @@ Bypass EQ effect processing - Obvod delovanja EQ efekta + Obvod delovanja EQ učinka @@ -4876,17 +4876,17 @@ Effects Preferences - Nastavitve efekta + Nastavitve učinka Available Effects - Efekti, ki so na voljo + Učinki, ki so na voljo Effect Info - Efekt info + Informacije učinka @@ -5156,7 +5156,7 @@ Discovered LV2 effects - Najdeni LV2 efekti + Najdeni LV2 učinki @@ -5164,7 +5164,7 @@ Music Directory Added - Glasbeni imenik je bil dodan + Mapa z glasbo je bila dodana @@ -5179,22 +5179,22 @@ Choose a music directory - Izberi glasbeni direktorij + Izberi mapo z glasbo Confirm Directory Removal - Potrdi brisanje direktorija + Potrdi odstranitev mape Mixxx will no longer watch this directory for new tracks. What would you like to do with the tracks from this directory and subdirectories?<ul><li>Hide all tracks from this directory and subdirectories.</li><li>Delete all metadata for these tracks from Mixxx permanently.</li><li>Leave the tracks unchanged in your library.</li></ul>Hiding tracks saves their metadata in case you re-add them in the future. - Mixxx ne bo več iskal novih skladb v tem direktoriju. Kaj bi radi storili s skladbami iz tega direktorija in poddirektorijev? <ul><li>Skril vse skladbe iz tega direktorija in poddirektorijev.</li><li>Za stalno izbrisal iz Mixxx vse metapodatke za te skladbe. </li><li>Pustil skladbe brez sprememb v knjižnici.</li></ul>Skril skladbe, tako da se ohranijo metapodatki, da se lahko kasneje spet dodajo. + Mixxx ne bo več iskal novih skladb v tej mapi. Kaj bi radi storili s skladbami iz te mape in podmap? <ul><li>Skril vse skladbe iz te mape in podmap.</li><li>Za stalno izbrisal iz Mixxx vse metapodatke za te skladbe. </li><li>Pustil skladbe brez sprememb v knjižnici.</li></ul>Skril skladbe, tako da se ohranijo metapodatki, da se lahko kasneje spet dodajo. Metadata means all track details (artist, title, playcount, etc.) as well as beatgrids, hotcues, and loops. This choice only affects the Mixxx library. No files on disk will be changed or deleted. - Metapodatki so vse podrobnosti o skladbi (umetnik, naslov, število predvajanj, itd.), kot tudi mreže beata, hotcue iztočnice in lupingi. Ta izbira se nanaša le na Mixxx knjižnico. Nobena datoteka na disku se ne spremeni ali izbriše. + Metapodatki so vse podrobnosti o skladbi (umetnik, naslov, število predvajanj, itd.), kot tudi mreže beata, hotcue iztočnice in zanke. Ta izbira se nanaša le na Mixxx knjižnico. Nobena datoteka na disku se ne spremeni ali izbriše. @@ -5214,7 +5214,7 @@ Relink music directory to new location - Preveži glasbeni direktorij z novo lokacijo + Preveži glasbeno mapo z novo lokacijo @@ -5237,7 +5237,7 @@ If removed, Mixxx will no longer watch this directory and its subdirectories for new tracks. - Če se izbriše, Mixxx ne bo več opazoval tega direktorija in njegovih poddirektorijev za novimi skladbami. + Če je odstranjena, Mixxx ne bo več opazoval te mape in njenih podmap in iskal nove skladbe. @@ -5247,7 +5247,7 @@ Add a directory where your music is stored. Mixxx will watch this directory and its subdirectories for new tracks. - Doda direktorij, kjer je shranjena vaša glasba. Mixxx bo opazoval ta direktorij in njegove poddirektorije za novimi skladbami. + Doda mapo, v kateri je shranjena vaša glasba. Mixxx bo opazoval to mapo in njene podmape in iskal nove skladbe. @@ -5257,7 +5257,7 @@ If an existing music directory is moved, Mixxx doesn't know where to find the audio files in it. Choose Relink to select the music directory in its new location. <br/> This will re-establish the links to the audio files in the Mixxx library. - Če se obstoječ glasbeni direktorij premakne, Mixxx ne ve, kje se nahajajo glasbene datoteke, ki so v njemu. Izberite Preveži, da bi izbrali glasbeni direktorij na njegovi novi lokaciji. <br/>To bo ponovno vzpostavilo povezavo do zvočnih datotek v Mixxx knjižnici. + Če se obstoječa mapa z glasbo premakne, Mixxx ne ve, kje se nahajajo glasbene datoteke, ki so v njej. Izberite Preveži, da bi izbrali glasbeno mapo na njeni novi lokaciji. <br/>To bo ponovno vzpostavilo povezavo do zvočnih datotek v Mixxx knjižnici. @@ -5611,9 +5611,9 @@ DlgPrefRecord - + Choose recordings directory - Izberi direktorij za snemanje + Izberi mapo za snemanje @@ -5626,12 +5626,12 @@ Recordings Directory - Direktorij za snemanje + Mapa za posnetke Recordings Directory: - Direktorij za posnetke: + Mapa za posnetke: @@ -5828,113 +5828,113 @@ DlgPrefSound - + None Brez - + %1 Hz %1 Hz - + Default (long delay) Privzeto (dolg zamik) - + Experimental (no delay) Ekspermientalno (brez zamika) - + Disabled (short delay) Izklopljeno (kratek zamik) - + Soundcard Clock Ura zvočne kartice - + Network Clock Mrežna ura - + Master output only Zgolj glavni master izhod - + Master and booth outputs Glavni master in dodatni booth izhod - + Direct monitor (recording and broadcasting only) Neposredni monitoring (samo pri snemanju in prenašanju) - + Disabled Onemogočeno - + Enabled Omogočeno - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Mikrofonski vhodi so zamaknjeni v signalu za snemanje in prenašanje časovno zamaknjeni in ne ustrezajo temu kar slišite. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - Izmerite latenco zvoka in jo vnesite zgoraj za kompenzacijo latence mikrofona in poravnavo časa mikrofona. + Izmerite latenco zvoka na krožni poti in jo vnesite zgoraj, za kompenzacijo latence mikrofona, da se poravna s časom mikrofona . - - + + Refer to the Mixxx User Manual for details. Preverite Mixxx uporabniški priročnik za več podrobnosti. - + Configured latency has changed. Nastavljena latenca je bila spremenjena. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Ponovno izmerite latenco kroženja zvoka in jo vnesite zgoraj za kompenzacijo latence mikrofona in poravnavo časa mikrofona. - + Realtime scheduling is enabled. Načrtovanje urnika v realnem času je vklopljeno - + %1 ms %1 ms - + Configuration error Napaka v konfiguraciji @@ -6662,7 +6662,7 @@ &Apply - &Prevzemi + &Potrdi @@ -7037,7 +7037,7 @@ &Apply - &Prevzemi + &Potrdi @@ -7399,26 +7399,39 @@ Add Directory to Library - Dodaj direktorij v knjižnico + Dodaj mapo v knjižnico Could not add the directory to your library. Either this directory is already in your library or you are currently rescanning your library. - Nisem mogel dodati direktorija v vašo knjižnico. Bodisi, da je ta direktorij že v vaši knjižnici ali pa trenutno poteka pregledovanje knjižnice. + Mape nisem mogel dodati v vašo knjižnico. Bodisi, da se ta mapa že nahaja v vaši knjižnici ali pa trenutno poteka pregledovanje knjižnice. LibraryFeature - + Import Playlist Uvozi seznam predvajanja - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Datoteke seznama predvajanja (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7557,7 +7570,7 @@ Choose music library directory - Izberi direktorij glasbene knjižnice + Izberi mapo glasbene knjižnice @@ -7709,39 +7722,39 @@ Izbrane preobleke ni mogoče naložiti. - + OpenGL Direct Rendering OpenGL neposredno renderiranje - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - + Na vašem računalniku ni vklopljeno strojno pospešeno neposredno upodabljanje oz. direct rendering<br><br>To pomeni, da bo prikazovanje valovnih oblik počasno<br><b>in da lahko močno obremenjuje procesor</b>. Posodobite konfiguracijo i<br>n vklopite neposredno upodabljanje ali pa izklopite <br>prikaz valovnih oblik v nastavitvah Mixxx, tako da izberete <br>Prazno kot valovno obliko v razdelku Vmesnik. - - - + + + Confirm Exit Potrdi izhod - + A deck is currently playing. Exit Mixxx? Eden od predvajalnikov trenutno predvaja. Zaprem Mixxx? - + A sampler is currently playing. Exit Mixxx? Eden od vzorčevalnikov trenutno predvaja. Zaprem Mixxx? - + The preferences window is still open. Okno z nastavitvami je še vedno odprto. - + Discard any changes and exit Mixxx? Zavržem vse spremembe in zaprem Mixxx? @@ -7820,7 +7833,7 @@ - + Playlists Seznami predvajanja @@ -7830,27 +7843,27 @@ Odkleni - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Seznami predvajanja so urejeni seznami skladb, ki omogočajo načrtovanje DJ setov. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Nekateri DJi ustvarijo sezname predvajanja še pred živim nastopom, spet drugi jih ustvarijo sproti. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Če med DJanjem uporabljate seznam predvajanja, bodite pozorni na odziv publike na vaš izbor glasbe. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Da bi obdržali pozornost in energijo vaše publike, bo morda potrebno preskočiti katero od vaših skladb ali dodati kakšno drugo. - + Create New Playlist Ustvari nov seznam predvajanja @@ -7892,7 +7905,7 @@ When you load tracks, Mixxx can re-analyze them and generate new, more accurate beatgrids. This will make automatic beatsync and looping more reliable. - Ko naložite skladbe, jih lahko MIxxx ponovno analizira in ustvari nove, boljše mreže beata. To bo izboljšalo zanesljivost samodejne sinhronizacije beata in lupinga. + Ko naložite skladbe, jih lahko MIxxx ponovno analizira in ustvari nove, boljše mreže beata. To bo izboljšalo zanesljivost samodejne sinhronizacije beata in zank. @@ -8083,7 +8096,7 @@ Auxiliary - Pomožni auxiliary + Pomožno AUX vodilo @@ -9348,7 +9361,7 @@ - + History Zgodovina @@ -9363,22 +9376,22 @@ Zakleni - + The history section automatically keeps a list of tracks you play in your DJ sets. V zgodovini se samodejno shranjuje seznam skladb, ki ste jih predvajali v svojem DJ setu. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Uporabno za pomnenje delujočih skaldb v vašem Dj setu, za pošiljanje seznamov seta ali za poročanje avtorskim organizacijam. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Vsakič, ko zaženete Mixxx, se ustvari nov seznam zgodovine. Lahko ga izvozite kot seznam predvajanja v različnih formatih ali ga ponovno predvajate z Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Trenutno zgodovino predvajanja je mogoče združiti s prejšnjo z desnim klikom in izbiro opcije "Združi s prejšnjo". @@ -9568,23 +9581,23 @@ SoundManager - - + + a device naprava - + An unknown error occurred Zgodila se je neznana napaka - + Two outputs cannot share channels on "%1" Dva izhoda si ne moreta deliti kanalov na "%1" - + Error opening "%1" Napaka pri odpiranju "%1" @@ -9685,12 +9698,12 @@ loop active - luping je aktiven + zanka je aktivna loop inactive - luping ni aktiven + zanka ni aktivna @@ -10354,77 +10367,77 @@ Sets the track Loop-In Marker to the current play position. - Postavi vhodno točko lupinka na trenutno pozicijo predvajanja. + Postavi vhodno točko zanke na trenutno pozicijo predvajanja. Press and hold to move Loop-In Marker. - Pritisnite in držite za premik vhodne točke lupinga + Pritisnite in držite za premik vhodne točke zanke Jump to Loop-In Marker. - Skoči na vhodno točko lupinga. + Skoči na vhodno točko zanke. Sets the track Loop-Out Marker to the current play position. - Postavi izhodno oznako lupinga na trenutno pozicijo predvajanja. + Postavi izhodno oznako zanke na trenutno pozicijo predvajanja. Press and hold to move Loop-Out Marker. - Pritisnite in držite za premik izhodne oznake lupinga. + Pritisnite in držite za premik izhodne oznake zanke. Jump to Loop-Out Marker. - Skoči na izhodno oznako lupinga. + Skoči na izhodno oznako zanke. Beatloop Size - Velikost lupinga beata + Velikost beat zanke Select the size of the loop in beats to set with the Beatloop button. - Izberi velikost lupinga v beatih, ki se ga nastavi z Beatluping gumbom. + Izberi velikost zanke v beatih, ki se ga nastavi z Beat-zanka gumbom. Changing this resizes the loop if the loop already matches this size. - Spreminjanje tega spremeni velikost lupinga, če luping že ustreza tej velikosti. + Spreminjanje tega spremeni velikost zanke, če zanka že ustreza tej velikosti. Halve the size of an existing beatloop, or halve the size of the next beatloop set with the Beatloop button. - Prepolovi velikost obstoječega beatlupinga ali prepolovi velikost naslednjega beatlupinga, ki se določi z gumbom Beatluping + Prepolovi velikost obstoječe beat-zanke ali prepolovi velikost naslednje beat-zanke, ki se določi z gumbom Beat-zanka Double the size of an existing beatloop, or double the size of the next beatloop set with the Beatloop button. - Podvoji velikost obstoječega beatlupinga ali podvoji velikost naslednjega beatlupinga, ki se določi z gumbom Beatluping. + Podvoji velikost obstoječe beat zanke ali podvoji velikost naslednje beat zanke, ki se določi z gumbom Beat-zanka. Start a loop over the set number of beats. - Začni lupingom preko določenega števila beatov. + Zaženi zanko preko določenega števila beatov. Temporarily enable a rolling loop over the set number of beats. - Začasno vklop rolajoči se luping preko nastavljenega števila beatov. + Začasno vklopi zarolano zanko preko nastavljenega števila beatov. Beatjump/Loop Move Size - Beat-skok/Velikost premika lupinga + Skok po beatu/Velikost premika zanke Select the number of beats to jump or move the loop with the Beatjump Forward/Backward buttons. - Izbira števila beatov za skok ali premik lupina z gumboma Beat-skok naprej/nazaj. + Izbira števila beatov za skok ali premik zanke z gumboma Skok po beatu naprej/nazaj. @@ -10439,7 +10452,7 @@ Move the loop forward by the set number of beats. - Premakni luping naprej za nastavljeno število beatov. + Premakni zanko naprej za nastavljeno število beatov. @@ -10449,7 +10462,7 @@ Move the loop forward by 1 beat. - Premakni luping naprej za 1 beat. + Premakni zanko naprej za 1 beat. @@ -10464,7 +10477,7 @@ Move the loop backward by the set number of beats. - Premakni luping nazaj za nastavljeno število beatov. + Premakni zanko nazaj za nastavljeno število beatov. @@ -10474,27 +10487,27 @@ Move the loop backward by 1 beat. - Premakni luping nazaj za 1 beat. + Premakni zanko nazaj za 1 beat. Reloop - Re-lupaj + Ponovi zanko If the loop is ahead of the current position, looping will start when the loop is reached. - Če je zanka naprej od trenutne pozicije, se luping zažene, ko je dosežena zanka. + Če se zanka nahaja naprej od trenutne pozicije, se bo ponavljanje zanke začelo, ko bo dosežena zanka. Works only if Loop-In and Loop-Out Marker are set. - Deluje samo, če sta postavljni oznaki V-luping in Iz-lupinga + Deluje samo, če sta postavljeni oznaki V zanko in Iz zanke Enable loop, jump to Loop-In Marker, and stop playback. - Vklopi luping, skok na v-luping oznako in ustavi predvajanje. + Vklopi zanko, skoči na oznako V zanko in ustavi predvajanje. @@ -10761,7 +10774,7 @@ Route this auxiliary input through the indicated effect unit. - usmeri ta pomožni aux vhod skozi označeno efekt-enoto. + Usmeri ta pomožni AUX vhod skozi označeno efekt-enoto. @@ -10930,7 +10943,7 @@ Loops and cues snap to the nearest beat when quantization is enabled. - Ponavlja in skače na izhodišče najbližjega beata, kadar je kvantizacija vklopljena. + Zanke in cue točke skočijo na izhodišče najbližjega beata, kadar je kvantizacija vklopljena. @@ -11358,17 +11371,17 @@ Playback will resume where the track would have been if it had not entered the loop. - Predvajanje se bo nadaljevalo tam, kjer bi skladba bila, če se se bi zgodil luping. + Predvajanje se bo nadaljevalo tam, kjer bi se skladba nahajala, če se ne bi zagnala zanka. Loop Exit - lupiranje izhod + Izhod iz zanke Turns the current loop off. - Izklopi trenutni luping + Izklopi trenutno zanko @@ -11378,7 +11391,7 @@ When active, the playback continues muted in the background during a loop, reverse, scratch etc. - Če je aktivno se predvajanje nadaljuje utišano v ozadju med lupingom, drgnjenjem, igranjem nazaj, itd. + Če je aktivno, se predvajanje med izvajanjem zanke, drgnjenjem, igranjem nazaj, itd. nadaljuje, a tišje v ozadju @@ -11630,32 +11643,32 @@ Loop-In Marker - Oznaka V-luping + Oznaka V zanko Loop-Out Marker - Oznaka iz-lupinga + Oznaka Iz zanke Loop Halve - Polovični luping + Polovična zanka Halves the current loop's length by moving the end marker. - rapolovi trenutno dolžino zanke tako da premakne zaključno oznako + Razpolovi trenutno dolžino zanke, tako da premakne zaključno oznako Deck immediately loops if past the new endpoint. - Predvajalnik takoj zažene luping, če gre mimo nove zaključne oznake. + Predvajalnik takoj zažene zanko, če gre mimo nove zaključne oznake. Loop Double - Dvojni luping + Dvojna zanka @@ -11675,7 +11688,7 @@ Works only if Loop-In and Loop-Out marker are set. - Deluje le, če sta postavljeni vhodna in izhodna oznaka zanke. + Deluje le, če sta postavljeni oznaki V zanko in Iz zanke. @@ -11771,12 +11784,12 @@ TrackCollection - + Hiding tracks Skrij skladbe - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? Izbrane skladbe so v naslednji seznamih predvajanja: %1 Skrivanje jih bo odstranilo iz teh seznamov. Nadaljujem? @@ -12573,68 +12586,68 @@ ESC - + Remove Odstrani - + Remove from Playlist Izbriši iz seznama predvajanja - + Remove from Crate Izbriši iz zaboja - + Hide from Library Skrij iz knjižnice - + Unhide from Library Pokaži v knjižnici - + Purge from Library Pobriši iz knjižnice - + Properties Lastnosti - + Open in File Browser Odpri v brskalniku datotek - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Ustvari nov seznam predvajanja - + Create New Crate Ustvari nov zaboj - + Enter name for new playlist: Vnesi ime seznama predvajanja: @@ -12664,144 +12677,144 @@ Spremeni BPM - + Add to Auto DJ Queue (Bottom) Dodaj v Auto DJ zaporedje (na dno) - + Add to Auto DJ Queue (Top) Dodaj v Auto Dj zaporedje (na vrh) - + Add to Auto DJ Queue (Replace) Dodaj v Auto DJ zaporedje (zamenjaj) - + Import From File Tags naloži iz oznak v datoteki - + Import From MusicBrainz Naloži iz MusicBrainz - + Export To File Tags Izvozi oznake v datoteko - + Preview Deck Predvajalnik za predogled - + BPM and Beatgrid BPM in mreža beatov - + Play Count Števec predvajanj - + Cue Point Cue iztočnica - + Hotcues Vroče iztočnice - + Loop Zanka - + ReplayGain ReplayGain normalizacija - + Waveform Valovna oblika - + All Vse - + Deck %1 Predvajalnik %1 - + New Playlist Nov seznam predvajanja - - - + + + Playlist Creation Failed Ustvarjanje seznama predvajanja spodletelo - + A playlist by that name already exists. Seznam predvajanja s tem imenom že obstaja. - + A playlist cannot have a blank name. Seznam predvajanja ne more biti brez imena. - + An unknown error occurred while creating playlist: Neznana napaka pri kreiranju novega seznama predvajanja: - + Lock BPM Zakleni BPM - + Unlock BPM Odkleni BPM - + Double BPM Podvoji BPM - + Halve BPM Razpolovi BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Vzorčevalnik %1 @@ -12829,12 +12842,12 @@ (GLSL ES) - + (GLSL ES) (GL ES) - + (GL ES) diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sn.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sn.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sn.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sn.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Zviridze wega - + Add Crate as Track Source Shandisa homwe iyi senzvimbo yemimhanzi @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Mutsetse mutsva wekuridza @@ -110,7 +110,7 @@ - + Create New Playlist Gadzira mutsetse mutsva wekuridza @@ -156,82 +156,82 @@ Wongorora mutsetse wose - + Enter new name for playlist: Ipa zita ritsva kumutsetse: - + Duplicate Playlist Dzokorora mutsetse uyu - - + + Enter name for new playlist: Ipa zita kumutsetse mutsva: - + Export Playlist Buritsa mutsetse - + Rename Playlist Shandura zita remutsetse - - + + Renaming Playlist Failed Tatadza kushandura zita remutsetse - - - + + + A playlist by that name already exists. Pane mumwe mutsetse une zita rakadaro. - - - + + + A playlist cannot have a blank name. Mutsetse haukwanise kushaya zita. - + _copy [noun] Appendix to default name when duplicating a playlist _wakatedzerwa - - - - - - + + + + + + Playlist Creation Failed Tatadza kugadzira mutsetse wekuridza - - + + An unknown error occurred while creating playlist: Hameno zvisina kuitika mushe pakugadzira mutsetse wekuridza: - + M3U Playlist (*.m3u) Mutsetse weM3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Mutsetse weM3U (*.m3u);;Mutsetse weM3U8 (*.m3u8);;Mutsetse wePLS (*.pls);;Mutsetse weText CSV (*.csv);;Mutsetse weText (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Tatadza kuridza rwiyo. @@ -2768,7 +2768,7 @@ - + Lock Kiya @@ -2793,7 +2793,7 @@ Ridza Madiro kwabva Rwiyo - + Enter new name for crate: Ipa zita ritsva kumutsetse: @@ -2811,38 +2811,38 @@ - + Export Crate Buritsa bumbiro rekuridza - + Unlock Sunungura - + An unknown error occurred while creating crate: Hameno zvisina kuitika mushe pakugadzira bumbiro rekuridza: - + Rename Crate Shandura zita rehomwe - - + + Renaming Crate Failed Tatadza kushandura zita rehomwe - + Crate Creation Failed Tatadza kugadzira homwe - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) Mutsetse weM3U (*.m3u);;Mutsetse weM3U8 (*.m3u8);;Mutsetse wePLS (*.pls);;Mutsetse weText CSV (*.csv);;Mutsetse weText (*.txt) @@ -2862,12 +2862,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Isa zita rebumbiro idzva: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: Hameno zvisina kuitika mushe pakugadzira bumbiro rekuridza: - + copy [noun] - + Duplicate Crate Dzokorora bumbiro - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory Sarudza mekuisa marecording @@ -5797,113 +5797,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Chiri kushandisika - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist Unza mutsetse wekuridza - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Mafaira emutsetse wekuridza (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7670,39 +7683,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists @@ -7789,27 +7802,27 @@ Sunungura - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Gadzira mutsetse mutsva wekuridza @@ -9274,7 +9287,7 @@ - + History @@ -9289,22 +9302,22 @@ Kiya - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove Bvisa - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Gadzira mutsetse mutsva wekuridza - + Create New Crate Gadzira Homwe Itsva - + Enter name for new playlist: Ipa zita kumutsetse mutsva: @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Pekujambira uchiridza - + Loop - + ReplayGain Hudzamu Hwerwiyo - + Waveform - + All - + Deck %1 Mupaka %1 - + New Playlist Mutsetse mutsva wekuridza - - - + + + Playlist Creation Failed Tatadza kugadzira mutsetse wekuridza - + A playlist by that name already exists. Pane mumwe mutsetse une zita rakadaro. - + A playlist cannot have a blank name. Mutsetse haukwanise kushaya zita. - + An unknown error occurred while creating playlist: Hameno zvisina kuitika mushe pakugadzira mutsetse wekuridza: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sq-AL.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sq-AL.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sq-AL.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sq-AL.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ DJ Automatik - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Listë e Re @@ -108,7 +108,7 @@ - + Create New Playlist Krijo Listë të Re @@ -154,82 +154,82 @@ Analizo të Gjithë Listën - + Enter new name for playlist: - + Duplicate Playlist Dyfisho Lisën - - + + Enter name for new playlist: Zgjidh Emrin e Listës së Re - + Export Playlist Eksporto Listën - + Rename Playlist Riemërto Listën - - + + Renaming Playlist Failed Riemërtimi i Listës Dështoi - - - + + + A playlist by that name already exists. Lista me atë Emër Ekziston - - - + + + A playlist cannot have a blank name. Lista Nuk Mund të Ketë Emër Bosh - + _copy [noun] Appendix to default name when duplicating a playlist _kopje - - - - - - + + + + + + Playlist Creation Failed Krijimi i Lisës Dështoi - - + + An unknown error occurred while creating playlist: Një Gabim i Panjohur Ndodhi Ndërsa po Krijohej Lista - + M3U Playlist (*.m3u) Listë M3U (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock Kyç @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Importo Listën - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Krijo Listë të Re @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Kyç - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Hiq - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Krijo Listë të Re - + Create New Crate - + Enter name for new playlist: Zgjidh Emrin e Listës së Re @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Shenjat e Shpejta - + Loop - + ReplayGain ReplayGain - + Waveform - + All - + Deck %1 Kuverta %1 - + New Playlist Listë e Re - - - + + + Playlist Creation Failed Krijimi i Lisës Dështoi - + A playlist by that name already exists. Lista me atë Emër Ekziston - + A playlist cannot have a blank name. Lista Nuk Mund të Ketë Emër Bosh - + An unknown error occurred while creating playlist: Një Gabim i Panjohur Ndodhi Ndërsa po Krijohej Lista - + Lock BPM Mbyllni BPM - + Unlock BPM Rihape BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sr.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sr.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sr.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sr.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Самостални Диџеј - + Add Crate as Track Source Додај сандук у изворе @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Нови списак нумера @@ -110,7 +110,7 @@ - + Create New Playlist Састави листу песама @@ -156,82 +156,82 @@ Анализирај целу листу - + Enter new name for playlist: Ново име за листу песама: - + Duplicate Playlist Удвостручи списак нумера - - + + Enter name for new playlist: Ново име за листу песама: - + Export Playlist Извези списак нумера - + Rename Playlist Преименуј списак нумера - - + + Renaming Playlist Failed Преименовање списка нумера није успело - - - + + + A playlist by that name already exists. Већ постоји списак нумера са овим називом. - - - + + + A playlist cannot have a blank name. Назив списка нумера не може бити празан. - + _copy [noun] Appendix to default name when duplicating a playlist _умножи - - - - - - + + + + + + Playlist Creation Failed Стварање списка нумера није успело - - + + An unknown error occurred while creating playlist: Дошло је до непознате грешке приликом стварања списка нумера: - + M3U Playlist (*.m3u) М3У листа (*.м3у) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) М3У списак нумера (*.m3u);;М3У8 списак нумера (*.m3u8);;ПЛС списак нумера (*.pls);;Текстуални ЦСВ (*.csv);;Читљив текст (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Не могу да учитам нумеру. @@ -2801,7 +2801,7 @@ - + Lock Закључај @@ -2826,7 +2826,7 @@ Селекција за Ауто-Диџеј-а - + Enter new name for crate: Унесите назив нове гајбице: @@ -2844,38 +2844,38 @@ - + Export Crate Извези гајбицу - + Unlock Откључај - + An unknown error occurred while creating crate: Дошло је до непознате грешке приликом стварања гајбице: - + Rename Crate Преименуј гајбицу - - + + Renaming Crate Failed Нисам успео да преименујем гајбицу - + Crate Creation Failed Креирање гајбице неуспешно - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) М3У списак нумера (*.m3u);;М3У8 списак нумера (*.m3u8);;ПЛС списак нумера (*.pls);;Текстуални ЦСВ (*.csv);;Читљив текст (*.txt) @@ -2895,12 +2895,12 @@ Гајбице вам омогућавају да организујете вашу музику онако како ви то хоћете! - + A crate cannot have a blank name. Назив гајбице не може бити празан. - + A crate by that name already exists. Већ постоји гајбица са овим називом. @@ -2919,50 +2919,50 @@ - + Enter name for new crate: Унесите назив нове гајбице: - - + + Creating Crate Failed Нисам успео да направим гајбицу - + A crate cannot have a blank name. Назив гајбице не може бити празан. - - + + A crate by that name already exists. Већ постоји гајбица са овим називом. - - + + An unknown error occurred while creating crate: Дошло је до непознате грешке приликом стварања гајбице: - + copy [noun] умножи - + Duplicate Crate Удвостручи гајбицу - - - + + + Duplicating Crate Failed Креирање копије гајбице неуспешно @@ -5801,7 +5801,7 @@ DlgPrefRecord - + Choose recordings directory Изаберите директоријум за снимања @@ -6036,105 +6036,105 @@ DlgPrefSound - + None Ништа - + %1 Hz %1 Hz - + Default (long delay) Основно (дуги ехо) - + Experimental (no delay) Експериментално (без еха) - + Disabled (short delay) Угашено (кратак ехо) - + Soundcard Clock Клок звучног адаптера - + Network Clock Мрежни клок - + Master output only Само стерео шина - + Master and booth outputs Стерео шина и оба излаза - + Direct monitor (recording and broadcasting only) Директни мониторинг (за снимање и емитовање) - + Disabled Неактивно - + Enabled Укључен - + Stereo Стерео - + Mono Моно - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. Микрофонски сигнал у емисији и снимку није усаглашен са оним што чујете. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Измери мрежно кашњење и унеси га заједно са Микрофонском компензацијом да би усагласили микрофон. - - + + Refer to the Mixxx User Manual for details. Консултујте Миксиксикс приручник за више информација. - + Configured latency has changed. Поставка компензације кашњења захтева корекцију. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. Поново измери мрежно кашњење и унеси га заједно са Микрофонском @@ -6142,17 +6142,17 @@ микрофонски сигнал. - + Realtime scheduling is enabled. Активно је мерење у реалном времену. - + %1 ms %1 ms - + Configuration error Грешка подешавања @@ -7633,15 +7633,28 @@ LibraryFeature - + Import Playlist Увезите списак нумера - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Спискови нумера (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7929,39 +7942,39 @@ Изабрана маска не може бити учитана. - + OpenGL Direct Rendering Посредно исцртавање ОпенГЛ-а - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Потврди излаз - + A deck is currently playing. Exit Mixxx? Носач тренутно пушта. Да изађем из Миксикса? - + A sampler is currently playing. Exit Mixxx? Узорчник тренутно пушта. Да изађем из Миксикса? - + The preferences window is still open. Прозор поставки је још увек отворен. - + Discard any changes and exit Mixxx? Да одбацим могуће измене и да напустим Миксикс? @@ -8040,7 +8053,7 @@ - + Playlists Списак нумера @@ -8050,27 +8063,27 @@ Откључај - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Спискови нумера су уређени спискови песама који вам омогућавају да испланирате ваше ДиЏеј скупове. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Неки диџеји изграде спискове нумера пре него ли обаве изведбу, а неки то раде у току саме представе. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Када користите списак нумера током живог ДиЏеј скупа, сетите се да увек обратите пажњу на то како ваша публика реагује на музику коју сте изабрали за пуштање. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Можда ће бити потребно да прескочите неке песме са припремљеног списка нумера или да додате неке друге песме у циљу одржања енергије публике. - + Create New Playlist Састави листу песама @@ -9535,7 +9548,7 @@ - + History Историјат @@ -9550,22 +9563,22 @@ Закључај - + The history section automatically keeps a list of tracks you play in your DJ sets. Одељак историјата самостално чува списак нумера које сте пуштали у вашим диџеј скуповима. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Ово је пригодно да се сетите шта сте радили у вашим диџеј скуповима, да поставите спискове скупова, или да пријавите ваше изведбе организацијама за лиценцирање. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Сваки пут када покренете Миксикс, прави се нови одељак историјата. Можете да га извезете као списак нумера у различитим облицима или да га поново изведете са Самосталним Диџејом. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Можете да придружите сесију тренутног историјата са претходном тако што ћете кликнути десним тастером миша и изабрати „Споји са претходном“. @@ -9755,23 +9768,23 @@ SoundManager - - + + a device уређај - + An unknown error occurred Дошло је до непознате грешке - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11955,12 +11968,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12757,68 +12770,68 @@ - + Remove Уклони - + Remove from Playlist - + Remove from Crate - + Hide from Library Сакриј у библиотеци - + Unhide from Library Прикажи у библиотеци - + Purge from Library Избаци из библиотеке - + Properties Својства - + Open in File Browser Отвори у прегледнику датотека - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Састави листу песама - + Create New Crate Нова гајбица - + Enter name for new playlist: Ново име за листу песама: @@ -12848,144 +12861,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Носач прегледа - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Битни наговештаји - + Loop - + ReplayGain Ауто-ниво - + Waveform - + All Све - + Deck %1 Палуба %1 - + New Playlist Нови списак нумера - - - + + + Playlist Creation Failed Стварање списка нумера није успело - + A playlist by that name already exists. Већ постоји списак нумера са овим називом. - + A playlist cannot have a blank name. Назив списка нумера не може бити празан. - + An unknown error occurred while creating playlist: Дошло је до непознате грешке приликом стварања списка нумера: - + Lock BPM Закључај ТУМ - + Unlock BPM Откључај ТУМ - + Double BPM Удвостручи ТУМ - + Halve BPM Преполови ТУМ - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Узорник %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_sv.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_sv.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_sv.ts mixxx-2.2.4~dfsg/res/translations/mixxx_sv.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_sv.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_sv.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Auto DJ - + Add Crate as Track Source Lägg till back som låtkälla @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Ny spellista @@ -110,7 +110,7 @@ - + Create New Playlist Skapa ny spellista @@ -156,82 +156,82 @@ Analysera hela spellistan - + Enter new name for playlist: Mata in ett nytt namn för spellistan: - + Duplicate Playlist Duplicera spellista - - + + Enter name for new playlist: Mata in ett namn för ny spellista: - + Export Playlist Exportera spellista - + Rename Playlist Byt namn på spellista - - + + Renaming Playlist Failed Namnbyte misslyckades - - - + + + A playlist by that name already exists. En spellista med det namnet finns redan. - - - + + + A playlist cannot have a blank name. En spellista kan inte vara utan namn. - + _copy [noun] Appendix to default name when duplicating a playlist _kopiera - - - - - - + + + + + + Playlist Creation Failed Spellistan gick inte att skapa - - + + An unknown error occurred while creating playlist: Ett okänt fel uppstod när spellistan skapades: - + M3U Playlist (*.m3u) M3U-spellista (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U spellista (*.m3u);;M3U8 spellista (*.m3u8);;PLS spellista (*.pls);;Text CSV (*.csv);;Läsbar text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Kunde inte ladda in låt. @@ -382,7 +382,7 @@ Please enable at least one connection to use Live Broadcasting. - + Vänligen aktivera minst en anslutning för att använda Live-sändning. @@ -2768,7 +2768,7 @@ - + Lock Lås @@ -2793,7 +2793,7 @@ Låtkälla för Auto DJ - + Enter new name for crate: Ange ett namn för den nya backen: @@ -2811,38 +2811,38 @@ - + Export Crate Exportera back - + Unlock Lås upp - + An unknown error occurred while creating crate: Ett okänt fel uppstod vid skapandet av backen - + Rename Crate Döp om back - - + + Renaming Crate Failed Omdöpning av back misslyckades - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U spellista (*.m3u);;M3U8 spellista (*.m3u8);;PLS spellista (*.pls);;Text CSV (*.csv);;Läsbar text (*.txt) @@ -2862,12 +2862,12 @@ Med backar kan du organisera din musik hur du vill - + A crate cannot have a blank name. En back kan inte ha ett tomt namn. - + A crate by that name already exists. En back med det namnet finns redan. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Ange ett namn för den nya backen: - - + + Creating Crate Failed Skapande av back misslyckades - + A crate cannot have a blank name. En back kan inte ha ett tomt namn. - - + + A crate by that name already exists. En back med det namnet finns redan. - - + + An unknown error occurred while creating crate: Ett okänt fel uppstod vid skapandet av backen - + copy [noun] kopiera - + Duplicate Crate Duplicera back - - - + + + Duplicating Crate Failed @@ -5593,7 +5593,7 @@ DlgPrefRecord - + Choose recordings directory Välj en mapp för inspelningar @@ -5808,113 +5808,113 @@ DlgPrefSound - + None Ingen - + %1 Hz %1 Hz - + Default (long delay) Standard (lång fördröjning) - + Experimental (no delay) Experimentell (ingen fördröjning) - + Disabled (short delay) Avstängd (kort fördröjning) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Avstängd - + Enabled Aktiverad - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Konfigurationsfel @@ -7388,15 +7388,28 @@ LibraryFeature - + Import Playlist Importera spellista - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Spellistsfiler (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7688,39 +7701,39 @@ Kunde inte ladda in det utvalda skinnet. - + OpenGL Direct Rendering OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Bekräfta avsluta - + A deck is currently playing. Exit Mixxx? En tallrik spelar fortfarande. Vill du avsluta Mixxx? - + A sampler is currently playing. Exit Mixxx? En samplare spelar fortfarande. Vill du avsluta Mixxx? - + The preferences window is still open. Inställningsfönstret är fortfarande öppnat. - + Discard any changes and exit Mixxx? Kassera eventuella ändringar och avsluta Mixxx? @@ -7799,7 +7812,7 @@ - + Playlists Spellistor @@ -7809,27 +7822,27 @@ Lås upp - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Spellistor är sorterade listor med låtar som du kan använda för att planera ett DJ-gig. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. En del DJs sätter ihop spellistor innan de uppträder live, medan andra föredrar att sätte ihop dem spontant. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. On du använder en spellista vid ett live-DJ uppträdande, tänk på att kolla hur publiken reagerar på musiken du valt ut. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Det kan vara nödvändigt att hoppa över några låtar i din förberedda spellista eller lägga till några olika låtar för att behålla din publiks energi. - + Create New Playlist Skapa ny spellista @@ -9300,7 +9313,7 @@ - + History Historia @@ -9315,22 +9328,22 @@ Lås - + The history section automatically keeps a list of tracks you play in your DJ sets. Historiasektionen sparar automatiskt en lista över alla låtar som du spelar i ditt framförande. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Kan vara nyttigt för att komma ihåg vad som funkade bra vid en spelning, för att publicera låtlistor eller för att avrapportera spelningar till musikförbund. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Varje gång du startar Mixxx, skapas en ny historiasektion. Du kan exportera den som en spellista i olika format, eller spela upp den igen med Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Du kan foga ihop den aktuella historia-sessionen med en föregående genom att högerklicka och välja "Foga ihop med föregående". @@ -9520,23 +9533,23 @@ SoundManager - - + + a device en enhet - + An unknown error occurred Ett okänt fel inträffade - + Two outputs cannot share channels on "%1" - + Error opening "%1" Fel vid öppning av "%1" @@ -11720,12 +11733,12 @@ TrackCollection - + Hiding tracks Döljer spår - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12522,68 +12535,68 @@ ESC - + Remove Ta bort - + Remove from Playlist - + Remove from Crate - + Hide from Library Dölj från biblioteket - + Unhide from Library Ta fram från biblioteket - + Purge from Library Rensa från biblioteket - + Properties Egenskaper - + Open in File Browser Öppna i filhanteraren - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist Skapa ny spellista - + Create New Crate Skapa ny back - + Enter name for new playlist: Mata in ett namn för ny spellista: @@ -12613,144 +12626,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Förlyssnings-tallrik - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Snabbmarkeringar - + Loop - + ReplayGain Förstärkning av uppspelning - + Waveform Vågform - + All Alla - + Deck %1 Tallrik %1 - + New Playlist Ny spellista - - - + + + Playlist Creation Failed Spellistan gick inte att skapa - + A playlist by that name already exists. En spellista med det namnet finns redan. - + A playlist cannot have a blank name. En spellista kan inte vara utan namn. - + An unknown error occurred while creating playlist: Ett okänt fel uppstod när spellistan skapades: - + Lock BPM Lås BPM - + Unlock BPM Lås upp BPM - + Double BPM Dubbel BPM - + Halve BPM Halva BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Samplare %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_te.ts mixxx-2.2.4~dfsg/res/translations/mixxx_te.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_te.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_te.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist కొత్త పాటలజాబితా @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist పాటలజాబితాను ఎగుమతిచేయి - + Rename Playlist - - + + Renaming Playlist Failed పాటలజాబితా పేరుమార్చుటలో విఫలమైంది - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2766,7 +2766,7 @@ - + Lock తాళంవేయి @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist పాటలజాబితాను దిగుమతిచేయి - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ తాళంవేయి - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove తీసివేయు - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist కొత్త పాటలజాబితా - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_tr.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_tr.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_tr.ts mixxx-2.2.4~dfsg/res/translations/mixxx_tr.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_tr.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_tr.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Otomatik DJ - + Add Crate as Track Source Kutuyu parça kaynağı olarak ekle @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Yeni çalma listesi @@ -110,7 +110,7 @@ - + Create New Playlist Yeni çalma listesi oluştur @@ -156,82 +156,82 @@ Tüm çalma listesini analiz et - + Enter new name for playlist: Çalma listesini adlandır - + Duplicate Playlist Çalma Listesini Çoğalt - - + + Enter name for new playlist: Yeni çalma listesini adlandır - + Export Playlist Çalma listesini dışa aktar - + Rename Playlist Çalma listesini yeniden adlandır - - + + Renaming Playlist Failed Çalma listesi yeniden adlandırılamadı - - - + + + A playlist by that name already exists. Bu isimde bir çalma listesi zaten var. - - - + + + A playlist cannot have a blank name. Liste ismi boş bırakılamaz - + _copy [noun] Appendix to default name when duplicating a playlist _kopyala - - - - - - + + + + + + Playlist Creation Failed Çalma Listesi Oluşturulamadı - - + + An unknown error occurred while creating playlist: Çalma listesi oluşturulurken bilinmeyen bir hata oluştu: - + M3U Playlist (*.m3u) M3U Çalma Listesi (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Çalma Listesi (*.m3u);;M3U8 Çalma Listesi (*.m3u8);;PLS Çalma Listesi (*.pls);;Metin CSV (*.csv);;Okunabilir Metin (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Parça aktarılamadı. @@ -377,12 +377,12 @@ Action failed - + İşlem başarısız Please enable at least one connection to use Live Broadcasting. - + Canlı Yayın'ı kullanmak için lütfen en az bir bağlantıyı etkinleştirin. @@ -390,22 +390,22 @@ Can't use secure password storage: keychain access failed. - + Güvenli parola depolama alanı kullanılamıyor: anahtar erişimi başarısız oldu. Secure password retrieval unsuccessful: keychain access failed. - + Güvenli parola alımı başarısız: anahtar erişimi başarısız oldu. Settings error - + Ayarlar hatası <b>Error with settings for '%1':</b><br> - + Ayarlarda hata '%1' için: @@ -423,32 +423,32 @@ Status - + Durum Disconnected - + Bağlantı kesildi Connecting... - + Bağlanıyor Connected - + Bağlandı Failed - + Başarısız oldu Unknown - + Bilinmeyen @@ -488,7 +488,7 @@ Computer - + Bilgisayar @@ -2771,7 +2771,7 @@ - + Lock Kilitle @@ -2796,7 +2796,7 @@ Oto DJ Parça Kaynağı - + Enter new name for crate: @@ -2814,38 +2814,38 @@ - + Export Crate Kutuyu Dışarı Aktar - + Unlock Kilidi Kaldır - + An unknown error occurred while creating crate: Kutuyu oluştururken bilinmeyen bir hata oluştu: - + Rename Crate Kutuyu Yeniden İsimlendir - - + + Renaming Crate Failed Kutuyu Yeniden İsimlendirme Başarısız - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Çalma Listesi (*.m3u);;M3U8 Çalma Listesi (*.m3u8);;PLS Çalma Listesi (*.pls);;Metin CSV (*.csv);;Okunabilir Metin (*.txt) @@ -2865,12 +2865,12 @@ Kutular müziklerinizi istediğiniz şekilde organize etmenizi sağlar - + A crate cannot have a blank name. Bir kutu boş bir isime sahip olamaz - + A crate by that name already exists. Bu adla oluşturulmuş bir müzik kutusu var @@ -2889,50 +2889,50 @@ - + Enter name for new crate: Yeni kutu için isim girin - - + + Creating Crate Failed Müzik Kutusu oluşturma başarısız - + A crate cannot have a blank name. Bir kutu boş bir isime sahip olamaz - - + + A crate by that name already exists. Bu adla oluşturulmuş bir müzik kutusu var - - + + An unknown error occurred while creating crate: Kutuyu oluştururken bilinmeyen bir hata oluştu: - + copy [noun] - + Duplicate Crate Müzik Kutusununun Kopyasını Çıkar - - - + + + Duplicating Crate Failed @@ -3656,7 +3656,7 @@ Action failed - + İşlem başarısız @@ -5588,7 +5588,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5803,113 +5803,113 @@ DlgPrefSound - + None Hiçbiri - + %1 Hz %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Engellenmiş - + Enabled Etkinleştirildi - + Stereo Stereo - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error @@ -7380,15 +7380,28 @@ LibraryFeature - + Import Playlist Çalma listesini içe aktar - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Çalma Listesi Dosyaları (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7676,39 +7689,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7785,7 +7798,7 @@ - + Playlists Çalma Listeleri @@ -7795,27 +7808,27 @@ Kilidi Kaldır - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Yeni çalma listesi oluştur @@ -9280,7 +9293,7 @@ - + History Geçmiş @@ -9295,22 +9308,22 @@ Kilitle - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9500,23 +9513,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11700,12 +11713,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12502,68 +12515,68 @@ ESC - + Remove Kaldır - + Remove from Playlist - + Remove from Crate - + Hide from Library Kütüphane'den gizle - + Unhide from Library Kütüphane'de göster - + Purge from Library Kütüphane'den kaldır - + Properties Özellikler - + Open in File Browser Dosya Tarayıcıda Aç - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Yeni çalma listesi oluştur - + Create New Crate Yeni kutu oluştur - + Enter name for new playlist: Yeni çalma listesini adlandır @@ -12593,144 +12606,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Önemli işaretler - + Loop - + ReplayGain - + Waveform - + All Hepsi - + Deck %1 Dek %1 - + New Playlist Yeni çalma listesi - - - + + + Playlist Creation Failed Çalma Listesi Oluşturulamadı - + A playlist by that name already exists. Bu isimde bir çalma listesi zaten var. - + A playlist cannot have a blank name. Liste ismi boş bırakılamaz - + An unknown error occurred while creating playlist: Çalma listesi oluşturulurken bilinmeyen bir hata oluştu: - + Lock BPM BPM'yi Kilitle - + Unlock BPM BPM Kilidini Aç - + Double BPM BPM'i ikiye katla - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx.ts mixxx-2.2.4~dfsg/res/translations/mixxx.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx.ts 2020-05-15 21:26:10.000000000 +0000 @@ -36,7 +36,7 @@ - + Add Crate as Track Source @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist @@ -110,7 +110,7 @@ - + Create New Playlist @@ -156,82 +156,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2768,7 +2768,7 @@ - + Lock @@ -2793,7 +2793,7 @@ - + Enter new name for crate: @@ -2811,38 +2811,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2862,12 +2862,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5582,7 +5582,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5797,113 +5797,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7374,15 +7374,28 @@ LibraryFeature - + Import Playlist - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7667,39 +7680,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7776,7 +7789,7 @@ - + Playlists @@ -7786,27 +7799,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9271,7 +9284,7 @@ - + History @@ -9286,22 +9299,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9491,23 +9504,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -10150,7 +10163,6 @@ Key - The musical key of a track @@ -11309,7 +11321,6 @@ Track Key - The musical key of a track @@ -11693,12 +11704,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12495,68 +12506,68 @@ - + Remove - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12586,144 +12597,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_uk.ts mixxx-2.2.4~dfsg/res/translations/mixxx_uk.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_uk.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_uk.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Авто-DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Новий Плейлист @@ -108,7 +108,7 @@ - + Create New Playlist Створити новий список відтворення @@ -154,82 +154,82 @@ Аналізувати весь список відтворення - + Enter new name for playlist: Введіть нове ім'я для списку відтворення: - + Duplicate Playlist Дублювати список відтворення - - + + Enter name for new playlist: Введіть ім'я для нового списку відтворення: - + Export Playlist Експортувати плейлист - + Rename Playlist Переіменування плейлиста - - + + Renaming Playlist Failed Перейменування плейлиста не вдалося - - - + + + A playlist by that name already exists. Плейлист з таким ім'ям вже існує. - - - + + + A playlist cannot have a blank name. Плейлист не може мати пусте ім'я - + _copy [noun] Appendix to default name when duplicating a playlist _копія - - - - - - + + + + + + Playlist Creation Failed Не вдалося створити плейлист - - + + An unknown error occurred while creating playlist: Виникла невідома помилка при створенні плейлиста: - + M3U Playlist (*.m3u) M3U список відтворення (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плейлист (*.m3u);;M3U8 Плейлист (*.m3u8);;PLS Плейлист (*.pls);;Text CSV (*.csv);;Звичайний текст (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Неможливо завантажити трек @@ -2766,7 +2766,7 @@ - + Lock Заблокувати @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Експортувати збірку - + Unlock Розблокувати - + An unknown error occurred while creating crate: Виникла невідома помилка під час створення збірки: - + Rename Crate Переіменувати збірку - - + + Renaming Crate Failed Перейменування збірки не вдалося - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Плейлист (*.m3u);;M3U8 Плейлист (*.m3u8);;PLS Плейлист (*.pls);;Text CSV (*.csv);;Звичайний текст (*.txt) @@ -2860,12 +2860,12 @@ Збірки дають змогу організовувати Вашу музику так, як Ви бажаєте! - + A crate cannot have a blank name. Збірка повинна мати назву. - + A crate by that name already exists. Збірка з такою назвою вже існує. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Створення збірки не вдалося - + A crate cannot have a blank name. Збірка повинна мати назву. - - + + A crate by that name already exists. Збірка з такою назвою вже існує. - - + + An unknown error occurred while creating crate: Виникла невідома помилка під час створення збірки: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None Не призначено - + %1 Hz %1 Гц - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled Активовано - + Stereo Стерео - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 мс - + Configuration error Помилка конфігурації @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Імпортувати плейлист - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Файли Плейлистів (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7668,39 +7681,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Підтвердити Вихід - + A deck is currently playing. Exit Mixxx? Дека в даний час грає. Вийти з Mixxx? - + A sampler is currently playing. Exit Mixxx? Семплер зараз грає. Вийти з Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7779,7 +7792,7 @@ - + Playlists Плейлисти @@ -7789,27 +7802,27 @@ Розблокувати - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist Створити новий список відтворення @@ -9274,7 +9287,7 @@ - + History Історія @@ -9289,22 +9302,22 @@ Заблокувати - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9494,23 +9507,23 @@ SoundManager - - + + a device пристрій - + An unknown error occurred Виникла невідома помилка - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11694,12 +11707,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12496,68 +12509,68 @@ - + Remove Видалити - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser Відкрити в файловому менеджері - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Створити новий список відтворення - + Create New Crate - + Enter name for new playlist: Введіть ім'я для нового списку відтворення: @@ -12587,144 +12600,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All Все - + Deck %1 - + New Playlist Новий Плейлист - - - + + + Playlist Creation Failed Не вдалося створити плейлист - + A playlist by that name already exists. Плейлист з таким ім'ям вже існує. - + A playlist cannot have a blank name. Плейлист не може мати пусте ім'я - + An unknown error occurred while creating playlist: Виникла невідома помилка при створенні плейлиста: - + Lock BPM Замкнути BPM - + Unlock BPM Розімкнути BPM - + Double BPM - + Halve BPM Навпіл BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Семплер %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_uz.ts mixxx-2.2.4~dfsg/res/translations/mixxx_uz.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_uz.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_uz.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Авто DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist Янги қўшиқ рўйхати @@ -108,7 +108,7 @@ - + Create New Playlist @@ -154,82 +154,82 @@ - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: - + Export Playlist Қўшиқ рўйхатини экспорт қилиш - + Rename Playlist Ижро рўйхатини қайта номлаш - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed - - + + An unknown error occurred while creating playlist: - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Қўшиқ қўшилмади @@ -2766,7 +2766,7 @@ - + Lock Қулфлаш @@ -2791,7 +2791,7 @@ - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate Қутини экспорт қилиш - + Unlock Қулфдан чиқариш - + An unknown error occurred while creating crate: Қути яратилаётганда номаълум зато рўй берди: - + Rename Crate Қутини қайта номлаш - - + + Renaming Crate Failed Қутини қайта номлаш муваффақиятсиз якунланди - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. Қутида бўш ном бўлмайди - + A crate by that name already exists. Ушбу номли қути аллақачон мавжуд. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed Қути яратиш муваффақиятсиз якунланди - + A crate cannot have a blank name. Қутида бўш ном бўлмайди - - + + A crate by that name already exists. Ушбу номли қути аллақачон мавжуд. - - + + An unknown error occurred while creating crate: Қути яратилаётганда номаълум зато рўй берди: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist Ижро рўйхатини импорт қилиш - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ Қулфдан чиқариш - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ Қулфлаш - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove Олиб ташлаш - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist - + Create New Crate - + Enter name for new playlist: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist Янги қўшиқ рўйхати - - - + + + Playlist Creation Failed - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_vi.ts mixxx-2.2.4~dfsg/res/translations/mixxx_vi.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_vi.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_vi.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ Tự động DJ - + Add Crate as Track Source Thêm thùng như theo dõi nguồn @@ -99,7 +99,7 @@ BasePlaylistFeature - + New Playlist Danh sách chơi mới @@ -110,7 +110,7 @@ - + Create New Playlist Tạo danh sách chơi mới @@ -156,82 +156,82 @@ Phân tích toàn bộ danh sách phát - + Enter new name for playlist: Nhập tên mới cho danh sách chơi: - + Duplicate Playlist Lặp lại danh sách chơi - - + + Enter name for new playlist: Nhập tên cho danh sách phát mới: - + Export Playlist Xuất chuyển danh sách chơi - + Rename Playlist Đổi tên danh sách chơi - - + + Renaming Playlist Failed Đổi tên danh sách phát đã thất bại - - - + + + A playlist by that name already exists. Một danh sách tên đó đã tồn tại. - - - + + + A playlist cannot have a blank name. Một danh sách không thể có một tên trống. - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed Sáng tạo danh sách phát đã thất bại - - + + An unknown error occurred while creating playlist: Lỗi không biết xảy ra trong khi tạo danh sách chơi: - + M3U Playlist (*.m3u) M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u); M3U8 danh sách bài hát (*.m3u8); PLS danh sách bài hát (* .pls); Văn bản CSV (*.csv); Có thể đọc được văn bản (*.txt) @@ -367,7 +367,7 @@ BaseTrackPlayerImpl - + Couldn't load track. Không thể nạp theo dõi. @@ -2768,7 +2768,7 @@ - + Lock Khóa @@ -2793,7 +2793,7 @@ Tự động theo dõi DJ nguồn - + Enter new name for crate: Nhập tên mới cho thùng: @@ -2811,38 +2811,38 @@ - + Export Crate Xuất khẩu thùng - + Unlock Mở khóa - + An unknown error occurred while creating crate: Lỗi không biết xảy ra trong khi tạo thùng: - + Rename Crate Đổi tên thùng - - + + Renaming Crate Failed Đổi tên thùng thất bại - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U Playlist (*.m3u); M3U8 danh sách bài hát (*.m3u8); PLS danh sách bài hát (* .pls); Văn bản CSV (*.csv); Có thể đọc được văn bản (*.txt) @@ -2862,12 +2862,12 @@ Thùng cho phép bạn tổ chức âm nhạc của bạn Tuy nhiên bạn muốn! - + A crate cannot have a blank name. Một thùng có thể không có một tên trống. - + A crate by that name already exists. Một thùng tên đó đã tồn tại. @@ -2886,50 +2886,50 @@ - + Enter name for new crate: Nhập tên cho thùng mới: - - + + Creating Crate Failed Tạo thùng thất bại - + A crate cannot have a blank name. Một thùng có thể không có một tên trống. - - + + A crate by that name already exists. Một thùng tên đó đã tồn tại. - - + + An unknown error occurred while creating crate: Lỗi không biết xảy ra trong khi tạo thùng: - + copy [noun] - + Duplicate Crate Trùng lặp thùng - - - + + + Duplicating Crate Failed @@ -5591,7 +5591,7 @@ DlgPrefRecord - + Choose recordings directory Chọn thư mục bản ghi âm @@ -5808,113 +5808,113 @@ DlgPrefSound - + None Không có - + %1 Hz %1 Hz - + Default (long delay) Mặc định (dài sự chậm trễ) - + Experimental (no delay) Thử nghiệm (có sự chậm trễ) - + Disabled (short delay) Khuyết tật (sự chậm trễ ngắn) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled Khuyết tật - + Enabled Kích hoạt - + Stereo Âm thanh nổi - + Mono Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error Lỗi cấu hình @@ -7387,15 +7387,28 @@ LibraryFeature - + Import Playlist Chuyển nhập danh sách phát - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) Tệp danh sách chơi (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7687,39 +7700,39 @@ Vẻ ngoài đã chọn không thể được nạp. - + OpenGL Direct Rendering Trực tiếp OpenGL Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit Xác nhận thoát - + A deck is currently playing. Exit Mixxx? Một sân hiện đang phát. Thoát khỏi Mixxx? - + A sampler is currently playing. Exit Mixxx? Một sampler hiện đang phát. Thoát khỏi Mixxx? - + The preferences window is still open. Cửa sổ tùy chọn là vẫn còn mở. - + Discard any changes and exit Mixxx? Loại bỏ bất kỳ thay đổi và thoát Mixxx? @@ -7798,7 +7811,7 @@ - + Playlists Danh sách phát @@ -7808,27 +7821,27 @@ Mở khóa - + Playlists are ordered lists of songs that allow you to plan your DJ sets. Danh sách được sắp xếp danh sách các bài hát mà cho phép bạn để lên kế hoạch của bạn bộ DJ. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. Một số DJ xây dựng danh sách phát trước khi họ thực hiện trực tiếp, nhưng những người khác muốn xây dựng họ on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. Khi sử dụng một danh sách trong bộ DJ sống, hãy nhớ luôn luôn chú ý chặt chẽ đến như thế nào đối tượng của bạn phản ứng với âm nhạc bạn đã chọn để chơi. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. Nó có thể là cần thiết để bỏ qua một số bài hát trong danh sách chuẩn bị của bạn hoặc thêm một số bài hát khác nhau để duy trì năng lượng của đối tượng của bạn. - + Create New Playlist Tạo danh sách chơi mới @@ -9296,7 +9309,7 @@ - + History Lịch sử @@ -9311,22 +9324,22 @@ Khóa - + The history section automatically keeps a list of tracks you play in your DJ sets. Phần lịch sử tự động giữ một danh sách các bài hát bạn chơi trong bộ DJ của bạn. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. Điều này thuận tiện cho ghi nhớ những gì đã làm việc trong bộ DJ của bạn, gửi bài tập, danh sách, hoặc báo cáo kịch của bạn đến cấp giấy phép tổ chức. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. Mỗi khi bạn bắt đầu Mixxx, một phần lịch sử mới được tạo ra. Bạn có thể xuất khẩu nó như là một danh sách bài hát ở định dạng khác nhau hoặc chơi nó một lần nữa với Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". Bạn có thể tham gia phiên lịch sử hiện tại với một một trước đó bằng cách nhấp chuột phải và chọn "Tham gia với trước". @@ -9516,23 +9529,23 @@ SoundManager - - + + a device một thiết bị - + An unknown error occurred Lỗi không biết xảy ra - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11716,12 +11729,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12518,68 +12531,68 @@ ESC - + Remove Loại bỏ - + Remove from Playlist - + Remove from Crate - + Hide from Library Ẩn từ thư viện - + Unhide from Library Bỏ ẩn từ thư viện - + Purge from Library Xoá khỏi thư viện - + Properties Thuộc tính - + Open in File Browser Mở trong trình duyệt tập tin - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist Tạo danh sách chơi mới - + Create New Crate Tạo mới thùng - + Enter name for new playlist: Nhập tên cho danh sách phát mới: @@ -12609,144 +12622,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck Xem trước sàn - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues Hotcues - + Loop - + ReplayGain - + Waveform - + All Tất cả - + Deck %1 Sàn %1 - + New Playlist Danh sách chơi mới - - - + + + Playlist Creation Failed Sáng tạo danh sách phát đã thất bại - + A playlist by that name already exists. Một danh sách tên đó đã tồn tại. - + A playlist cannot have a blank name. Một danh sách không thể có một tên trống. - + An unknown error occurred while creating playlist: Lỗi không biết xảy ra trong khi tạo danh sách chơi: - + Lock BPM Khóa BPM - + Unlock BPM Mở khóa BPM - + Double BPM Đôi BPM - + Halve BPM Giảm một nửa BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_zh_CN.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_zh_CN.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_zh_CN.ts mixxx-2.2.4~dfsg/res/translations/mixxx_zh_CN.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_zh_CN.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_zh_CN.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ 自动 DJ - + Add Crate as Track Source 添加为音轨源的分类列表 @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist 新建播放列表 @@ -108,7 +108,7 @@ - + Create New Playlist 新建播放列表 @@ -154,82 +154,82 @@ 分析所有播放列表 - + Enter new name for playlist: 为播放列表设置新的名称: - + Duplicate Playlist 复制播放列表 - - + + Enter name for new playlist: 输入播放列表的新名称: - + Export Playlist 导出播放列表 - + Rename Playlist 重命名播放列表 - - + + Renaming Playlist Failed 重命名播放列表失败 - - - + + + A playlist by that name already exists. 使用该名称的播放列表已存在。 - - - + + + A playlist cannot have a blank name. 播放列表名称不能为空。 - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed 播放列表创建失败 - - + + An unknown error occurred while creating playlist: 创建播放列表时发生未知错误: - + M3U Playlist (*.m3u) M3U播放列表 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放列表(*.m3u);;M3U8 播放列表(*.m3u8);;PLS 播放列表(*.pls);;文本 CSV (*.csv);;可读文本(*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 无法加载音轨。 @@ -2766,7 +2766,7 @@ - + Lock 锁定 @@ -2791,7 +2791,7 @@ 自动 DJ 音轨源 - + Enter new name for crate: 输入分类列表的新名称: @@ -2809,38 +2809,38 @@ - + Export Crate 导出分类列表 - + Unlock 解锁 - + An unknown error occurred while creating crate: 在创建分类列表时发生未知错误: - + Rename Crate 重命名分类列表 - - + + Renaming Crate Failed 重命名分类列表失败 - + Crate Creation Failed 创建分类列表失败 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放列表(*.m3u);;M3U8 播放列表(*.m3u8);;PLS 播放列表(*.pls);;文本 CSV (*.csv);;可读文本(*.txt) @@ -2860,12 +2860,12 @@ 随心所欲管理音乐,就用分类列表! - + A crate cannot have a blank name. 分类列表名不能命名为空。 - + A crate by that name already exists. 已有相同分类列表名。 @@ -2884,50 +2884,50 @@ - + Enter name for new crate: 输入分类列表的新名称: - - + + Creating Crate Failed 创建分类列表失败 - + A crate cannot have a blank name. 分类列表名不能命名为空。 - - + + A crate by that name already exists. 已有相同分类列表名。 - - + + An unknown error occurred while creating crate: 在创建分类列表时发生未知错误: - + copy [noun] 复制 - + Duplicate Crate 复制分类列表 - - - + + + Duplicating Crate Failed 复制分类列表失败 @@ -5618,7 +5618,7 @@ DlgPrefRecord - + Choose recordings directory 选择录音目录 @@ -5835,113 +5835,113 @@ DlgPrefSound - + None - + %1 Hz %1 赫兹 - + Default (long delay) 默认(长延时) - + Experimental (no delay) 试验(无延时) - + Disabled (short delay) 禁用(短延时) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled 禁用 - + Enabled 已启用 - + Stereo 立体声 - + Mono 启用 - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. 已启用实时调度。 - + %1 ms %1 ms - + Configuration error 配置错误 @@ -6485,7 +6485,7 @@ Decks - + 碟机 @@ -7415,15 +7415,28 @@ LibraryFeature - + Import Playlist 导入播放列表 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放列表文件(*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7715,39 +7728,39 @@ 无法加载所选皮肤。 - + OpenGL Direct Rendering OpenGL 直接渲染 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit 确认退出 - + A deck is currently playing. Exit Mixxx? 有唱机正在播放。确定退出 Mixxx 吗? - + A sampler is currently playing. Exit Mixxx? 有采样器正在播放。确定退出 Mixxx 吗? - + The preferences window is still open. 首选项窗口尚未关闭。 - + Discard any changes and exit Mixxx? 取消所作更改并退出 Mixxx 吗? @@ -7826,7 +7839,7 @@ - + Playlists 播放列表 @@ -7836,27 +7849,27 @@ 解锁 - + Playlists are ordered lists of songs that allow you to plan your DJ sets. 播放列表允许您排列您的DJ歌曲。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些DJ在他们表演之前创建播放列表,但其他人更倾向于即兴表演。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 在在线 Dj 集中使用播放列表时,请时刻注意您的听众对所选音乐的反应。 - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. 您可能需要跳过(或添加)某些不同的歌曲,以便保持对听众的吸引力。 - + Create New Playlist 新建播放列表 @@ -9010,12 +9023,12 @@ Parametric Equalizer - + 参数式等化器 Param EQ - + 参数式EQ @@ -9150,7 +9163,7 @@ Phase - + 相位 @@ -9328,7 +9341,7 @@ - + History 历史 @@ -9343,22 +9356,22 @@ 锁定 - + The history section automatically keeps a list of tracks you play in your DJ sets. 历史记录部分将自动保存您在 Dj 碟机中播放的音轨列表。 - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. 这有助于记录您使用 Dj 唱机的工作、发布播放列表,或向许可机构报告您的播放操作。 - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. 每次启动 Mixxx 时,将会自动创建一个历史列表。您可以将其导出为不同格式的播放列表,或用自动 Dj 再次播放它。 - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". 您可以右键点击并选择“与前一项合并”来将当前历史列表与之前的列表合并。 @@ -9548,23 +9561,23 @@ SoundManager - - + + a device 一个设备 - + An unknown error occurred 发生了未知错误 - + Two outputs cannot share channels on "%1" 两个输出无法共享 %1 的通道 - + Error opening "%1" 无法打开 "%1" @@ -11748,12 +11761,12 @@ TrackCollection - + Hiding tracks 隐藏曲目 - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? 选定的曲目是在下面的 playlists:%1Hiding,他们将从这些播放列表中删除它们。要继续吗? @@ -12550,68 +12563,68 @@ ESC - + Remove 删除 - + Remove from Playlist - + Remove from Crate - + Hide from Library 在媒体库中隐藏 - + Unhide from Library 在媒体库中显示 - + Purge from Library 从媒体库中清除 - + Properties 属性 - + Open in File Browser 在文件管理器中打开 - + 4/3 BPM 4/3 BPM - + 3/2 BPM 3/2 BPM - - + + Create New Playlist 新建播放列表 - + Create New Crate 新建分类列表 - + Enter name for new playlist: 输入播放列表的新名称: @@ -12641,144 +12654,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags 导出文件属性 - + Preview Deck 预览碟机 - + BPM and Beatgrid 拍速和拍格 - + Play Count - + Cue Point 切点 - + Hotcues 即时切点 - + Loop 循环 - + ReplayGain 播放音量增益 - + Waveform 波形 - + All 全部 - + Deck %1 碟盘 %1 - + New Playlist 新建播放列表 - - - + + + Playlist Creation Failed 播放列表创建失败 - + A playlist by that name already exists. 使用该名称的播放列表已存在。 - + A playlist cannot have a blank name. 播放列表名称不能为空。 - + An unknown error occurred while creating playlist: 创建播放列表时发生未知错误: - + Lock BPM 拍速锁定 - + Unlock BPM 拍速解锁 - + Double BPM 拍速倍增 - + Halve BPM 拍速倍减 - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 采样 %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_zh-HK.ts mixxx-2.2.4~dfsg/res/translations/mixxx_zh-HK.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_zh-HK.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_zh-HK.ts 2020-05-15 21:26:10.000000000 +0000 @@ -35,7 +35,7 @@ 自動DJ - + Add Crate as Track Source @@ -102,7 +102,7 @@ BasePlaylistFeature - + New Playlist 新的播放清單 @@ -114,7 +114,7 @@ - + Create New Playlist 建立新的播放清單 @@ -163,85 +163,85 @@ 分析整個播放清單 - + Enter new name for playlist: - + Duplicate Playlist - - + + Enter name for new playlist: 輸入新播放清單名稱︰ - + Export Playlist - + Rename Playlist - - + + Renaming Playlist Failed - - - + + + A playlist by that name already exists. - - - + + + A playlist cannot have a blank name. - + _copy [noun] Appendix to default name when duplicating a playlist - - - - - - + + + + + + Playlist Creation Failed 播放清單創建失敗 - - + + An unknown error occurred while creating playlist: 建立播放清單時發生未知的錯誤︰ - + M3U Playlist (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -377,7 +377,7 @@ BaseTrackPlayerImpl - + Couldn't load track. @@ -2780,7 +2780,7 @@ - + Lock @@ -2806,7 +2806,7 @@ - + Enter new name for crate: @@ -2825,38 +2825,38 @@ - + Export Crate - + Unlock - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) @@ -2876,12 +2876,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2900,50 +2900,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5598,7 +5598,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5813,113 +5813,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7390,16 +7390,29 @@ LibraryFeature - + Import Playlist 輸入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7684,39 +7697,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7794,7 +7807,7 @@ - + Playlists @@ -7804,27 +7817,27 @@ - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist 建立新的播放清單 @@ -9289,7 +9302,7 @@ - + History @@ -9305,22 +9318,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9510,23 +9523,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11710,12 +11723,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12512,69 +12525,69 @@ - + Remove 移除 - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist 建立新的播放清單 - + Create New Crate - + Enter name for new playlist: 輸入新播放清單名稱︰ @@ -12606,146 +12619,146 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain - + Waveform - + All - + Deck %1 - + New Playlist 新的播放清單 - - - + + + Playlist Creation Failed 播放清單創建失敗 - + A playlist by that name already exists. - + A playlist cannot have a blank name. - + An unknown error occurred while creating playlist: 建立播放清單時發生未知的錯誤︰ - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_zh_TW.Big5.ts mixxx-2.2.4~dfsg/res/translations/mixxx_zh_TW.Big5.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_zh_TW.Big5.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_zh_TW.Big5.ts 2020-05-15 21:26:10.000000000 +0000 @@ -34,7 +34,7 @@ 自動DJ - + Add Crate as Track Source @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist 新播放清單 @@ -108,7 +108,7 @@ - + Create New Playlist 建立播放清單 @@ -154,82 +154,82 @@ 分析整個播放清單 - + Enter new name for playlist: 輸入播放清單的新名稱: - + Duplicate Playlist 複製播放清單 - - + + Enter name for new playlist: 輸入新播放清單的名稱: - + Export Playlist 匯出播放清單 - + Rename Playlist 重新命名播放清單 - - + + Renaming Playlist Failed 重新命名播放清單失敗 - - - + + + A playlist by that name already exists. 已存在該名稱的播放清單。 - - - + + + A playlist cannot have a blank name. 播放清單名稱不能為空白。 - + _copy [noun] Appendix to default name when duplicating a playlist _複製 - - - - - - + + + + + + Playlist Creation Failed 建立播放清單失敗 - - + + An unknown error occurred while creating playlist: 建立播放清單時發生了未知的錯誤: - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);;M3U8 播放清單 (*.m3u8);;PLS 播放清單 (*.pls);;文字 CSV (*.csv);;純文字 (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 無法載入音軌。 @@ -2766,7 +2766,7 @@ - + Lock 鎖定 @@ -2791,7 +2791,7 @@ 自動DJ音軌來源 - + Enter new name for crate: @@ -2809,38 +2809,38 @@ - + Export Crate - + Unlock 解鎖 - + An unknown error occurred while creating crate: - + Rename Crate - - + + Renaming Crate Failed - + Crate Creation Failed - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);;M3U8 播放清單 (*.m3u8);;PLS 播放清單 (*.pls);;文字 CSV (*.csv);;純文字 (*.txt) @@ -2860,12 +2860,12 @@ - + A crate cannot have a blank name. - + A crate by that name already exists. @@ -2884,50 +2884,50 @@ - + Enter name for new crate: - - + + Creating Crate Failed - + A crate cannot have a blank name. - - + + A crate by that name already exists. - - + + An unknown error occurred while creating crate: - + copy [noun] - + Duplicate Crate - - - + + + Duplicating Crate Failed @@ -5580,7 +5580,7 @@ DlgPrefRecord - + Choose recordings directory @@ -5795,113 +5795,113 @@ DlgPrefSound - + None - + %1 Hz - + Default (long delay) - + Experimental (no delay) - + Disabled (short delay) - + Soundcard Clock - + Network Clock - + Master output only - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled - + Enabled 啟用 - + Stereo - + Mono - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms - + Configuration error @@ -7372,15 +7372,28 @@ LibraryFeature - + Import Playlist 匯入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7665,39 +7678,39 @@ - + OpenGL Direct Rendering - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit - + A deck is currently playing. Exit Mixxx? - + A sampler is currently playing. Exit Mixxx? - + The preferences window is still open. - + Discard any changes and exit Mixxx? @@ -7774,7 +7787,7 @@ - + Playlists @@ -7784,27 +7797,27 @@ 解鎖 - + Playlists are ordered lists of songs that allow you to plan your DJ sets. - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. - + Create New Playlist 建立播放清單 @@ -9269,7 +9282,7 @@ - + History @@ -9284,22 +9297,22 @@ 鎖定 - + The history section automatically keeps a list of tracks you play in your DJ sets. - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". @@ -9489,23 +9502,23 @@ SoundManager - - + + a device - + An unknown error occurred - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11689,12 +11702,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12491,68 +12504,68 @@ - + Remove 移除 - + Remove from Playlist - + Remove from Crate - + Hide from Library - + Unhide from Library - + Purge from Library - + Properties - + Open in File Browser - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist 建立播放清單 - + Create New Crate - + Enter name for new playlist: 輸入新播放清單的名稱: @@ -12582,144 +12595,144 @@ - + Add to Auto DJ Queue (Bottom) - + Add to Auto DJ Queue (Top) - + Add to Auto DJ Queue (Replace) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck - + BPM and Beatgrid - + Play Count - + Cue Point - + Hotcues - + Loop - + ReplayGain 回放增益 - + Waveform - + All - + Deck %1 - + New Playlist 新播放清單 - - - + + + Playlist Creation Failed 建立播放清單失敗 - + A playlist by that name already exists. 已存在該名稱的播放清單。 - + A playlist cannot have a blank name. 播放清單名稱不能為空白。 - + An unknown error occurred while creating playlist: 建立播放清單時發生了未知的錯誤: - + Lock BPM - + Unlock BPM - + Double BPM - + Halve BPM - + 2/3 BPM - + 3/4 BPM - + Sampler %1 Binary files /tmp/tmpxGrHAi/RLXTtIWShl/mixxx-2.2.3~dfsg/res/translations/mixxx_zh_TW.qm and /tmp/tmpxGrHAi/VuF23WeBy_/mixxx-2.2.4~dfsg/res/translations/mixxx_zh_TW.qm differ diff -Nru mixxx-2.2.3~dfsg/res/translations/mixxx_zh_TW.ts mixxx-2.2.4~dfsg/res/translations/mixxx_zh_TW.ts --- mixxx-2.2.3~dfsg/res/translations/mixxx_zh_TW.ts 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/res/translations/mixxx_zh_TW.ts 2020-05-15 21:26:10.000000000 +0000 @@ -31,10 +31,10 @@ Auto DJ - 汽車 DJ + 自動DJ - + Add Crate as Track Source 加入唱片箱至音軌清單 @@ -97,7 +97,7 @@ BasePlaylistFeature - + New Playlist 新增播放清單 @@ -108,7 +108,7 @@ - + Create New Playlist 創建新的播放清單 @@ -154,82 +154,82 @@ 分析整個播放清單 - + Enter new name for playlist: 輸入新播放清單名稱︰ - + Duplicate Playlist 重複播放清單 - - + + Enter name for new playlist: 輸入新播放清單名稱︰ - + Export Playlist 將播放清單匯出 - + Rename Playlist 重新命名播放清單 - - + + Renaming Playlist Failed 重新命名播放清單失敗 - - - + + + A playlist by that name already exists. 已存在該名稱的播放清單。 - - - + + + A playlist cannot have a blank name. 播放清單不能有空白的名稱。 - + _copy [noun] Appendix to default name when duplicating a playlist _copy - - - - - - + + + + + + Playlist Creation Failed 播放清單創建失敗 - - + + An unknown error occurred while creating playlist: 創建播放清單時發生未知的錯誤︰ - + M3U Playlist (*.m3u) M3U 播放清單 (*.m3u) - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);PLS播放清單 (*.pls);文字 CSV (*.csv);;可讀的文本 (*.txt) @@ -365,7 +365,7 @@ BaseTrackPlayerImpl - + Couldn't load track. 無法載入追蹤記錄。 @@ -2766,7 +2766,7 @@ - + Lock @@ -2791,7 +2791,7 @@ 汽車 DJ 跟蹤源 - + Enter new name for crate: 輸入新的名稱為板條箱︰ @@ -2809,38 +2809,38 @@ - + Export Crate 出口箱 - + Unlock 解鎖 - + An unknown error occurred while creating crate: 創建箱時發生未知的錯誤︰ - + Rename Crate 重命名箱 - - + + Renaming Crate Failed 重命名失敗的板條箱 - + Crate Creation Failed 板條箱創建失敗 - + M3U Playlist (*.m3u);;M3U8 Playlist (*.m3u8);;PLS Playlist (*.pls);;Text CSV (*.csv);;Readable Text (*.txt) M3U 播放清單 (*.m3u);M3U8 播放清單 (*.m3u8);請播放清單 (*.pls);CSV (*.csv); 文本;可讀的文本 (*.txt) @@ -2860,12 +2860,12 @@ 板條箱讓你組織你的音樂,但是你會喜歡 ! - + A crate cannot have a blank name. 一箱不能有空白的名稱。 - + A crate by that name already exists. 一箱由該名稱已存在。 @@ -2884,50 +2884,50 @@ - + Enter name for new crate: 輸入新的音樂箱的名稱︰ - - + + Creating Crate Failed 音樂箱建立失敗 - + A crate cannot have a blank name. 音樂箱名稱不得空白。 - - + + A crate by that name already exists. 已經有相同名稱的音樂箱。 - - + + An unknown error occurred while creating crate: 創建音樂箱時發生未知的錯誤︰ - + copy [noun] 複製 - + Duplicate Crate 複製音樂箱 - - - + + + Duplicating Crate Failed 複製音樂箱失敗 @@ -5593,7 +5593,7 @@ DlgPrefRecord - + Choose recordings directory 選擇錄音目錄 @@ -5810,113 +5810,113 @@ DlgPrefSound - + None 沒有一個 - + %1 Hz %1 Hz - + Default (long delay) 預設 (長時間的延遲) - + Experimental (no delay) 實驗 (無延時) - + Disabled (short delay) 禁用 (短延時) - + Soundcard Clock - + Network Clock - + Master output only 只輸出主要聲道 - + Master and booth outputs - + Direct monitor (recording and broadcasting only) - + Disabled 已禁用 - + Enabled 啟用 - + Stereo 身歷聲 - + Mono 單聲道 - + Microphone inputs are out of time in the record & broadcast signal compared to what you hear. - + Measure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - - + + Refer to the Mixxx User Manual for details. 細節請參考Mixxx 使用者操作手冊 - + Configured latency has changed. - + Remeasure round trip latency and enter it above for Microphone Latency Compensation to align microphone timing. - + Realtime scheduling is enabled. - + %1 ms %1 ms - + Configuration error 配置錯誤 @@ -7389,15 +7389,28 @@ LibraryFeature - + Import Playlist 匯入播放清單 - + Playlist Files (*.m3u *.m3u8 *.pls *.csv) 播放清單檔 (*.m3u *.m3u8 *.pls *.csv) + + + Overwrite File? + + + + + A playlist file with the name "%1" already exists. +The default "m3u" extension was added because none was specified. + +Do you really want to overwrite it? + + LibraryScannerDlg @@ -7688,39 +7701,39 @@ 無法載入所選的外觀。 - + OpenGL Direct Rendering OpenGL 直接繪製 - + Direct rendering is not enabled on your machine.<br><br>This means that the waveform displays will be very<br><b>slow and may tax your CPU heavily</b>. Either update your<br>configuration to enable direct rendering, or disable<br>the waveform displays in the Mixxx preferences by selecting<br>"Empty" as the waveform display in the 'Interface' section. - - - + + + Confirm Exit 確認退出 - + A deck is currently playing. Exit Mixxx? 當前現正播放的甲板。退出 Mixxx 嗎? - + A sampler is currently playing. Exit Mixxx? 當前現正播放採樣器。退出 Mixxx 嗎? - + The preferences window is still open. 首選項視窗是仍處於打開狀態。 - + Discard any changes and exit Mixxx? 放棄所有更改並退出 Mixxx? @@ -7797,7 +7810,7 @@ - + Playlists 播放清單 @@ -7807,27 +7820,27 @@ 解鎖 - + Playlists are ordered lists of songs that allow you to plan your DJ sets. 播放清單的排序清單允許您計畫您的 dj 的歌曲。 - + Some DJs construct playlists before they perform live, but others prefer to build them on-the-fly. 一些 Dj 構建播放清單之前他們表演,但其他人則傾向建立他們的蒼蠅。 - + When using a playlist during a live DJ set, remember to always pay close attention to how your audience reacts to the music you've chosen to play. 當在一個活的 DJ 集,使用播放清單記得總是密切關注你的聽眾對音樂的反應您已經選擇玩。 - + It may be necessary to skip some songs in your prepared playlist or add some different songs in order to maintain the energy of your audience. 它可能需要跳過一些你準備播放清單中的歌曲或添加一些不同的歌曲,以保持你的聽眾的精力。 - + Create New Playlist 創建新的播放清單 @@ -9295,7 +9308,7 @@ - + History 歷史 @@ -9310,22 +9323,22 @@ - + The history section automatically keeps a list of tracks you play in your DJ sets. 歷史部分自動保留軌道你玩你的 dj 在的清單。 - + This is handy for remembering what worked in your DJ sets, posting set-lists, or reporting your plays to licensing organizations. 這是便於記憶所做的工作您的 dj、 過帳設置清單,或向許可證組織彙報你的劇本。 - + Every time you start Mixxx, a new history section is created. You can export it as a playlist in various formats or play it again with Auto DJ. 每次你啟動 Mixxx,創建一個新的歷史截面。您可以將其匯出為各種格式的播放清單或再次玩汽車 DJ。 - + You can join the current history session with a previous one by right-clicking and selecting "Join with previous". 你可以加入當前歷史會話和前一個按右鍵並選擇"與以前加入"。 @@ -9515,23 +9528,23 @@ SoundManager - - + + a device 設備 - + An unknown error occurred 出現未知的錯誤 - + Two outputs cannot share channels on "%1" - + Error opening "%1" @@ -11715,12 +11728,12 @@ TrackCollection - + Hiding tracks - + The selected tracks are in the following playlists:%1Hiding them will remove them from these playlists. Continue? @@ -12517,68 +12530,68 @@ 按 ESC 鍵 - + Remove 刪除 - + Remove from Playlist - + Remove from Crate - + Hide from Library 隱藏從庫 - + Unhide from Library 從圖書館取消隱藏 - + Purge from Library 從庫中清除 - + Properties 屬性 - + Open in File Browser 在檔瀏覽器中打開 - + 4/3 BPM - + 3/2 BPM - - + + Create New Playlist 創建新的播放清單 - + Create New Crate 創建新的板條箱 - + Enter name for new playlist: 輸入新播放清單名稱︰ @@ -12608,144 +12621,144 @@ 更改 BPM - + Add to Auto DJ Queue (Bottom) 添加到自動 DJ 佇列 (底部) - + Add to Auto DJ Queue (Top) 添加到自動 DJ 佇列 (頂部) - + Add to Auto DJ Queue (Replace) 添加到自動 DJ 佇列 (底部) - + Import From File Tags - + Import From MusicBrainz - + Export To File Tags - + Preview Deck 預覽甲板 - + BPM and Beatgrid - + Play Count 播放計數 - + Cue Point 播放點 - + Hotcues Hotcues - + Loop 循環 - + ReplayGain 重播增益 - + Waveform 波形 - + All 所有 - + Deck %1 甲板 %1 - + New Playlist 新的播放清單 - - - + + + Playlist Creation Failed 播放清單創建失敗 - + A playlist by that name already exists. 已存在該名稱的播放清單。 - + A playlist cannot have a blank name. 播放清單不能有空白的名稱。 - + An unknown error occurred while creating playlist: 創建播放清單時發生未知的錯誤︰ - + Lock BPM BPM 鎖 - + Unlock BPM 解鎖 BPM - + Double BPM 雙 BPM - + Halve BPM 減半 BPM - + 2/3 BPM 2/3 BPM - + 3/4 BPM 3/4 BPM - + Sampler %1 採樣器 %1 diff -Nru mixxx-2.2.3~dfsg/script/.eslintrc.json mixxx-2.2.4~dfsg/script/.eslintrc.json --- mixxx-2.2.3~dfsg/script/.eslintrc.json 1970-01-01 00:00:00.000000000 +0000 +++ mixxx-2.2.4~dfsg/script/.eslintrc.json 2020-05-15 21:26:10.000000000 +0000 @@ -0,0 +1,7 @@ +{ + "globals": { + "__extension__": "readonly", + "__setupPackage__": "readonly", + "__postInit__": "readonly" + } +} diff -Nru mixxx-2.2.3~dfsg/src/controllers/midi/midicontroller.cpp mixxx-2.2.4~dfsg/src/controllers/midi/midicontroller.cpp --- mixxx-2.2.3~dfsg/src/controllers/midi/midicontroller.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/controllers/midi/midicontroller.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -203,6 +203,16 @@ unsigned char channel = MidiUtils::channelFromStatus(status); unsigned char opCode = MidiUtils::opCodeFromStatus(status); + // Ignore MIDI beat clock messages (0xF8) until we have proper MIDI sync in + // Mixxx. These messages are not suitable to use in JS anyway, as they are + // sent at 24 ppqn (i.e. one message every 20.83 ms for a 120 BPM track) + // and require real-time code. Currently, they are only spam on the + // console, inhibit the screen saver unintentionally, could potentially + // slow down Mixxx or interfere with the learning wizard. + if (status == 0xF8) { + return; + } + controllerDebug(MidiUtils::formatMidiMessage(getName(), status, control, value, channel, opCode, timestamp)); MidiKey mappingKey(status, control); diff -Nru mixxx-2.2.3~dfsg/src/defs_version.h mixxx-2.2.4~dfsg/src/defs_version.h --- mixxx-2.2.3~dfsg/src/defs_version.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/defs_version.h 2020-05-15 21:26:10.000000000 +0000 @@ -54,5 +54,5 @@ // READ ABOVE CAREFULLY BEFORE CHANGING! // USE 3 DIGITS VERSION ONLY /!\ _ - #define MIXXX_VERSION "2.2.3" + #define MIXXX_VERSION "2.2.4" #endif diff -Nru mixxx-2.2.3~dfsg/src/dialog/dlgabout.cpp mixxx-2.2.4~dfsg/src/dialog/dlgabout.cpp --- mixxx-2.2.3~dfsg/src/dialog/dlgabout.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/dialog/dlgabout.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -48,7 +48,9 @@ << "Nicu Badescu" << "Uwe Klotz" << "Be" - << "Sébastien Blaisot"; + << "Sébastien Blaisot" + << "ronso0" + << "Jan Holthuis"; // This list should contains all contributors committed // code to the Mixxx core within the past two years. @@ -74,6 +76,7 @@ << "Kilian Feess" << "Conner Phillips" << "Daniel Poelzleithner" + << "Stéphane Lepin" << "Artyom Lyan" << "Johan Lasperas" << "Olaf Hering" @@ -82,7 +85,6 @@ << "Kshitij Gupta" << "Thomas Jarosch" << "Matthew Nicholson" - << "ronso0" << "Jamie Gifford" << "luzpaz" << "Sebastian Reuße" @@ -90,7 +92,8 @@ << "beenisss" << "Bernd Binder" << "Nikolaus Einhauser" - << "Philip Gottschling"; + << "Philip Gottschling" + << "Cristiano Lacerda"; QStringList specialThanks; specialThanks diff -Nru mixxx-2.2.3~dfsg/src/engine/enginedeck.cpp mixxx-2.2.4~dfsg/src/engine/enginedeck.cpp --- mixxx-2.2.3~dfsg/src/engine/enginedeck.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginedeck.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -44,8 +44,13 @@ m_bPassthroughIsActive = false; m_bPassthroughWasActive = false; + // Ensure that input is configured before enabling passthrough + m_pPassing->connectValueChangeRequest( + this, SLOT(slotPassthroughChangeRequest(double)), + Qt::DirectConnection); + // Set up passthrough toggle button - connect(m_pPassing, SIGNAL(valueChanged(double)), + connect(m_pPassing, SIGNAL(valueChangedFromEngine(double)), this, SLOT(slotPassingToggle(double)), Qt::DirectConnection); @@ -163,3 +168,11 @@ void EngineDeck::slotPassingToggle(double v) { m_bPassthroughIsActive = v > 0; } + +void EngineDeck::slotPassthroughChangeRequest(double v) { + if (v <= 0 || m_pInputConfigured->get() > 0) { + m_pPassing->setAndConfirm(v); + } else { + emit noPassthroughInputConfigured(); + } +} diff -Nru mixxx-2.2.3~dfsg/src/engine/enginedeck.h mixxx-2.2.4~dfsg/src/engine/enginedeck.h --- mixxx-2.2.3~dfsg/src/engine/enginedeck.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginedeck.h 2020-05-15 21:26:10.000000000 +0000 @@ -73,8 +73,12 @@ // Return whether or not passthrough is active bool isPassthroughActive() const; + signals: + void noPassthroughInputConfigured(); + public slots: void slotPassingToggle(double v); + void slotPassthroughChangeRequest(double v); private: UserSettingsPointer m_pConfig; diff -Nru mixxx-2.2.3~dfsg/src/engine/enginemaster.cpp mixxx-2.2.4~dfsg/src/engine/enginemaster.cpp --- mixxx-2.2.3~dfsg/src/engine/enginemaster.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginemaster.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -153,7 +153,9 @@ } // Starts a thread for recording and broadcast - m_pEngineSideChain = bEnableSidechain ? new EngineSideChain(pConfig) : NULL; + m_pEngineSideChain = + bEnableSidechain ? + new EngineSideChain(pConfig, m_pSidechainMix) : nullptr; // X-Fader Setup m_pXFaderMode = new ControlPushButton( @@ -464,11 +466,20 @@ m_pTalkover, m_iBufferSize, m_iSampleRate, busFeatures); - - // Clear talkover compressor for the next round of gain calculation. - m_pTalkoverDucking->clearKeys(); - if (m_pTalkoverDucking->getMode() != EngineTalkoverDucking::OFF) { + switch (m_pTalkoverDucking->getMode()) { + case EngineTalkoverDucking::OFF: + m_pTalkoverDucking->setAboveThreshold(false); + break; + case EngineTalkoverDucking::AUTO: m_pTalkoverDucking->processKey(m_pTalkover, m_iBufferSize); + break; + case EngineTalkoverDucking::MANUAL: + m_pTalkoverDucking->setAboveThreshold(m_activeTalkoverChannels.size()); + break; + default: + DEBUG_ASSERT("!Unknown Ducking mode"); + m_pTalkoverDucking->setAboveThreshold(false); + break; } // Calculate the crossfader gains for left and right side of the crossfader @@ -562,7 +573,7 @@ m_masterGainOld = master_gain; // Record/broadcast signal is the same as the master output - if (!m_bExternalRecordBroadcastInputConnected) { + if (sidechainMixRequired()) { SampleUtil::copy(m_pSidechainMix, m_pMaster, m_iBufferSize); } } else if (configuredMicMonitorMode == MicMonitorMode::MASTER_AND_BOOTH) { @@ -599,7 +610,7 @@ m_masterGainOld = master_gain; // Record/broadcast signal is the same as the master output - if (!m_bExternalRecordBroadcastInputConnected) { + if (sidechainMixRequired()) { SampleUtil::copy(m_pSidechainMix, m_pMaster, m_iBufferSize); } } else if (configuredMicMonitorMode == MicMonitorMode::DIRECT_MONITOR) { @@ -632,41 +643,42 @@ SampleUtil::applyRampingGain(m_pMaster, m_masterGainOld, master_gain, m_iBufferSize); m_masterGainOld = master_gain; - if (!m_bExternalRecordBroadcastInputConnected) { + if (sidechainMixRequired()) { SampleUtil::copy(m_pSidechainMix, m_pMaster, m_iBufferSize); - } - // The talkover signal Mixxx receives is delayed by the round trip latency. - // There is an output latency between the time Mixxx processes the audio - // and the user hears it. So if the microphone user plays on beat with - // what they hear, they will be playing out of sync with the engine's - // processing by the output latency. Additionally, Mixxx gets input signals - // delayed by the input latency. By the time Mixxx receives the input signal, - // a full round trip through the signal chain has elapsed since Mixxx - // processed the output signal. - // Although Mixxx receives the input signal delayed, the user hears it mixed - // in hardware with the master & booth outputs without that - // latency, so to record/broadcast the same signal that is heard - // on the master & booth outputs, the master mix must be delayed before - // mixing the talkover signal for the record/broadcast mix. - // If not using microphone inputs or recording/broadcasting from - // a sound card input, skip unnecessary processing here. - if (m_pNumMicsConfigured->get() > 0 - && !m_bExternalRecordBroadcastInputConnected) { - // Copy the master mix to a separate buffer before delaying it - // to avoid delaying the master output. - m_pLatencyCompensationDelay->process(m_pSidechainMix, m_iBufferSize); - SampleUtil::add(m_pSidechainMix, m_pTalkover, m_iBufferSize); + if (m_pNumMicsConfigured->get() > 0) { + // The talkover signal Mixxx receives is delayed by the round trip latency. + // There is an output latency between the time Mixxx processes the audio + // and the user hears it. So if the microphone user plays on beat with + // what they hear, they will be playing out of sync with the engine's + // processing by the output latency. Additionally, Mixxx gets input signals + // delayed by the input latency. By the time Mixxx receives the input signal, + // a full round trip through the signal chain has elapsed since Mixxx + // processed the output signal. + // Although Mixxx receives the input signal delayed, the user hears it mixed + // in hardware with the master & booth outputs without that + // latency, so to record/broadcast the same signal that is heard + // on the master & booth outputs, the master mix must be delayed before + // mixing the talkover signal for the record/broadcast mix. + // If not using microphone inputs or recording/broadcasting from + // a sound card input, skip unnecessary processing here. + + // Copy the master mix to a separate buffer before delaying it + // to avoid delaying the master output. + m_pLatencyCompensationDelay->process(m_pSidechainMix, m_iBufferSize); + SampleUtil::add(m_pSidechainMix, m_pTalkover, m_iBufferSize); + } } } - // Submit buffer to the side chain to do broadcasting, recording, - // etc. (CPU intensive non-realtime tasks) - // If recording/broadcasting from a sound card input, - // SoundManager will send the input buffer from the sound card to m_pSidechain - // so skip sending a buffer to m_pSidechain here. - if (!m_bExternalRecordBroadcastInputConnected - && m_pEngineSideChain != nullptr) { + // Submit buffer to the side chain to do CPU intensive non-realtime + // tasks like recording. The SoundDeviceNetwork, responsible for + // passing samples to the network reads directly from m_pSidechainMix, + // registering it with SoundDevice::addOutput(). + // Note: In case the broadcast/recording input is configured, + // EngineSideChain::receiveBuffer has copied the input buffer to m_pSidechainMix + // via before (called by SoundManager::pushInputBuffers()) + if (m_pEngineSideChain) { m_pEngineSideChain->writeSamples(m_pSidechainMix, iFrames); } @@ -963,3 +975,7 @@ } pSoundManager->registerOutput(AudioOutput(AudioOutput::RECORD_BROADCAST, 0, 2), this); } + +bool EngineMaster::sidechainMixRequired() const { + return m_pEngineSideChain && !m_bExternalRecordBroadcastInputConnected; +} diff -Nru mixxx-2.2.3~dfsg/src/engine/enginemaster.h mixxx-2.2.4~dfsg/src/engine/enginemaster.h --- mixxx-2.2.3~dfsg/src/engine/enginemaster.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginemaster.h 2020-05-15 21:26:10.000000000 +0000 @@ -273,6 +273,7 @@ ChannelHandleFactory* m_pChannelHandleFactory; void applyMasterEffects(); void processHeadphones(const double masterMixGainInHeadphones); + bool sidechainMixRequired() const; EngineEffectsManager* m_pEngineEffectsManager; diff -Nru mixxx-2.2.3~dfsg/src/engine/enginesidechaincompressor.cpp mixxx-2.2.4~dfsg/src/engine/enginesidechaincompressor.cpp --- mixxx-2.2.3~dfsg/src/engine/enginesidechaincompressor.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginesidechaincompressor.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -3,10 +3,10 @@ #include "engine/enginesidechaincompressor.h" EngineSideChainCompressor::EngineSideChainCompressor(const char* group) - : m_compressRatio(0.0), + : m_compressRatio(1.0), m_bAboveThreshold(false), m_threshold(1.0), - m_strength(0.0), + m_strength(1.0), m_attackTime(0), m_decayTime(0), m_attackPerFrame(0.0), @@ -38,11 +38,12 @@ << "decay per frame: " << m_decayPerFrame; } -void EngineSideChainCompressor::clearKeys() { - m_bAboveThreshold = false; +void EngineSideChainCompressor::setAboveThreshold(bool value) { + m_bAboveThreshold = value; } void EngineSideChainCompressor::processKey(const CSAMPLE* pIn, const int iBufferSize) { + m_bAboveThreshold = false; for (int i = 0; i + 1 < iBufferSize; i += 2) { CSAMPLE val = (pIn[i] + pIn[i + 1]) / 2; if (val > m_threshold) { @@ -54,28 +55,27 @@ double EngineSideChainCompressor::calculateCompressedGain(int frames) { if (m_bAboveThreshold) { - if (m_compressRatio < m_strength) { - m_compressRatio += m_attackPerFrame * frames; - if (m_compressRatio > m_strength) { + if (m_compressRatio > m_strength) { + m_compressRatio -= m_attackPerFrame * frames; + if (m_compressRatio < m_strength) { // If we overshot, clamp. m_compressRatio = m_strength; } - } else if (m_compressRatio > m_strength) { + } else if (m_compressRatio < m_strength) { // If the strength param was changed, we might be compressing too much. - m_compressRatio -= m_decayPerFrame * frames; + m_compressRatio += m_decayPerFrame * frames; } } else { - if (m_compressRatio > 0) { - m_compressRatio -= m_decayPerFrame * frames; - if (m_compressRatio < 0) { + VERIFY_OR_DEBUG_ASSERT(m_compressRatio >= 0) { + qWarning() << "Programming error, below-zero compression detected."; + } + if (m_compressRatio < 1) { + m_compressRatio += m_decayPerFrame * frames; + if (m_compressRatio > 1) { // If we overshot, clamp. - m_compressRatio = 0; + m_compressRatio = 1; } - } else if (m_compressRatio < 0) { - // Complain loudly. - qWarning() << "Programming error, below-zero compression detected."; - m_compressRatio += m_attackPerFrame * frames; } } - return (1. - m_compressRatio); + return m_compressRatio; } diff -Nru mixxx-2.2.3~dfsg/src/engine/enginesidechaincompressor.h mixxx-2.2.4~dfsg/src/engine/enginesidechaincompressor.h --- mixxx-2.2.3~dfsg/src/engine/enginesidechaincompressor.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginesidechaincompressor.h 2020-05-15 21:26:10.000000000 +0000 @@ -40,10 +40,8 @@ calculateRates(); } - - // Before calling processKey on multiple channels, first call clearKeys to - // clear state from the last round of compressor gain calculation. - void clearKeys(); + /// Forces the above threshold flag to the given value without calculations + void setAboveThreshold(bool value); // Every loop, before calling process, first call processKey to feed // the compressor the input key signal. It is safe to call this function diff -Nru mixxx-2.2.3~dfsg/src/engine/enginetalkoverducking.cpp mixxx-2.2.4~dfsg/src/engine/enginetalkoverducking.cpp --- mixxx-2.2.3~dfsg/src/engine/enginetalkoverducking.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/enginetalkoverducking.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -67,13 +67,13 @@ CSAMPLE EngineTalkoverDucking::getGain(int numFrames) { // Apply microphone ducking. switch (getMode()) { - case EngineTalkoverDucking::OFF: + case EngineTalkoverDucking::OFF: return 1.0; - case EngineTalkoverDucking::AUTO: + case EngineTalkoverDucking::AUTO: + case EngineTalkoverDucking::MANUAL: return calculateCompressedGain(numFrames); - case EngineTalkoverDucking::MANUAL: - return m_pDuckStrength->get(); + default: + DEBUG_ASSERT("!Unknown Ducking mode"); + return 1.0; } - qWarning() << "Invalid ducking mode, returning 1.0"; - return 1.0; } diff -Nru mixxx-2.2.3~dfsg/src/engine/sidechain/enginesidechain.cpp mixxx-2.2.4~dfsg/src/engine/sidechain/enginesidechain.cpp --- mixxx-2.2.3~dfsg/src/engine/sidechain/enginesidechain.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/sidechain/enginesidechain.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -28,6 +28,7 @@ #include #include "engine/sidechain/sidechainworker.h" +#include "engine/engine.h" #include "util/counter.h" #include "util/event.h" #include "util/sample.h" @@ -36,11 +37,14 @@ #define SIDECHAIN_BUFFER_SIZE 65536 -EngineSideChain::EngineSideChain(UserSettingsPointer pConfig) +EngineSideChain::EngineSideChain( + UserSettingsPointer pConfig, + CSAMPLE* sidechainMix) : m_pConfig(pConfig), m_bStopThread(false), m_sampleFifo(SIDECHAIN_BUFFER_SIZE), - m_pWorkBuffer(SampleUtil::alloc(SIDECHAIN_BUFFER_SIZE)) { + m_pWorkBuffer(SampleUtil::alloc(SIDECHAIN_BUFFER_SIZE)), + m_pSidechainMix(sidechainMix) { // We use HighPriority to prevent starvation by lower-priority processes (Qt // main thread, analysis, etc.). This used to be LowPriority but that is not // a suitable choice since we do semi-realtime tasks @@ -78,11 +82,13 @@ void EngineSideChain::receiveBuffer(AudioInput input, const CSAMPLE* pBuffer, unsigned int iFrames) { - if (input.getType() != AudioInput::RECORD_BROADCAST) { + VERIFY_OR_DEBUG_ASSERT(input.getType() == AudioInput::RECORD_BROADCAST) { qDebug() << "WARNING: AudioInput type is not RECORD_BROADCAST. Ignoring incoming buffer."; return; } - writeSamples(pBuffer, iFrames); + // Just copy the received samples form the sound card input to the + // engine. After processing we get it back via writeSamples() + SampleUtil::copy(m_pSidechainMix, pBuffer, iFrames * mixxx::kEngineChannelCount); } void EngineSideChain::writeSamples(const CSAMPLE* pBuffer, int iFrames) { diff -Nru mixxx-2.2.3~dfsg/src/engine/sidechain/enginesidechain.h mixxx-2.2.4~dfsg/src/engine/sidechain/enginesidechain.h --- mixxx-2.2.3~dfsg/src/engine/sidechain/enginesidechain.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/engine/sidechain/enginesidechain.h 2020-05-15 21:26:10.000000000 +0000 @@ -32,7 +32,7 @@ class EngineSideChain : public QThread, public AudioDestination { Q_OBJECT public: - EngineSideChain(UserSettingsPointer pConfig); + EngineSideChain(UserSettingsPointer pConfig, CSAMPLE* sidechainMix); virtual ~EngineSideChain(); // Not thread-safe, wait-free. Submit buffer of samples to the sidechain for @@ -58,6 +58,7 @@ FIFO m_sampleFifo; CSAMPLE* m_pWorkBuffer; + CSAMPLE* m_pSidechainMix; // Provides thread safety around the wait condition below. QMutex m_waitLock; diff -Nru mixxx-2.2.3~dfsg/src/library/autodj/autodjprocessor.cpp mixxx-2.2.4~dfsg/src/library/autodj/autodjprocessor.cpp --- mixxx-2.2.3~dfsg/src/library/autodj/autodjprocessor.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/autodj/autodjprocessor.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -234,6 +234,18 @@ } else if (!rightDeck.isPlaying()) { removeLoadedTrackFromTopOfQueue(rightDeck); loadNextTrackFromQueue(rightDeck); + } else { + // If both decks are playing remove next track in playlist + TrackId nextId = m_pAutoDJTableModel->getTrackId(m_pAutoDJTableModel->index(0, 0)); + TrackId leftId = leftDeck.getLoadedTrack()->getId(); + TrackId rightId = rightDeck.getLoadedTrack()->getId(); + if (nextId == leftId || nextId == rightId) { + // One of the playing tracks is still on top of playlist, remove second item + m_pAutoDJTableModel->removeTrack(m_pAutoDJTableModel->index(1, 0)); + } else { + m_pAutoDJTableModel->removeTrack(m_pAutoDJTableModel->index(0, 0)); + } + maybeFillRandomTracks(); } return ADJ_OK; } @@ -668,7 +680,11 @@ m_pAutoDJTableModel->appendTrack(nextId); } - // Fill random tracks if configured + maybeFillRandomTracks(); + return true; +} + +void AutoDJProcessor::maybeFillRandomTracks() { int minAutoDJCrateTracks = m_pConfig->getValueString( ConfigKey(kConfigKey, "RandomQueueMinimumAllowed")).toInt(); bool randomQueueEnabled = (((m_pConfig->getValueString( @@ -679,8 +695,6 @@ qDebug() << "Randomly adding tracks"; emit(randomTrackRequested(tracksToAdd)); } - - return true; } void AutoDJProcessor::playerPlayChanged(DeckAttributes* pAttributes, bool playing) { diff -Nru mixxx-2.2.3~dfsg/src/library/autodj/autodjprocessor.h mixxx-2.2.4~dfsg/src/library/autodj/autodjprocessor.h --- mixxx-2.2.3~dfsg/src/library/autodj/autodjprocessor.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/autodj/autodjprocessor.h 2020-05-15 21:26:10.000000000 +0000 @@ -191,7 +191,7 @@ // Removes the provided track from the top of the AutoDJ queue if it is // present. bool removeTrackFromTopOfQueue(TrackPointer pTrack); - + void maybeFillRandomTracks(); UserSettingsPointer m_pConfig; PlayerManagerInterface* m_pPlayerManager; PlaylistTableModel* m_pAutoDJTableModel; diff -Nru mixxx-2.2.3~dfsg/src/library/baseplaylistfeature.cpp mixxx-2.2.4~dfsg/src/library/baseplaylistfeature.cpp --- mixxx-2.2.3~dfsg/src/library/baseplaylistfeature.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/baseplaylistfeature.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -74,29 +74,45 @@ this, SLOT(slotExportTrackFiles())); m_pAnalyzePlaylistAction = new QAction(tr("Analyze entire Playlist"), this); - connect(m_pAnalyzePlaylistAction, SIGNAL(triggered()), - this, SLOT(slotAnalyzePlaylist())); - - connect(&m_playlistDao, SIGNAL(added(int)), - this, SLOT(slotPlaylistTableChanged(int))); - - connect(&m_playlistDao, SIGNAL(deleted(int)), - this, SLOT(slotPlaylistTableChanged(int))); - - connect(&m_playlistDao, SIGNAL(renamed(int,QString)), - this, SLOT(slotPlaylistTableRenamed(int,QString))); - - connect(&m_playlistDao, SIGNAL(changed(int)), - this, SLOT(slotPlaylistContentChanged(int))); - - connect(&m_playlistDao, SIGNAL(lockChanged(int)), - this, SLOT(slotPlaylistTableChanged(int))); + connect(m_pAnalyzePlaylistAction, + &QAction::triggered, + this, + &BasePlaylistFeature::slotAnalyzePlaylist); + + connect(&m_playlistDao, + &PlaylistDAO::added, + this, + &BasePlaylistFeature::slotPlaylistTableChanged); + + connect(&m_playlistDao, + &PlaylistDAO::deleted, + this, + &BasePlaylistFeature::slotPlaylistTableChanged); + + connect(&m_playlistDao, + &PlaylistDAO::renamed, + this, + &BasePlaylistFeature::slotPlaylistTableRenamed); + + connect(&m_playlistDao, + &PlaylistDAO::tracksChanged, + this, + &BasePlaylistFeature::slotPlaylistContentChanged); + + connect(&m_playlistDao, + &PlaylistDAO::lockChanged, + this, + &BasePlaylistFeature::slotPlaylistTableChanged); Library* pLibrary = static_cast(parent); - connect(pLibrary, SIGNAL(trackSelected(TrackPointer)), - this, SLOT(slotTrackSelected(TrackPointer))); - connect(pLibrary, SIGNAL(switchToView(const QString&)), - this, SLOT(slotResetSelectedTrack())); + connect(pLibrary, + &Library::trackSelected, + this, + &BasePlaylistFeature::slotTrackSelected); + connect(pLibrary, + &Library::switchToView, + this, + &BasePlaylistFeature::slotResetSelectedTrack); } BasePlaylistFeature::~BasePlaylistFeature() { @@ -470,15 +486,7 @@ if (file_location.isNull() || file_location.isEmpty()) { return; } - // Manually add extension due to bug in QFileDialog - // via https://bugreports.qt-project.org/browse/QTBUG-27186 - // Can be removed after switch to Qt5 QFileInfo fileName(file_location); - if (fileName.suffix().isNull() || fileName.suffix().isEmpty()) { - QString ext = filefilter.section(".",1,1); - ext.chop(1); - file_location.append(".").append(ext); - } // Update the import/export playlist directory m_pConfig->set(ConfigKey("[Library]","LastImportExportPlaylistDirectory"), ConfigValue(fileName.dir().absolutePath())); @@ -519,21 +527,10 @@ QModelIndex index = pPlaylistTableModel->index(i, 0); playlist_items << pPlaylistTableModel->getTrackLocation(index); } - - if (file_location.endsWith(".pls", Qt::CaseInsensitive)) { - ParserPls::writePLSFile(file_location, playlist_items, useRelativePath); - } else if (file_location.endsWith(".m3u8", Qt::CaseInsensitive)) { - ParserM3u::writeM3U8File(file_location, playlist_items, useRelativePath); - } else { - //default export to M3U if file extension is missing - if(!file_location.endsWith(".m3u", Qt::CaseInsensitive)) - { - qDebug() << "Crate export: No valid file extension specified. Appending .m3u " - << "and exporting to M3U."; - file_location.append(".m3u"); - } - ParserM3u::writeM3UFile(file_location, playlist_items, useRelativePath); - } + exportPlaylistItemsIntoFile( + file_location, + playlist_items, + useRelativePath); } } diff -Nru mixxx-2.2.3~dfsg/src/library/baseplaylistfeature.h mixxx-2.2.4~dfsg/src/library/baseplaylistfeature.h --- mixxx-2.2.3~dfsg/src/library/baseplaylistfeature.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/baseplaylistfeature.h 2020-05-15 21:26:10.000000000 +0000 @@ -47,8 +47,8 @@ virtual void htmlLinkClicked(const QUrl& link); virtual void slotPlaylistTableChanged(int playlistId) = 0; - virtual void slotPlaylistContentChanged(int playlistId) = 0; - virtual void slotPlaylistTableRenamed(int playlistId, QString a_strName) = 0; + virtual void slotPlaylistContentChanged(QSet playlistIds) = 0; + virtual void slotPlaylistTableRenamed(int playlistId, QString newName) = 0; void slotCreatePlaylist(); protected slots: diff -Nru mixxx-2.2.3~dfsg/src/library/crate/cratefeature.cpp mixxx-2.2.4~dfsg/src/library/crate/cratefeature.cpp --- mixxx-2.2.3~dfsg/src/library/crate/cratefeature.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/crate/cratefeature.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -371,34 +371,36 @@ if (readLastRightClickedCrate(&crate)) { const QString oldName = crate.getName(); crate.resetName(); - while (!crate.hasName()) { + for (;;) { bool ok = false; - crate.parseName( + auto newName = QInputDialog::getText( nullptr, tr("Rename Crate"), tr("Enter new name for crate:"), QLineEdit::Normal, oldName, - &ok)); - if (!ok || (crate.getName() == oldName)) { + &ok).trimmed(); + if (!ok || newName.isEmpty()) { return; } - if (!crate.hasName()) { + if (newName.isEmpty()) { QMessageBox::warning( nullptr, tr("Renaming Crate Failed"), tr("A crate cannot have a blank name.")); continue; } - if (m_pTrackCollection->crates().readCrateByName(crate.getName())) { + if (m_pTrackCollection->crates().readCrateByName(newName)) { QMessageBox::warning( nullptr, tr("Renaming Crate Failed"), tr("A crate by that name already exists.")); - crate.resetName(); continue; } + crate.setName(std::move(newName)); + DEBUG_ASSERT(crate.hasName()); + break; } if (!m_pTrackCollection->updateCrate(crate)) { @@ -594,15 +596,16 @@ // Get a valid name QString baseName = fileName.baseName(); for (int i = 0;; ++i) { - QString name = baseName; + auto name = baseName; if (i > 0) { name += QString(" %1").arg(i); } - - if (crate.parseName(name)) { - DEBUG_ASSERT(crate.hasName()); - if (!m_pTrackCollection->crates().readCrateByName(crate.getName())) { + name = name.trimmed(); + if (!name.isEmpty()) { + if (!m_pTrackCollection->crates().readCrateByName(name)) { // unused crate name found + crate.setName(std::move(name)); + DEBUG_ASSERT(crate.hasName()); break; // terminate loop } } @@ -700,21 +703,10 @@ QModelIndex index = m_crateTableModel.index(i, 0); playlist_items << m_crateTableModel.getTrackLocation(index); } - - if (file_location.endsWith(".pls", Qt::CaseInsensitive)) { - ParserPls::writePLSFile(file_location, playlist_items, useRelativePath); - } else if (file_location.endsWith(".m3u8", Qt::CaseInsensitive)) { - ParserM3u::writeM3U8File(file_location, playlist_items, useRelativePath); - } else { - //default export to M3U if file extension is missing - if(!file_location.endsWith(".m3u", Qt::CaseInsensitive)) - { - qDebug() << "Crate export: No valid file extension specified. Appending .m3u " - << "and exporting to M3U."; - file_location.append(".m3u"); - } - ParserM3u::writeM3UFile(file_location, playlist_items, useRelativePath); - } + exportPlaylistItemsIntoFile( + file_location, + playlist_items, + useRelativePath); } } diff -Nru mixxx-2.2.3~dfsg/src/library/crate/cratefeaturehelper.cpp mixxx-2.2.4~dfsg/src/library/crate/cratefeaturehelper.cpp --- mixxx-2.2.3~dfsg/src/library/crate/cratefeaturehelper.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/crate/cratefeaturehelper.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -35,35 +35,36 @@ const QString proposedCrateName = proposeNameForNewCrate(tr("New Crate")); Crate newCrate; - while (!newCrate.hasName()) { + for (;;) { bool ok = false; - newCrate.parseName( + auto newName = QInputDialog::getText( nullptr, tr("Create New Crate"), tr("Enter name for new crate:"), QLineEdit::Normal, proposedCrateName, - &ok)); + &ok).trimmed(); if (!ok) { return CrateId(); } - if (!newCrate.hasName()) { + if (newName.isEmpty()) { QMessageBox::warning( nullptr, tr("Creating Crate Failed"), tr("A crate cannot have a blank name.")); continue; } - - if (m_pTrackCollection->crates().readCrateByName(newCrate.getName())) { + if (m_pTrackCollection->crates().readCrateByName(newName)) { QMessageBox::warning( nullptr, tr("Creating Crate Failed"), tr("A crate by that name already exists.")); - newCrate.resetName(); continue; } + newCrate.setName(std::move(newName)); + DEBUG_ASSERT(newCrate.hasName()); + break; } CrateId newCrateId; @@ -89,34 +90,36 @@ QString("%1 %2").arg( oldCrate.getName(), tr("copy" , "[noun]"))); Crate newCrate; - while (!newCrate.hasName()) { + for (;;) { bool ok = false; - newCrate.parseName( + auto newName = QInputDialog::getText( nullptr, tr("Duplicate Crate"), tr("Enter name for new crate:"), QLineEdit::Normal, proposedCrateName, - &ok)); + &ok).trimmed(); if (!ok) { return CrateId(); } - if (!newCrate.hasName()) { + if (newName.isEmpty()) { QMessageBox::warning( nullptr, tr("Duplicating Crate Failed"), tr("A crate cannot have a blank name.")); continue; } - if (m_pTrackCollection->crates().readCrateByName(newCrate.getName())) { + if (m_pTrackCollection->crates().readCrateByName(newName)) { QMessageBox::warning( nullptr, tr("Duplicating Crate Failed"), tr("A crate by that name already exists.")); - newCrate.resetName(); continue; } + newCrate.setName(std::move(newName)); + DEBUG_ASSERT(newCrate.hasName()); + break; } CrateId newCrateId; diff -Nru mixxx-2.2.3~dfsg/src/library/dao/playlistdao.cpp mixxx-2.2.4~dfsg/src/library/dao/playlistdao.cpp --- mixxx-2.2.3~dfsg/src/library/dao/playlistdao.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/dao/playlistdao.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -243,7 +243,7 @@ return false; } -bool PlaylistDAO::removeTracksFromPlaylist(const int playlistId, const int startIndex) { +bool PlaylistDAO::removeTracksFromPlaylist(int playlistId, int startIndex) { // Retain the first track if it is loaded in a deck ScopedTransaction transaction(m_database); QSqlQuery query(m_database); @@ -256,7 +256,7 @@ return false; } transaction.commit(); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); return true; } @@ -298,7 +298,7 @@ // TODO(XXX) don't emit if the track didn't add successfully. emit(trackAdded(playlistId, trackId, insertPosition++)); } - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); return true; } @@ -406,18 +406,23 @@ } while (query.next()) { - int position = query.value(query.record().indexOf("position")).toInt(); - removeTracksFromPlaylistInner(playlistId, position); + int position = query.value(query.record().indexOf("position")).toInt(); + removeTracksFromPlaylistInner(playlistId, position); } transaction.commit(); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); } -void PlaylistDAO::removeTrackFromPlaylist(const int playlistId, const TrackId& trackId) { +void PlaylistDAO::removeTracksFromPlaylistById(int playlistId, TrackId trackId) { ScopedTransaction transaction(m_database); + removeTracksFromPlaylistByIdInner(playlistId, trackId); + transaction.commit(); + emit tracksChanged(QSet{playlistId}); +} +void PlaylistDAO::removeTracksFromPlaylistByIdInner(int playlistId, TrackId trackId) { QSqlQuery query(m_database); query.prepare("SELECT position FROM PlaylistTracks WHERE playlist_id=:id " "AND track_id=:track_id"); @@ -431,38 +436,33 @@ } while (query.next()) { - int position = query.value(query.record().indexOf("position")).toInt(); + int position = query.value(query.record().indexOf("position")).toInt(); removeTracksFromPlaylistInner(playlistId, position); - } - - transaction.commit(); - emit(changed(playlistId)); } -void PlaylistDAO::removeTrackFromPlaylist(const int playlistId, const int position) { +void PlaylistDAO::removeTrackFromPlaylist(int playlistId, int position) { // qDebug() << "PlaylistDAO::removeTrackFromPlaylist" // << QThread::currentThread() << m_database.connectionName(); ScopedTransaction transaction(m_database); removeTracksFromPlaylistInner(playlistId, position); transaction.commit(); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); } -void PlaylistDAO::removeTracksFromPlaylist(const int playlistId, QList& positions) { +void PlaylistDAO::removeTracksFromPlaylist(int playlistId, QList positions) { // get positions in reversed order qSort(positions.begin(), positions.end(), qGreater()); //qDebug() << "PlaylistDAO::removeTrackFromPlaylist" // << QThread::currentThread() << m_database.connectionName(); ScopedTransaction transaction(m_database); - QSqlQuery query(m_database); - foreach (int position , positions) { - removeTracksFromPlaylistInner(playlistId, position); + for (const auto position : qAsConst(positions)) { + removeTracksFromPlaylistInner(playlistId, position); } transaction.commit(); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); } void PlaylistDAO::removeTracksFromPlaylistInner(int playlistId, int position) { @@ -550,7 +550,7 @@ m_playlistsTrackIsIn.insert(trackId, playlistId); emit(trackAdded(playlistId, trackId, position)); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); return true; } @@ -611,7 +611,7 @@ // TODO(XXX) The position is wrong if any track failed to insert. emit(trackAdded(playlistId, trackId, insertPositon++)); } - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); return tracksAdded; } @@ -724,7 +724,7 @@ m_playlistsTrackIsIn.insert(copiedTrackId, targetPlaylistID); emit(trackAdded(targetPlaylistID, copiedTrackId, copiedPosition)); } - emit(changed(targetPlaylistID)); + emit tracksChanged(QSet{targetPlaylistID}); return true; } @@ -750,14 +750,22 @@ void PlaylistDAO::removeTracksFromPlaylists(const QList& trackIds) { // copy the hash, because there is no guarantee that "it" is valid after remove QMultiHash playlistsTrackIsInCopy = m_playlistsTrackIsIn; - for (const auto& trackId: trackIds) { + QSet playlistIds; + + ScopedTransaction transaction(m_database); + for (const auto& trackId : trackIds) { for (auto it = playlistsTrackIsInCopy.constBegin(); it != playlistsTrackIsInCopy.constEnd(); ++it) { if (it.key() == trackId) { - removeTrackFromPlaylist(it.value(), trackId); + const auto playlistId = it.value(); + removeTracksFromPlaylistByIdInner(playlistId, trackId); + playlistIds.insert(playlistId); } } } + transaction.commit(); + + emit tracksChanged(playlistIds); } int PlaylistDAO::tracksInPlaylist(const int playlistId) const { @@ -830,7 +838,7 @@ qDebug() << query.lastError(); } - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); } void PlaylistDAO::searchForDuplicateTrack(const int fromPosition, @@ -994,7 +1002,7 @@ } transaction.commit(); - emit(changed(playlistId)); + emit tracksChanged(QSet{playlistId}); } bool PlaylistDAO::isTrackInPlaylist(TrackId trackId, const int playlistId) const { diff -Nru mixxx-2.2.3~dfsg/src/library/dao/playlistdao.h mixxx-2.2.4~dfsg/src/library/dao/playlistdao.h --- mixxx-2.2.3~dfsg/src/library/dao/playlistdao.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/dao/playlistdao.h 2020-05-15 21:26:10.000000000 +0000 @@ -91,9 +91,9 @@ // removes all hidden and purged Tracks from the playlist void removeHiddenTracks(const int playlistId); // Remove a track from a playlist - void removeTrackFromPlaylist(const int playlistId, const TrackId& trackId); - void removeTrackFromPlaylist(const int playlistId, const int position); - void removeTracksFromPlaylist(const int playlistId, QList& positions); + void removeTrackFromPlaylist(int playlistId, int position); + void removeTracksFromPlaylist(int playlistId, QList positions); + void removeTracksFromPlaylistById(int playlistId, TrackId trackId); // Insert a track into a specific position in a playlist bool insertTrackIntoPlaylist(TrackId trackId, int playlistId, int position); // Inserts a list of tracks into playlist @@ -124,15 +124,16 @@ signals: void added(int playlistId); void deleted(int playlistId); - void changed(int playlistId); + void renamed(int playlistId, QString newName); + void lockChanged(int playlistId); void trackAdded(int playlistId, TrackId trackId, int position); void trackRemoved(int playlistId, TrackId trackId, int position); - void renamed(int playlistId, QString a_strName); - void lockChanged(int playlistId); + void tracksChanged(QSet playlistIds); // added/removed/reordered private: - bool removeTracksFromPlaylist(const int playlistId, const int startIndex); + bool removeTracksFromPlaylist(int playlistId, int startIndex); void removeTracksFromPlaylistInner(int playlistId, int position); + void removeTracksFromPlaylistByIdInner(int playlistId, TrackId trackId); void searchForDuplicateTrack(const int fromPosition, const int toPosition, TrackId trackID, diff -Nru mixxx-2.2.3~dfsg/src/library/dao/trackdao.cpp mixxx-2.2.4~dfsg/src/library/dao/trackdao.cpp --- mixxx-2.2.3~dfsg/src/library/dao/trackdao.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/dao/trackdao.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -390,7 +390,7 @@ "artist,title,album,album_artist,year,genre,tracknumber,tracktotal,composer," "grouping,filetype,location,comment,url,duration,rating,key,key_id," "bitrate,samplerate,cuepoint,bpm,replaygain,replaygain_peak,wavesummaryhex," - "timesplayed,channels,mixxx_deleted,header_parsed," + "timesplayed,played,channels,mixxx_deleted,header_parsed," "beats_version,beats_sub_version,beats,bpm_lock," "keys_version,keys_sub_version,keys," "coverart_source,coverart_type,coverart_location,coverart_hash," @@ -399,7 +399,7 @@ ":artist,:title,:album,:album_artist,:year,:genre,:tracknumber,:tracktotal,:composer," ":grouping,:filetype,:location,:comment,:url,:duration,:rating,:key,:key_id," ":bitrate,:samplerate,:cuepoint,:bpm,:replaygain,:replaygain_peak,:wavesummaryhex," - ":timesplayed,:channels,:mixxx_deleted,:header_parsed," + ":timesplayed,:played,:channels,:mixxx_deleted,:header_parsed," ":beats_version,:beats_sub_version,:beats,:bpm_lock," ":keys_version,:keys_sub_version,:keys," ":coverart_source,:coverart_type,:coverart_location,:coverart_hash," diff -Nru mixxx-2.2.3~dfsg/src/library/libraryfeature.cpp mixxx-2.2.4~dfsg/src/library/libraryfeature.cpp --- mixxx-2.2.3~dfsg/src/library/libraryfeature.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/libraryfeature.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -3,10 +3,21 @@ #include "library/libraryfeature.h" +#include "library/library.h" +#include "library/parserm3u.h" +#include "library/parserpls.h" +#include "util/logger.h" + // 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 +namespace { + +const mixxx::Logger kLogger("LibraryFeature"); + +} // anonymous namespace + LibraryFeature::LibraryFeature( QObject *parent) : QObject(parent) { @@ -36,3 +47,50 @@ if (! dialog.exec()) return QStringList(); return dialog.selectedFiles(); } + +bool LibraryFeature::exportPlaylistItemsIntoFile( + QString playlistFilePath, + const QList& playlistItemLocations, + bool useRelativePath) { + if (playlistFilePath.endsWith( + QStringLiteral(".pls"), + Qt::CaseInsensitive)) { + return ParserPls::writePLSFile( + playlistFilePath, + playlistItemLocations, + useRelativePath); + } else if (playlistFilePath.endsWith( + QStringLiteral(".m3u8"), + Qt::CaseInsensitive)) { + return ParserM3u::writeM3U8File( + playlistFilePath, + playlistItemLocations, + useRelativePath); + } else { + //default export to M3U if file extension is missing + if (!playlistFilePath.endsWith( + QStringLiteral(".m3u"), + Qt::CaseInsensitive)) { + kLogger.debug() + << "No valid file extension for playlist export specified." + << "Appending .m3u and exporting to M3U."; + playlistFilePath.append(QStringLiteral(".m3u")); + if (QFileInfo(playlistFilePath).exists()) { + auto overwrite = QMessageBox::question( + NULL, + tr("Overwrite File?"), + tr("A playlist file with the name \"%1\" already exists.\n" + "The default \"m3u\" extension was added because none was specified.\n\n" + "Do you really want to overwrite it?").arg(playlistFilePath) + ); + if (overwrite != QMessageBox::StandardButton::Yes) { + return false; + } + } + } + return ParserM3u::writeM3UFile( + playlistFilePath, + playlistItemLocations, + useRelativePath); + } +} diff -Nru mixxx-2.2.3~dfsg/src/library/libraryfeature.h mixxx-2.2.4~dfsg/src/library/libraryfeature.h --- mixxx-2.2.3~dfsg/src/library/libraryfeature.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/libraryfeature.h 2020-05-15 21:26:10.000000000 +0000 @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -123,7 +124,15 @@ void enableCoverArtDisplay(bool); void trackSelected(TrackPointer pTrack); - private: + protected: + // TODO: Move common crate/playlist functions into + // a separate base class + static bool exportPlaylistItemsIntoFile( + QString playlistFilePath, + const QList& playlistItemLocations, + bool useRelativePath); + + private: QStringList getPlaylistFiles(QFileDialog::FileMode mode) const; }; diff -Nru mixxx-2.2.3~dfsg/src/library/parserm3u.cpp mixxx-2.2.4~dfsg/src/library/parserm3u.cpp --- mixxx-2.2.3~dfsg/src/library/parserm3u.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/parserm3u.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -118,15 +118,15 @@ return QString(); } -bool ParserM3u::writeM3UFile(const QString &file_str, QList &items, bool useRelativePath) { +bool ParserM3u::writeM3UFile(const QString &file_str, const QList &items, bool useRelativePath) { return writeM3UFile(file_str, items, useRelativePath, false); } -bool ParserM3u::writeM3U8File(const QString &file_str, QList &items, bool useRelativePath) { +bool ParserM3u::writeM3U8File(const QString &file_str, const QList &items, bool useRelativePath) { return writeM3UFile(file_str, items, useRelativePath, true); } -bool ParserM3u::writeM3UFile(const QString &file_str, QList &items, bool useRelativePath, bool useUtf8) +bool ParserM3u::writeM3UFile(const QString &file_str, const QList &items, bool useRelativePath, bool useUtf8) { // Important note: // On Windows \n will produce a (=\r\n) diff -Nru mixxx-2.2.3~dfsg/src/library/parserm3u.h mixxx-2.2.4~dfsg/src/library/parserm3u.h --- mixxx-2.2.3~dfsg/src/library/parserm3u.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/parserm3u.h 2020-05-15 21:26:10.000000000 +0000 @@ -28,9 +28,9 @@ /**Overwriting function parse in class Parser**/ QList parse(QString); //Playlist Export - static bool writeM3UFile(const QString &file_str, QList &items, bool useRelativePath, bool useUtf8); - static bool writeM3UFile(const QString &file, QList &items, bool useRelativePath); - static bool writeM3U8File(const QString &file_str, QList &items, bool useRelativePath); + static bool writeM3UFile(const QString &file_str, const QList &items, bool useRelativePath, bool useUtf8); + static bool writeM3UFile(const QString &file, const QList &items, bool useRelativePath); + static bool writeM3U8File(const QString &file_str, const QList &items, bool useRelativePath); private: /**Reads a line from the file and returns filepath if a valid file**/ diff -Nru mixxx-2.2.3~dfsg/src/library/parserpls.cpp mixxx-2.2.4~dfsg/src/library/parserpls.cpp --- mixxx-2.2.3~dfsg/src/library/parserpls.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/parserpls.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -135,7 +135,7 @@ return 0; } -bool ParserPls::writePLSFile(const QString &file_str, QList &items, bool useRelativePath) +bool ParserPls::writePLSFile(const QString &file_str, const QList &items, bool useRelativePath) { QFile file(file_str); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { diff -Nru mixxx-2.2.3~dfsg/src/library/parserpls.h mixxx-2.2.4~dfsg/src/library/parserpls.h --- mixxx-2.2.3~dfsg/src/library/parserpls.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/parserpls.h 2020-05-15 21:26:10.000000000 +0000 @@ -26,7 +26,7 @@ /**Can be called to parse a pls file**/ QList parse(QString); //Playlist Export - static bool writePLSFile(const QString &file, QList &items, bool useRelativePath); + static bool writePLSFile(const QString &file, const QList &items, bool useRelativePath); private: /**Returns the Number of entries in the pls file**/ diff -Nru mixxx-2.2.3~dfsg/src/library/playlistfeature.cpp mixxx-2.2.4~dfsg/src/library/playlistfeature.cpp --- mixxx-2.2.3~dfsg/src/library/playlistfeature.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/playlistfeature.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -232,23 +232,24 @@ } } -void PlaylistFeature::slotPlaylistContentChanged(int playlistId) { +void PlaylistFeature::slotPlaylistContentChanged(QSet playlistIds) { if (!m_pPlaylistTableModel) { return; } - //qDebug() << "slotPlaylistContentChanged() playlistId:" << playlistId; - enum PlaylistDAO::HiddenType type = m_playlistDao.getHiddenType(playlistId); - if (type == PlaylistDAO::PLHT_NOT_HIDDEN || - type == PlaylistDAO::PLHT_UNKNOWN) { // In case of a deleted Playlist - updateChildModel(playlistId); + for (const auto playlistId : qAsConst(playlistIds)) { + enum PlaylistDAO::HiddenType type = m_playlistDao.getHiddenType(playlistId); + if (type == PlaylistDAO::PLHT_NOT_HIDDEN || + type == PlaylistDAO::PLHT_UNKNOWN) { // In case of a deleted Playlist + updateChildModel(playlistId); + } } } - - -void PlaylistFeature::slotPlaylistTableRenamed(int playlistId, - QString /* a_strName */) { +void PlaylistFeature::slotPlaylistTableRenamed( + int playlistId, + QString newName) { + Q_UNUSED(newName); if (!m_pPlaylistTableModel) { return; } diff -Nru mixxx-2.2.3~dfsg/src/library/playlistfeature.h mixxx-2.2.4~dfsg/src/library/playlistfeature.h --- mixxx-2.2.3~dfsg/src/library/playlistfeature.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/playlistfeature.h 2020-05-15 21:26:10.000000000 +0000 @@ -35,9 +35,9 @@ void onRightClickChild(const QPoint& globalPos, QModelIndex index); private slots: - void slotPlaylistTableChanged(int playlistId); - void slotPlaylistContentChanged(int playlistId); - void slotPlaylistTableRenamed(int playlistId, QString a_strName); + void slotPlaylistTableChanged(int playlistId) override; + void slotPlaylistContentChanged(QSet playlistIds) override; + void slotPlaylistTableRenamed(int playlistId, QString newName) override; protected: QList createPlaylistLabels() override; diff -Nru mixxx-2.2.3~dfsg/src/library/playlisttablemodel.cpp mixxx-2.2.4~dfsg/src/library/playlisttablemodel.cpp --- mixxx-2.2.3~dfsg/src/library/playlisttablemodel.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/playlisttablemodel.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -68,8 +68,10 @@ setDefaultSort(fieldIndex(ColumnCache::COLUMN_PLAYLISTTRACKSTABLE_POSITION), Qt::AscendingOrder); setSort(defaultSortColumn(), defaultSortOrder()); - connect(&m_pTrackCollection->getPlaylistDAO(), SIGNAL(changed(int)), - this, SLOT(playlistChanged(int))); + connect(&m_pTrackCollection->getPlaylistDAO(), + &PlaylistDAO::tracksChanged, + this, + &PlaylistTableModel::playlistsChanged); } int PlaylistTableModel::addTracks(const QModelIndex& index, @@ -130,7 +132,9 @@ trackPositions.append(trackPosition); } - m_pTrackCollection->getPlaylistDAO().removeTracksFromPlaylist(m_iPlaylistId, trackPositions); + m_pTrackCollection->getPlaylistDAO().removeTracksFromPlaylist( + m_iPlaylistId, + std::move(trackPositions)); } void PlaylistTableModel::moveTrack(const QModelIndex& sourceIndex, @@ -259,8 +263,8 @@ return caps; } -void PlaylistTableModel::playlistChanged(int playlistId) { - if (playlistId == m_iPlaylistId) { +void PlaylistTableModel::playlistsChanged(QSet playlistIds) { + if (playlistIds.contains(m_iPlaylistId)) { select(); // Repopulate the data model. } } diff -Nru mixxx-2.2.3~dfsg/src/library/playlisttablemodel.h mixxx-2.2.4~dfsg/src/library/playlisttablemodel.h --- mixxx-2.2.3~dfsg/src/library/playlisttablemodel.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/playlisttablemodel.h 2020-05-15 21:26:10.000000000 +0000 @@ -33,7 +33,7 @@ CapabilitiesFlags getCapabilities() const final; private slots: - void playlistChanged(int playlistId); + void playlistsChanged(QSet playlistIds); private: int m_iPlaylistId; diff -Nru mixxx-2.2.3~dfsg/src/library/setlogfeature.cpp mixxx-2.2.4~dfsg/src/library/setlogfeature.cpp --- mixxx-2.2.3~dfsg/src/library/setlogfeature.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/setlogfeature.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -332,21 +332,24 @@ } } -void SetlogFeature::slotPlaylistContentChanged(int playlistId) { +void SetlogFeature::slotPlaylistContentChanged(QSet playlistIds) { if (!m_pPlaylistTableModel) { return; } - //qDebug() << "slotPlaylistContentChanged() playlistId:" << playlistId; - enum PlaylistDAO::HiddenType type = m_playlistDao.getHiddenType(playlistId); - if (type == PlaylistDAO::PLHT_SET_LOG || - type == PlaylistDAO::PLHT_UNKNOWN) { // In case of a deleted Playlist - updateChildModel(playlistId); + for (const auto playlistId : qAsConst(playlistIds)) { + enum PlaylistDAO::HiddenType type = m_playlistDao.getHiddenType(playlistId); + if (type == PlaylistDAO::PLHT_SET_LOG || + type == PlaylistDAO::PLHT_UNKNOWN) { // In case of a deleted Playlist + updateChildModel(playlistId); + } } } -void SetlogFeature::slotPlaylistTableRenamed(int playlistId, - QString /* a_strName */) { +void SetlogFeature::slotPlaylistTableRenamed( + int playlistId, + QString newName) { + Q_UNUSED(newName); if (!m_pPlaylistTableModel) { return; } diff -Nru mixxx-2.2.3~dfsg/src/library/setlogfeature.h mixxx-2.2.4~dfsg/src/library/setlogfeature.h --- mixxx-2.2.3~dfsg/src/library/setlogfeature.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/library/setlogfeature.h 2020-05-15 21:26:10.000000000 +0000 @@ -39,9 +39,9 @@ private slots: void slotPlayingTrackChanged(TrackPointer currentPlayingTrack); - void slotPlaylistTableChanged(int playlistId); - void slotPlaylistContentChanged(int playlistId); - void slotPlaylistTableRenamed(int playlistId, QString a_strName); + void slotPlaylistTableChanged(int playlistId) override; + void slotPlaylistContentChanged(QSet playlistIds) override; + void slotPlaylistTableRenamed(int playlistId, QString newName) override; private: QString getRootViewHtml() const; diff -Nru mixxx-2.2.3~dfsg/src/mixer/basetrackplayer.cpp mixxx-2.2.4~dfsg/src/mixer/basetrackplayer.cpp --- mixxx-2.2.3~dfsg/src/mixer/basetrackplayer.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/mixer/basetrackplayer.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -43,8 +43,6 @@ pEffectsManager, defaultOrientation); m_pInputConfigured = std::make_unique(group, "input_configured", this); - m_pPassthroughEnabled = std::make_unique(group, "passthrough", this); - m_pPassthroughEnabled->connectValueChanged(SLOT(slotPassthroughEnabled(double))); #ifdef __VINYLCONTROL__ m_pVinylControlEnabled = std::make_unique(group, "vinylcontrol_enabled", this); m_pVinylControlEnabled->connectValueChanged(SLOT(slotVinylControlEnabled(double))); @@ -408,18 +406,6 @@ m_pPitchAdjust = std::make_unique(group, "pitch_adjust", this); } -void BaseTrackPlayerImpl::slotPassthroughEnabled(double v) { - bool configured = m_pInputConfigured->toBool(); - bool passthrough = v > 0.0; - - // Warn the user if they try to enable passthrough on a player with no - // configured input. - if (!configured && passthrough) { - m_pPassthroughEnabled->set(0.0); - emit(noPassthroughInputConfigured()); - } -} - void BaseTrackPlayerImpl::slotVinylControlEnabled(double v) { #ifdef __VINYLCONTROL__ bool configured = m_pInputConfigured->toBool(); diff -Nru mixxx-2.2.3~dfsg/src/mixer/basetrackplayer.h mixxx-2.2.4~dfsg/src/mixer/basetrackplayer.h --- mixxx-2.2.3~dfsg/src/mixer/basetrackplayer.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/mixer/basetrackplayer.h 2020-05-15 21:26:10.000000000 +0000 @@ -42,7 +42,6 @@ void newTrackLoaded(TrackPointer pLoadedTrack); void loadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack); void playerEmpty(); - void noPassthroughInputConfigured(); void noVinylControlInputConfigured(); }; @@ -78,7 +77,6 @@ void slotPlayToggled(double); private slots: - void slotPassthroughEnabled(double v); void slotVinylControlEnabled(double v); void slotWaveformZoomValueChangeRequest(double pressed); void slotWaveformZoomUp(double pressed); @@ -129,7 +127,6 @@ std::unique_ptr m_pRateSlider; std::unique_ptr m_pPitchAdjust; std::unique_ptr m_pInputConfigured; - std::unique_ptr m_pPassthroughEnabled; std::unique_ptr m_pVinylControlEnabled; std::unique_ptr m_pVinylControlStatus; }; diff -Nru mixxx-2.2.3~dfsg/src/mixer/playermanager.cpp mixxx-2.2.4~dfsg/src/mixer/playermanager.cpp --- mixxx-2.2.3~dfsg/src/mixer/playermanager.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/mixer/playermanager.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -365,8 +365,8 @@ Deck* pDeck = new Deck(this, m_pConfig, m_pEngine, m_pEffectsManager, orientation, group); - connect(pDeck, SIGNAL(noPassthroughInputConfigured()), - this, SIGNAL(noDeckPassthroughInputConfigured())); + connect(pDeck->getEngineDeck(), &EngineDeck::noPassthroughInputConfigured, + this, &PlayerManager::noDeckPassthroughInputConfigured); connect(pDeck, SIGNAL(noVinylControlInputConfigured()), this, SIGNAL(noVinylControlInputConfigured())); diff -Nru mixxx-2.2.3~dfsg/src/mixxx.cpp mixxx-2.2.4~dfsg/src/mixxx.cpp --- mixxx-2.2.3~dfsg/src/mixxx.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/mixxx.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -773,12 +773,12 @@ QPalette Pal(palette()); // safe default QMenuBar background - QColor MenuBarBackground(m_pMenuBar->palette().color(QPalette::Background)); - Pal.setColor(QPalette::Background, QColor(0x202020)); + QColor MenuBarBackground(m_pMenuBar->palette().color(QPalette::Window)); + Pal.setColor(QPalette::Window, QColor(0x202020)); setAutoFillBackground(true); setPalette(Pal); // restore default QMenuBar background - Pal.setColor(QPalette::Background, MenuBarBackground); + Pal.setColor(QPalette::Window, MenuBarBackground); m_pMenuBar->setPalette(Pal); // Restore the current window state (position, maximized, etc) @@ -1323,7 +1323,13 @@ } setCentralWidget(m_pWidgetParent); +#ifdef __LINUX__ + // don't adjustSize() on Linux as this wouldn't use the entire available area + // to paint the new skin with X11 + // https://bugs.launchpad.net/mixxx/+bug/1773587 +#else adjustSize(); +#endif if (wasFullScreen) { slotViewFullScreen(true); diff -Nru mixxx-2.2.3~dfsg/src/preferences/dialog/dlgprefrecord.cpp mixxx-2.2.4~dfsg/src/preferences/dialog/dlgprefrecord.cpp --- mixxx-2.2.3~dfsg/src/preferences/dialog/dlgprefrecord.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/preferences/dialog/dlgprefrecord.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -61,7 +61,7 @@ m_pConfig->set(ConfigKey(RECORDING_PREF_KEY, "Encoding"), ConfigValue(m_selFormat.internalName)); } - setupEncoderUI(m_selFormat); + setupEncoderUI(); // Setting Metadata loadMetaData(); @@ -160,7 +160,7 @@ break; } } - setupEncoderUI(m_selFormat); + setupEncoderUI(); loadMetaData(); @@ -178,8 +178,9 @@ void DlgPrefRecord::slotResetToDefaults() { m_formatButtons.first()->setChecked(true); - setupEncoderUI(EncoderFactory::getFactory().getFormatFor( - m_formatButtons.first()->objectName())); + m_selFormat = EncoderFactory::getFactory().getFormatFor( + m_formatButtons.first()->objectName()); + setupEncoderUI(); // TODO (XXX): It would be better that a defaultSettings() method is added // to the EncoderSettings interface so that we know which option to set m_optionWidgets.first()->setChecked(true); @@ -218,12 +219,13 @@ { QObject *senderObj = sender(); m_selFormat = EncoderFactory::getFactory().getFormatFor(senderObj->objectName()); - setupEncoderUI(m_selFormat); + setupEncoderUI(); } -void DlgPrefRecord::setupEncoderUI(Encoder::Format selformat) -{ - EncoderSettingsPointer settings = EncoderFactory::getFactory().getEncoderSettings(selformat, m_pConfig); +void DlgPrefRecord::setupEncoderUI() { + EncoderSettingsPointer settings = + EncoderFactory::getFactory().getEncoderSettings( + m_selFormat, m_pConfig); if (settings->usesQualitySlider()) { LabelQuality->setVisible(true); SliderQuality->setVisible(true); diff -Nru mixxx-2.2.3~dfsg/src/preferences/dialog/dlgprefrecord.h mixxx-2.2.4~dfsg/src/preferences/dialog/dlgprefrecord.h --- mixxx-2.2.3~dfsg/src/preferences/dialog/dlgprefrecord.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/preferences/dialog/dlgprefrecord.h 2020-05-15 21:26:10.000000000 +0000 @@ -42,7 +42,7 @@ void retainSizeFor(QWidget* widget); inline void showWidget(QWidget* widget); inline void hideWidget(QWidget* widget); - void setupEncoderUI(Encoder::Format selformat); + void setupEncoderUI(); void loadMetaData(); void updateTextQuality(); void updateTextCompression(); diff -Nru mixxx-2.2.3~dfsg/src/sources/soundsourcemp3.cpp mixxx-2.2.4~dfsg/src/sources/soundsourcemp3.cpp --- mixxx-2.2.3~dfsg/src/sources/soundsourcemp3.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/sources/soundsourcemp3.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -565,6 +565,7 @@ CSAMPLE* pSampleBuffer = writableSampleFrames.writableData(); SINT numberOfFramesRemaining = numberOfFramesTotal; + SINT retryFrameIndex = numberOfFramesTotal; while (0 < numberOfFramesRemaining) { bool abortReading = false; @@ -645,11 +646,23 @@ } } if (pMadThisFrame == m_madStream.this_frame) { - if (kLogger.debugEnabled()) { - kLogger.debug() << "Retry decoding MP3 frame @" << m_curFrameIndex; + // Retry decoding, but only once for each position to + // prevent infinite loops when decoding corrupt files + if (retryFrameIndex != m_curFrameIndex) { + retryFrameIndex = m_curFrameIndex; + if (kLogger.debugEnabled()) { + kLogger.debug() + << "Retry decoding MP3 frame @" + << m_curFrameIndex; + } + continue; + } else { + kLogger.warning() + << "Decoding MP3 frame @" + << m_curFrameIndex + << "failed again"; + break; } - // Retry decoding - continue; } DEBUG_ASSERT(isStreamValid(m_madStream)); diff -Nru mixxx-2.2.3~dfsg/src/util/db/dbnamedentity.h mixxx-2.2.4~dfsg/src/util/db/dbnamedentity.h --- mixxx-2.2.3~dfsg/src/util/db/dbnamedentity.h 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/util/db/dbnamedentity.h 2020-05-15 21:26:10.000000000 +0000 @@ -1,44 +1,30 @@ -#ifndef MIXXX_DBNAMEDENTITY_H -#define MIXXX_DBNAMEDENTITY_H - +#pragma once #include "util/db/dbentity.h" - // Base class for database entities with a non-empty name. template // where T is derived from DbId class DbNamedEntity: public DbEntity { public: ~DbNamedEntity() override = default; - static QString normalizeName(const QString& name) { - return name.trimmed(); - } bool hasName() const { - DEBUG_ASSERT(normalizeName(m_name) == m_name); // already normalized return !m_name.isEmpty(); } const QString& getName() const { return m_name; } - void setName(const QString& name) { - DEBUG_ASSERT(normalizeName(name) == name); // already normalized - m_name = name; + void setName(QString name) { + // Due to missing trimming names with only whitespaces + // may occur in the database and can't we assert on + // this here! + DEBUG_ASSERT(!name.isEmpty()); + m_name = std::move(name); } void resetName() { m_name.clear(); DEBUG_ASSERT(!hasName()); } - bool parseName(const QString& name) { - QString normalizedName(normalizeName(name)); - if (name.isEmpty()) { - return false; - } else { - setName(name); - DEBUG_ASSERT(hasName()); - return true; - } - } protected: DbNamedEntity() = default; @@ -54,6 +40,3 @@ QDebug operator<<(QDebug debug, const DbNamedEntity& entity) { return debug << QString("%1 '%2'").arg(entity.getId().toString(), entity.getName()); } - - -#endif // MIXXX_DBNAMEDENTITY_H diff -Nru mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererfilteredsignal.cpp mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererfilteredsignal.cpp --- mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererfilteredsignal.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererfilteredsignal.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -51,7 +51,6 @@ painter->save(); painter->setRenderHints(QPainter::Antialiasing, false); - painter->setRenderHints(QPainter::HighQualityAntialiasing, false); painter->setRenderHints(QPainter::SmoothPixmapTransform, false); painter->setWorldMatrixEnabled(false); painter->resetTransform(); diff -Nru mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererhsv.cpp mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererhsv.cpp --- mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererhsv.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererhsv.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -45,7 +45,6 @@ painter->save(); painter->setRenderHints(QPainter::Antialiasing, false); - painter->setRenderHints(QPainter::HighQualityAntialiasing, false); painter->setRenderHints(QPainter::SmoothPixmapTransform, false); painter->setWorldMatrixEnabled(false); painter->resetTransform(); diff -Nru mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererrgb.cpp mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererrgb.cpp --- mixxx-2.2.3~dfsg/src/waveform/renderers/waveformrendererrgb.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/waveform/renderers/waveformrendererrgb.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -44,7 +44,6 @@ painter->save(); painter->setRenderHints(QPainter::Antialiasing, false); - painter->setRenderHints(QPainter::HighQualityAntialiasing, false); painter->setRenderHints(QPainter::SmoothPixmapTransform, false); painter->setWorldMatrixEnabled(false); painter->resetTransform(); diff -Nru mixxx-2.2.3~dfsg/src/widget/wspinny.cpp mixxx-2.2.4~dfsg/src/widget/wspinny.cpp --- mixxx-2.2.3~dfsg/src/widget/wspinny.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/widget/wspinny.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -323,7 +323,6 @@ QPainter p(this); p.setRenderHint(QPainter::Antialiasing); - p.setRenderHint(QPainter::HighQualityAntialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); if (m_pBgImage) { diff -Nru mixxx-2.2.3~dfsg/src/widget/wtracktableview.cpp mixxx-2.2.4~dfsg/src/widget/wtracktableview.cpp --- mixxx-2.2.3~dfsg/src/widget/wtracktableview.cpp 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/src/widget/wtracktableview.cpp 2020-05-15 21:26:10.000000000 +0000 @@ -571,11 +571,9 @@ } TrackPointer pTrack = trackModel->getTrack(index); - VERIFY_OR_DEBUG_ASSERT(pTrack) { - return; + if (pTrack) { + emit loadTrack(pTrack); } - - emit(loadTrack(pTrack)); } else if (doubleClickAction == DlgPrefLibrary::ADD_TO_AUTODJ_BOTTOM && modelHasCapabilities(TrackModel::TRACKMODELCAPS_ADDTOAUTODJ)) { sendToAutoDJ(PlaylistDAO::AutoDJSendLoc::BOTTOM); @@ -1811,13 +1809,11 @@ QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); for (const auto& index : selectedTrackIndices) { - TrackPointer track = trackModel->getTrack(index); - if (!track->isBpmLocked()) { // bpm is not locked - BeatsPointer beats = track->getBeats(); - if (beats != nullptr) { - beats->scale(static_cast(scale)); - } else { - continue; + TrackPointer pTrack = trackModel->getTrack(index); + if (pTrack && !pTrack->isBpmLocked()) { + BeatsPointer pBeats = pTrack->getBeats(); + if (pBeats) { + pBeats->scale(static_cast(scale)); } } } @@ -1832,8 +1828,10 @@ QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); // TODO: This should be done in a thread for large selections for (const auto& index : selectedTrackIndices) { - TrackPointer track = trackModel->getTrack(index); - track->setBpmLocked(lock); + TrackPointer pTrack = trackModel->getTrack(index); + if (pTrack) { + pTrack->setBpmLocked(lock); + } } } @@ -1846,9 +1844,9 @@ QModelIndexList selectedTrackIndices = selectionModel()->selectedRows(); // TODO: This should be done in a thread for large selections for (const auto& index : selectedTrackIndices) { - TrackPointer track = trackModel->getTrack(index); - if (!track->isBpmLocked()) { - track->setBeats(BeatsPointer()); + TrackPointer pTrack = trackModel->getTrack(index); + if (pTrack && !pTrack->isBpmLocked()) { + pTrack->setBeats(BeatsPointer()); } } } diff -Nru mixxx-2.2.3~dfsg/.travis.yml mixxx-2.2.4~dfsg/.travis.yml --- mixxx-2.2.3~dfsg/.travis.yml 2019-11-27 00:02:42.000000000 +0000 +++ mixxx-2.2.4~dfsg/.travis.yml 2020-05-15 21:26:10.000000000 +0000 @@ -52,6 +52,7 @@ # Virtual X, needed for analyzer waveform tests - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export DISPLAY=:99.0 ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sh -e /etc/init.d/xvfb start ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install scons portaudio libsndfile libogg libvorbis portmidi taglib libshout protobuf flac ffmpeg qt chromaprint rubberband libmodplug libid3tag libmad mp4v2 faad2 wavpack opusfile lilv; fi install: