diff --git a/.gitignore b/.gitignore index 9d62549e436b..6c45e0e8d211 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.orig *.os *.patch +!build/appveyor/NSIS.patch *.pyc *.rej *_build @@ -39,12 +40,16 @@ src/test/golden_buffers/*.actual res/qrc_mixxx.cc res/developer_skins -build/wix/*.wixobj -build/wix/*.wixpdb -build/wix/*.msi -build/wix/*.mst -build/wix/subdirs/*.wixobj +*.wixobj +*.wixpdb +*.msi +*.mst +*.cab build/wix/subdirs/*.wxs +# The following 2 files are autogenerated by scons at release time +# based on .tmpl template file for the second one. +build/wix/bundle/bundleloc.wxs +build/wix/ProductID.wxi *.obj *.pdb diff --git a/.travis.yml b/.travis.yml index b8d8412658c7..a155b05e6586 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ matrix: compiler: gcc - os: osx - osx_image: xcode7.2 + osx_image: xcode7.3 compiler: clang # install dependencies addons: @@ -15,6 +15,8 @@ addons: sources: - ubuntu-toolchain-r-test packages: + - gdb + - libavformat-dev - libchromaprint-dev - libfaad-dev - libfftw3-dev @@ -27,6 +29,7 @@ addons: - libportmidi-dev - libprotobuf-dev - libqt4-dev + - libqt4-opengl-dev - libqt4-sql-sqlite - librubberband-dev - libshout3-dev @@ -46,27 +49,22 @@ before_install: - 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 libjpeg qt chromaprint rubberband fftw libmodplug libid3tag libmad mp4v2 faad2 wavpack opusfile; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install scons portaudio libsndfile libogg libvorbis portmidi taglib libshout protobuf flac ffmpeg qt chromaprint rubberband fftw libmodplug libid3tag libmad mp4v2 faad2 wavpack opusfile; fi install: #### # Common # Build flags common to OS X and Linux. - - export COMMON="test=1 localecompare=1 mad=1 faad=1 opus=1 modplug=1 wv=1 hss1394=0 virtualize=0" + - export COMMON="test=1 mad=1 faad=1 ffmpeg=1 opus=1 modplug=1 wv=1 hss1394=0 virtualize=0 debug_assertions_fatal=1" ##### # Ubuntu Trusty Build - # TODO(rryan): libupower-glib-dev is currently not whitelisted by travis so we cannot - # test building with battery support. - # https://github.com/travis-ci/apt-package-whitelist/issues/2806 - - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then scons $COMMON battery=0 ; fi - #### # OS X Build - # Define QTDIR. + # Define QTDIR. Homebrew does not support Qt4 anymore, so /usr/local/Cellar/qt stores Qt5 installs. - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export QTDIR=$(find /usr/local/Cellar/qt -d 1 | tail -n 1) ; fi # Workaround for bug in libopus's opus.h including @@ -74,8 +72,18 @@ install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export CXXFLAGS="-isystem /usr/local/include/opus" ; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export CFLAGS="-isystem /usr/local/include/opus" ; fi - # We support OS X 10.7 with libc++ by default. - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then scons $COMMON stdlib=libc++ osx_sdk_version_min=10.7 ; fi + # NOTE(rryan): 11/15/2016 we are experiencing Travis timeouts for the OSX + # build. Turning off optimizations to see if that speeds up compile times. We + # also need to avoid going over 4MB of output so we turn off verbose mode. + # NOTE(rryan): 12/31/2016 Homebrew has dropped qt4 support. Build with qt5. + # TODO(rryan): localecompare doesn't work on Travis with qt5 for some reason. + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export EXTRA_FLAGS="optimize=none asan=0 verbose=0 qt5=1 localecompare=0" ; fi + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export EXTRA_FLAGS="localecompare=1" ; fi + + #### + # Common Build + - scons $COMMON $EXTRA_FLAGS script: - - ./mixxx-test + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then gdb --batch -ex run -ex "thread apply all bt full" -ex quit ./mixxx-test ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then lldb ./mixxx-test --batch -o run -o quit -k 'thread backtrace all' -k quit ; fi diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000000..7577cad829d0 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,84 @@ +# Mixxx Code of Conduct + +The Mixxx team is committed to preserving and fostering a +diverse, welcoming community. Below is our community code of conduct, which +applies to our repos and organizations, mailing lists, forums, IRC channels, +blog content, and any +other Mixxx-supported communication group, as well as any private +communication initiated in the context of these spaces. + +Simply put, community discussions should be + + * respectful and kind; + * about Mixxx; + * about features and code, not the individuals involved. + +## Be respectful and constructive. + +Treat everyone with respect. Build on each other's ideas. Each of us has the +right to enjoy our experience and participate without fear of harassment, +discrimination, or condescension, whether blatant or subtle. Remember that +Mixxx is a geographically distributed team and that you may not be +communicating with someone in their primary language. We all get frustrated +when working on hard problems, but we cannot allow that frustration to turn +into personal attacks. + +## Speak up if you see or hear something. + +You are empowered to politely engage when you feel that you or others are +disrespected. The person making you feel uncomfortable may not be aware of what +they are doing - politely bringing their behavior to their attention is +encouraged. + +If you are uncomfortable speaking up, or feel that your concerns are not being +duly considered, you can email community@mixxx.org to request involvement +from a community manager. You may also email any of the community managers +directly. All concerns shared with community managers will be kept +confidential. In cases where a public response is deemed necessary, the +identities of victims and reporters will remain confidential unless those +individuals instruct us otherwise. + +While all reports will be taken seriously, the Mixxx community managers may +not act on complaints that they feel are not violations of this code of +conduct. + +## We will not tolerate harassment of any kind, including but not limited to: + + * Harassing comments + * Intimidation + * Encouraging a person to engage in self-harm. + * Sustained disruption or derailing of threads, channels, lists, etc. + * Offensive or violent comments, jokes or otherwise + * Inappropriate sexual content + * Unwelcome sexual or otherwise aggressive attention + * Continued one-on-one communication after requests to cease + * Distribution or threat of distribution of people's personally identifying + information, AKA “doxing” + +## Consequences for failing to comply with this policy + +Consequences for failing to comply with this policy may include, at the sole +discretion of the Mixxx community managers: + + * a request for an apology; + * a private or public warning or reprimand; + * a temporary ban from the mailing list, blog, Mixxx repository or + organization, or other Mixxx-supported communication group, including + loss of committer status; + * a permanent ban from any of the above, or from all current and future + Mixxx-supported communities, including loss of + committer status. + +Participants warned to stop any harassing behavior are expected to comply +immediately; failure to do so will result in an escalation of consequences. + +## Acknowledgements + +This Code of Conduct is based on the Chromium Code of Conduct, which credits +the Geek Feminism Code of Conduct, the Django Code of Conduct and the Geek +Feminism Wiki "Effective codes of conduct" guide. + +## License + +This Code of Conduct is available for reuse under the Creative Commons Zero +(CC0) license. diff --git a/COPYING b/COPYING index 0f37c04b2ef0..7a1ce14cfffc 100644 --- a/COPYING +++ b/COPYING @@ -1,3 +1,3 @@ -Mixxx is Copyright (C) 2000-2016 by its respective authors. This version +Mixxx is Copyright (C) 2000-2017 by its respective authors. This version of the program is distributed under the General Public License version 2, as described in the file LICENSE distributed with the program. diff --git a/LICENSE b/LICENSE index 6cf4f75b2824..204e55f4e1f6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Mixxx version 2.1, Digital DJ'ing software. -Copyright (C) 2001-2016 Mixxx Development Team +Copyright (C) 2001-2017 Mixxx Development Team Promotional tracks are copyright their respective owners and distributed with permission. diff --git a/README.md b/README.md index ce1881d049b8..38cce98da819 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ To get started with Mixxx: ## Roadmap -The Mixxx team is hard at work on Mixxx 2.0. The best place to keep track of -2.0 development is the [2.0.0 milestone page on Launchpad][launchpad 2.0.0]. +The Mixxx team is hard at work on Mixxx 2.1. The best place to keep track of +2.1 development is the [2.1.0 milestone page on Launchpad][launchpad 2.1.0]. A more general roadmap can be found on [the wiki][wiki roadmap]. @@ -29,7 +29,8 @@ bug list][easybugs] and get started! ## Compiling -[![Build Status](https://travis-ci.org/mixxxdj/mixxx.svg)](https://travis-ci.org/mixxxdj/mixxx) +* Linux / MacOS [![Build Status](https://travis-ci.org/mixxxdj/mixxx.svg)](https://travis-ci.org/mixxxdj/mixxx) +* Windows [![Build status](https://ci.appveyor.com/api/projects/status/j460rficblcaopwx?svg=true)](https://ci.appveyor.com/project/mixxxdj/mixxx) First, you must install all of Mixxx's dependencies. To compile Mixxx using [SCons], run: @@ -95,7 +96,7 @@ license. [mailing list]: https://lists.sourceforge.net/lists/listinfo/mixxx-devel [irc channel]: http://mixxx.org/irc.php [SCons]: http://www.scons.org/ -[launchpad 2.0.0]: https://launchpad.net/mixxx/+milestone/2.0.0 +[launchpad 2.1.0]: https://launchpad.net/mixxx/+milestone/2.1.0 [wiki roadmap]: http://mixxx.org/wiki/doku.php/development_roadmap [easybugs]: https://bugs.launchpad.net/mixxx/+bugs?field.searchtext=&orderby=-importance&search=Search&field.status%3Alist=NEW&field.status%3Alist=CONFIRMED&field.status%3Alist=TRIAGED&field.status%3Alist=INPROGRESS&field.status%3Alist=INCOMPLETE_WITH_RESPONSE&field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE&assignee_option=any&field.assignee=&field.bug_reporter=&field.bug_commenter=&field.subscriber=&field.structural_subscriber=&field.tag=easy&field.tags_combinator=ANY&field.has_cve.used=&field.omit_dupes.used=&field.omit_dupes=on&field.affects_me.used=&field.has_patch.used=&field.has_branches.used=&field.has_branches=on&field.has_no_branches.used=&field.has_no_branches=on&field.has_blueprints.used=&field.has_blueprints=on&field.has_no_blueprints.used=&field.has_no_blueprints=on [creating skins]: http://mixxx.org/wiki/doku.php/creating_skins diff --git a/SConstruct b/SConstruct index df706c584861..d2e7ae81fd72 100644 --- a/SConstruct +++ b/SConstruct @@ -40,7 +40,7 @@ available_features = [features.Mad, features.Bulk, features.MacAppStoreException, features.VinylControl, - features.Shoutcast, + features.LiveBroadcasting, features.Opus, features.Profiling, features.BuildTime, @@ -52,9 +52,8 @@ available_features = [features.Mad, features.ModPlug, features.TestSuite, features.Vamp, - features.AutoDjCrates, features.ColorDiagnostics, - features.AddressSanitizer, + features.Sanitizers, features.LocaleCompare, features.Battery, diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000000..b1d8bfac5c0a --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,76 @@ +--- +version: '{branch}-{build}' +skip_tags: true +max_jobs: 1 +image: Visual Studio 2015 +init: + - git config --global core.autocrlf input +# Uncomment the following line to show RDP info at beginning of job +# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +clone_folder: c:\projects\mixxx +skip_commits: + files: + - doc/ + - LICENCE + - README + - README.md + - COPYING + - CODE_OF_CONDUCT.md + +configuration: + - release-fastbuild +# - release +# - debug +environment: + ENVIRONMENTS_URL: https://downloads.mixxx.org/builds/buildserver/2.1.x-windows/ + ENVIRONMENTS_PATH: C:\mixxx-buildserver + matrix: + - platform: x64 + distdir: dist64 + - platform: x86 + distdir: dist32 +matrix: + fast_finish: false # set this flag to true to immediately finish build once one of the jobs fails. +cache: + - C:\mixxx-buildserver +install: + - set /P ENVIRONMENT_NAME=&1" + - timeout 5 > NUL + - bash -c "stdbuf -oL -eL %distdir%/mixxx-test.exe --benchmark 2>&1" + - timeout 5 > NUL +after_test: + - ps: (new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\test_results.xml)) +artifacts: + - path: '*.exe' + - path: '*.msi' +on_success: + - echo "*** SUCCESS ***" +on_failure: + - echo "*** FAILURE ***" +on_finish: + # Uncomment the following line if you don't want the build VM to be destroyed + # and be able to RDP on it until a special “lock” file on VM desktop is deleted + # The RDP session is limited by overall build time (60 min). +# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + - echo "*** DONE ***" +deploy: + - provider: Environment + name: downloads.mixxx.org diff --git a/build/appveyor/NSIS.patch b/build/appveyor/NSIS.patch new file mode 100644 index 000000000000..12e450e1867a --- /dev/null +++ b/build/appveyor/NSIS.patch @@ -0,0 +1,15 @@ +--- MultiUser.nsh.orig 2017-09-16 20:03:48.000000000 +0000 ++++ MultiUser.nsh 2017-09-16 20:14:24.236880542 +0000 +@@ -133,7 +133,11 @@ + ${if} ${AtLeastWin2000} + StrCpy $INSTDIR "$LOCALAPPDATA\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${else} +- StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" ++ !ifdef MULTIUSER_USE_PROGRAMFILES64 ++ StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}" ++ !else ++ StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" ++ !endif + ${endif} + !endif + !endif diff --git a/build/appveyor/build_mixxx.bat b/build/appveyor/build_mixxx.bat new file mode 100644 index 000000000000..d6f835cec249 --- /dev/null +++ b/build/appveyor/build_mixxx.bat @@ -0,0 +1,158 @@ +@echo on +SETLOCAL + +REM ================================== +REM Path setup and initial checks +REM ================================== + +IF "%ProgramW6432%" =="" ( +SET PROGRAMFILES_PATH=%ProgramFiles% +) else ( +REM doublequote the whole SET command prevents an error with parentheses +SET "PROGRAMFILES_PATH=%ProgramFiles(x86)%" +) + +rem ====== Edit to suit your environment ========= +SET VCVERSION=140 +SET "MSVC_PATH=%PROGRAMFILES_PATH%\Microsoft Visual Studio 14.0\VC" +SET "BUILDTOOLS_PATH=%PROGRAMFILES_PATH%\Microsoft Visual C++ Build Tools" +set "MSSDK_DIR=%PROGRAMFILES_PATH%\Microsoft SDKs\Windows\v7.1A" + +REM XP Compatibility requires the v7.1A SDK +set "MSSDK_DIR=%PROGRAMFILES_PATH%\Microsoft SDKs\Windows\v7.1A" + +if NOT EXIST "%MSSDK_DIR%" ( +echo. +echo Could not find "%MSSDK_DIR%". +echo Edit the build_mixxx.bat file and/or install the required software +echo https://www.microsoft.com/en-us/download/details.aspx?id=8279 +exit /b 1 +) + +IF EXIST "%MSVC_PATH%" ( +SET "BUILDTOOLS_PATH=%MSVC_PATH%" +SET BUILDTOOLS_SCRIPT=vcvarsall.bat + +REM Check whether we have a 64-bit compiler available. +IF EXIST "%MSVC_PATH%\VC\bin\amd64\cl.exe" ( +SET COMPILER_X86=amd64_x86 +SET COMPILER_X64=amd64 +) ELSE ( +SET COMPILER_X86=x86 +SET COMPILER_X64=x86_amd64 +) + +) ELSE ( +IF EXIST "%BUILDTOOLS_PATH%" ( +SET BUILDTOOLS_SCRIPT=vcbuildtools.bat + +SET COMPILER_X86=amd64_x86 +SET COMPILER_X64=amd64 +) ELSE ( +echo. +echo Could not find "%MSVC_PATH%" nor "%BUILDTOOLS_PATH%". +echo Edit the build_environment.bat file and/or install the required software +echo http://landinghub.visualstudio.com/visual-cpp-build-tools +echo https://www.microsoft.com/en-us/download/details.aspx?id=8279 +exit /b 1 +) +REM END EXIST BUILDTOOLS +) +REM END EXIST VISUALSTUDIO + +REM ================================== +REM Parameter reading and variable setup +REM ================================== +REM ^ is the escape character. +if "%3" == "" ( + echo Missing parameters. Usage: ^(Note: keep same case and order^) + echo. + echo build_mixxx.bat x64^|x86 debug^|release^|release-fastbuild ^ + echo. + echo Example: build_mixxx.bat x64 release c:\mixxx\environments\msvc15-static-x86-release + exit /b 1 +) + +set MACHINE_X86="%1" == "x86" +if "%2" == "release" ( + set CONFIG_RELEASE=1==1 +) +if "%2" == "release-fastbuild" ( + set CONFIG_RELEASE=1==1 +) +if "%2" == "debug" ( + set CONFIG_RELEASE=0==1 +) + +set WINLIB_DIR=%3 + +SET BIN_DIR=%WINLIB_DIR%\bin +SET LIB_DIR=%WINLIB_DIR%\lib +SET INCLUDE_DIR=%WINLIB_DIR%\include +set QT_VERSION=4.8.7 +SET QTDIR=%WINLIB_DIR%\Qt-%QT_VERSION% + +if NOT EXIST "%BIN_DIR%\scons.py" ( +echo. +echo You need to obtain and copy SCons to the folder: +echo %BIN_DIR% +exit /b 1 +) + +if NOT EXIST "%QTDIR%" ( +echo. +echo Could not find Qt %QT_VERSION% at "%QT_DIR%". +exit /b 1 +) + +REM Everyting prepared. Setup the compiler. +if %MACHINE_X86% ( +call "%BUILDTOOLS_PATH%\%BUILDTOOLS_SCRIPT%" %COMPILER_X86% +) else ( +call "%BUILDTOOLS_PATH%\%BUILDTOOLS_SCRIPT%" %COMPILER_X64% +) + +REM Now build Mixxx. + +if %CONFIG_RELEASE% ( +set BUILD_TYPE=release +) else ( +set BUILD_TYPE=debug +) + +if %MACHINE_X86% ( +set MACHINE_TYPE=x86 +set DISTDIR=dist32 +) else ( +set MACHINE_TYPE=x86_64 +set DISTDIR=dist64 +) + +REM Clean up after old builds. +REM del /q /f *.exe *.msi 2>NUL +REM rmdir /s /q %DISTDIR% + +rem /MP Use all CPU cores. +rem /FS force synchronous PDB writes (prevents PDB corruption with /MP) +rem /EHsc Do not handle SEH in try / except blocks. +rem /Zc:threadSafeInit- disable C++11 magic static support (Bug #1653368) +set CXXFLAGS=/MP /FS /EHsc /Zc:threadSafeInit- +set CFLAGS=/MP /FS /EHsc /Zc:threadSafeInit- + +set PATH=%BIN_DIR%;%PATH% +scons.py mixxx makerelease toolchain=msvs winlib=%WINLIB_DIR% build=%BUILD_TYPE% staticlibs=1 staticqt=1 debug_assertions_fatal=1 verbose=0 machine=%MACHINE_TYPE% qtdir=%QTDIR% hss1394=1 mediafoundation=1 opus=1 localecompare=1 optimize=fastbuild virtualize=0 test=1 qt_sqlite_plugin=0 mssdk_dir="%MSSDK_DIR%" build_number_in_title_bar=0 bundle_pdbs=1 + +IF ERRORLEVEL 1 ( +echo ============================== +echo. +echo Building Mixxx failed. +echo. +REM For debugging, print the configuration log. +echo Printing config.log: +type config.log +ENDLOCAL +exit /b 1 +) else ( +echo Mixxx built successfully +ENDLOCAL +) diff --git a/build/debian/compat b/build/debian/compat index b8626c4cff28..ec635144f600 100644 --- a/build/debian/compat +++ b/build/debian/compat @@ -1 +1 @@ -4 +9 diff --git a/build/debian/control b/build/debian/control index 44c93e12692b..04477ea89699 100644 --- a/build/debian/control +++ b/build/debian/control @@ -1,9 +1,8 @@ Source: mixxx Section: sound Priority: optional -Maintainer: Ubuntu MOTU Developers -XSBC-Original-Maintainer: RJ Ryan -Build-Depends: debhelper (>= 4.0.0), +Maintainer: RJ Ryan +Build-Depends: debhelper (>= 9), pkg-config, docbook-to-man, libglu1-mesa-dev, @@ -17,13 +16,11 @@ Build-Depends: debhelper (>= 4.0.0), libsndfile1-dev, libasound2-dev, libvorbis-dev, - libsoundtouch1-dev, libmp4v2-dev, libfaad-dev, libportmidi-dev, libtag1-dev, libshout-dev, - libqtwebkit-dev, vamp-plugin-sdk, libprotobuf-dev, protobuf-compiler, @@ -35,18 +32,17 @@ Build-Depends: debhelper (>= 4.0.0), libsoundtouch-dev, libhidapi-dev, libupower-glib-dev -Standards-Version: 3.7.3 +Standards-Version: 3.9.8 Homepage: http://www.mixxx.org/ Package: mixxx Section: sound -Architecture: any +Architecture: linux-any Depends: ${shlibs:Depends}, ${misc:Depends}, libqt4-opengl, libqt4-svg, libqt4-xmlpatterns, - libqt4-webkit, libqt4-sql, libqt4-sql-sqlite Recommends: libmp3lame0 diff --git a/build/debian/copyright b/build/debian/copyright index c2680577b0a6..dbd71b706d2f 100644 --- a/build/debian/copyright +++ b/build/debian/copyright @@ -1,22 +1,27 @@ -This package was debianized by Paul Brossier on -Fri, 26 Nov 2004 12:55:35 +0000. - -It was downloaded from http://mixxx.sourceforge.net/ - - gplot and vbrheadersdk have been removed from the original archive as - they do not comply with the Debian Free Software Guidelines (DFSG). +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Mixxx +Upstream-Contact: + RJ Ryan +Source: http://downloads.mixxx.org/ +Files: * Copyright: - Mixxx - Copyright (C) 2000-2016 Haste Andersen and Mixxx developers - -Upstream Authors: Tue Haste Andersen - and Ken Haste Andersen - -License: - -Mixxx is released under the GNU General Public License Version 2 or above: + 2001-2017 Mixxx development team +License: GPL-2+ - You are free to distribute this software under the terms of the GNU General - Public License. On Debian systems, the complete text of the GNU General Public - License can be found in the file `/usr/share/common-licenses/GPL'. +License: GPL-2+ + 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. +Comment: + On Debian systems the full text of the GNU General Public + License can be found in the `/usr/share/common-licenses/GPL-2' file. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . diff --git a/build/debian/rules b/build/debian/rules index c63ff0b953fd..f338090b7f66 100755 --- a/build/debian/rules +++ b/build/debian/rules @@ -1,138 +1,52 @@ #!/usr/bin/make -f # -*- makefile -*- -# Sample debian/rules that uses debhelper. -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 # no thanks dpkg-buildpackage, we will handle our own C++ optimizations DEB_BUILD_OPTIONS= noopt -# optimize=portable -# for sse2 CPUs (>= Pentium 4) which is the minimum requiremnt for using Mixxx -# this will set CCFLAGS=-mtune=generic -msse2 -mfpmath=sse -# If you need a pure i386 code which is the Debian standard use -# optimize=legacy (not recomended) -# this sets CCFLAGS=-mtune=generic only -# virtualize=0 switches of keeping build files in the cache folder -MIXXX_SCONS_FLAGS = optimize=portable virtualize=0 mad=1 localecompare=1 qt_sqlite_plugin=0 build=$(MIXXX_BUILD) +# Build flags are passed in from the SConscript. +MIXXX_SCONS_FLAGS = "" # If ARCH is set to a different architecture when running pbuilder, pbuilder # will be set to create an environment to build packages for the architecture # specified in ARCH. ifneq (,$(findstring i386,$(ARCH))) - MIXXX_SCONS_FLAGS += machine=x86 + MIXXX_SCONS_FLAGS += machine=x86 endif ifneq (,$(findstring amd64,$(ARCH))) - MIXXX_SCONS_FLAGS += machine=x86_64 + MIXXX_SCONS_FLAGS += machine=x86_64 endif -# detect number of processors -NCPUS := $(shell getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1) -ifeq ($(NCPUS),-1) - NCPUS:=1 -endif -ifeq ($(NCPUS),0) - NCPUS:=1 +# parallel builds for scons +ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +MIXXX_SCONS_FLAGS += -j$(NUMJOBS) endif -MIXXX_SCONS_FLAGS += -j$(NCPUS) prefix=/usr install_root=$(CURDIR)/debian/tmp/usr -SCONS = scons - -configure: configure-stamp -configure-stamp: - dh_testdir - touch configure-stamp - +MIXXX_SCONS_FLAGS += prefix=/usr +MIXXX_SCONS_FLAGS += install_root=$(CURDIR)/debian/tmp/usr -build: build-stamp +%: + dh $@ --parallel -build-stamp: configure-stamp - dh_testdir - - mkdir -p $(CURDIR)/debian/tmp/usr - - # Add here commands to compile the package. - ($(SCONS) $(MIXXX_SCONS_FLAGS)) +override_dh_auto_build: + scons $(MIXXX_SCONS_FLAGS) w=1 docbook-to-man debian/mixxx.sgml > mixxx.1 - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp configure-stamp - rm -f mixxx.1 - - # Add here commands to clean up after the build process. - ($(SCONS) $(MIXXX_SCONS_FLAGS) -c) - # hand cleaning! - rm -rf src/.{configure.def,moc,obj,summary.log,ui} src/{mixxx,a.out,Makefile} - rm -f build/*.pyc - rm -f .sconsign.dblite - rm -rf .sconf_temp - rm -f $(CURDIR)/debian/tmp - - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - mkdir -p $(CURDIR)/debian/tmp/usr - mkdir -p $(CURDIR)/debian/tmp/usr/share/applications - mkdir -p $(CURDIR)/debian/tmp/usr/share/mixxx - # Add here commands to install the package into debian/mixxx. - $(SCONS) $(MIXXX_SCONS_FLAGS) install - #the scons prefix path is in MIXXX_SCONS_FLAGS at the top of this file. - #(cd src; $(MAKE) install INSTALL_ROOT=$(CURDIR)/debian/tmp DESTDIR=$(CURDIR)/debian/tmp) - - dh_install --sourcedir=$(CURDIR)/debian/tmp - -# Build architecture-independent files here. -binary-indep: build install -# We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installchangelogs - dh_installdocs - dh_installexamples - # Install mixxx.mixxx-usb.udev. - dh_installudev --name=mixxx-usb -# dh_install - dh_installmenu - dh_desktop -# dh_installdebconf -# dh_installlogrotate -# dh_installemacsen -# dh_installpam -# dh_installmime -# dh_installinit -# dh_installcron -# dh_installinfo - dh_installman mixxx.1 - dh_link -# We don't want our binaries stripped. -# dh_strip - dh_compress -Xpdf - dh_fixperms -# dh_perl -# dh_python -# dh_makeshlibs - dh_installdeb - dh_shlibdeps -- --ignore-missing-info #This command complains about libQtXml.so.4 as of Ubuntu 8.10 (Intrepid), unless I tell it to ignore missing info. I don't understand why - Albert 04/13/2009 - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -# .PHONY: build clean binary-indep binary-arch binary install configure -.PHONY: build binary-indep binary-arch binary install configure +override_dh_auto_clean: + scons $(MIXXX_SCONS_FLAGS) -c || true + rm -rf .sconf_temp/ cache/ linux_build/ + dh_clean .sconsign.dblite cachecustom.py \ + config.log src/build.h build/*.pyc mixxx.1 + dh_auto_clean + +override_dh_auto_install: + scons $(MIXXX_SCONS_FLAGS) install + find $(CURDIR)/debian/tmp \( -name COPYING -o -name Thumbs.db \ + -o -name shifter.sh -o -name '*.xsl' -o -name '*.php' \) \ + -exec rm -f {} \; + find $(CURDIR)/debian/tmp -name '*.js' -exec chmod -x {} \; + find $(CURDIR)/debian/tmp/usr/share/mixxx/ -type f -exec chmod -x {} \; + +override_dh_gencontrol: + dh_gencontrol -- $(SUBSTVARS) diff --git a/build/depends.py b/build/depends.py index d90a435782d3..178e10f8c9b4 100644 --- a/build/depends.py +++ b/build/depends.py @@ -12,6 +12,8 @@ def configure(self, build, conf): if not conf.CheckLib('portaudio'): raise Exception( 'Did not find libportaudio.a, portaudio.lib, or the PortAudio-v19 development header files.') + elif build.platform_is_linux: + build.env.ParseConfig('pkg-config portaudio-2.0 --silence-errors --cflags --libs') # Turn on PortAudio support in Mixxx build.env.Append(CPPDEFINES='__PORTAUDIO__') @@ -39,6 +41,8 @@ def configure(self, build, conf): # Check for PortMidi libs = ['portmidi', 'libportmidi'] headers = ['portmidi.h'] + if build.platform_is_windows and build.static_dependencies: + conf.CheckLib('advapi32') if build.platform_is_windows: # We have this special branch here because on Windows we might want # to link PortMidi statically which we don't want to do on other @@ -91,12 +95,12 @@ def configure(self, build, conf): build.env.Append(LINKFLAGS='-framework CoreServices') class IOKit(Dependence): - """IOKit is used to get battery measurements on OS X and iOS.""" + """Used for battery measurements and controlling the screensaver on OS X and iOS.""" def configure(self, build, conf): if not build.platform_is_osx: return build.env.Append( - CPPPATH='/Library/Frameworks/IOKit.framework/Headers/') + CPPPATH='/System/Library/Frameworks/IOKit.framework/Headers/') build.env.Append(LINKFLAGS='-framework IOKit') class UPower(Dependence): @@ -153,6 +157,12 @@ def configure(self, build, conf): raise Exception( "Did not find libsndfile or it\'s development headers") build.env.Append(CPPDEFINES='__SNDFILE__') + if conf.CheckDeclaration('SFC_SET_COMPRESSION_LEVEL', '#include "sndfile.h"'): + build.env.Append(CPPDEFINES='SFC_SUPPORTS_SET_COMPRESSION_LEVEL') + + if build.platform_is_windows and build.static_dependencies: + build.env.Append(CPPDEFINES='FLAC__NO_DLL') + conf.CheckLib('g72x') def sources(self, build): return ['sources/soundsourcesndfile.cpp'] @@ -223,7 +233,7 @@ def enabled_modules(build): qt5 = Qt.qt5_enabled(build) qt_modules = [ 'QtCore', 'QtGui', 'QtOpenGL', 'QtXml', 'QtSvg', - 'QtSql', 'QtScript', 'QtXmlPatterns', 'QtNetwork', + 'QtSql', 'QtScript', 'QtNetwork', 'QtTest', 'QtScriptTools' ] if qt5: @@ -248,8 +258,13 @@ def configure(self, build, conf): qt5 = Qt.qt5_enabled(build) # Emit various Qt defines - build.env.Append(CPPDEFINES=['QT_SHARED', - 'QT_TABLET_SUPPORT']) + build.env.Append(CPPDEFINES=['QT_TABLET_SUPPORT']) + + if build.static_qt: + build.env.Append(CPPDEFINES='QT_NODLL') + else: + build.env.Append(CPPDEFINES='QT_SHARED') + if qt5: # Enable qt4 support. build.env.Append(CPPDEFINES='QT_DISABLE_DEPRECATED_BEFORE') @@ -258,6 +273,11 @@ def configure(self, build, conf): build.flags['qt_sqlite_plugin'] = util.get_flags( build.env, 'qt_sqlite_plugin', 0) + # Link in SQLite library if Qt is compiled statically + if build.platform_is_windows and build.static_dependencies \ + and build.flags['qt_sqlite_plugin'] == 0 : + conf.CheckLib('sqlite3'); + # Enable Qt include paths if build.platform_is_linux: if qt5 and not conf.CheckForPKG('Qt5Core', '5.0'): @@ -265,6 +285,7 @@ def configure(self, build, conf): elif not qt5 and not conf.CheckForPKG('QtCore', '4.6'): raise Exception('QT >= 4.6 not found') + qt_modules.extend(['QtDBus']) # This automatically converts QtXXX to Qt5XXX where appropriate. if qt5: build.env.EnableQt5Modules(qt_modules, debug=False) @@ -338,31 +359,61 @@ def configure(self, build, conf): # appropriate. if qt5: build.env.EnableQt5Modules(qt_modules, + staticdeps=build.static_qt, debug=build.build_is_debug) else: build.env.EnableQt4Modules(qt_modules, + staticdeps=build.static_qt, debug=build.build_is_debug) - # if build.static_dependencies: - # # Pulled from qt-4.8.2-source\mkspecs\win32-msvc2010\qmake.conf - # # QtCore - # build.env.Append(LIBS = 'kernel32') - # build.env.Append(LIBS = 'user32') # QtGui, QtOpenGL, libHSS1394 - # build.env.Append(LIBS = 'shell32') - # build.env.Append(LIBS = 'uuid') - # build.env.Append(LIBS = 'ole32') # QtGui, - # build.env.Append(LIBS = 'advapi32') # QtGui, portaudio, portmidi - # build.env.Append(LIBS = 'ws2_32') # QtGui, QtNetwork, libshout - # # QtGui - # build.env.Append(LIBS = 'gdi32') #QtOpenGL - # build.env.Append(LIBS = 'comdlg32') - # build.env.Append(LIBS = 'oleaut32') - # build.env.Append(LIBS = 'imm32') - # build.env.Append(LIBS = 'winmm') - # build.env.Append(LIBS = 'winspool') - # # QtOpenGL - # build.env.Append(LIBS = 'glu32') - # build.env.Append(LIBS = 'opengl32') + if build.static_qt: + # Pulled from qt-4.8.2-source\mkspecs\win32-msvc2010\qmake.conf + # QtCore + build.env.Append(LIBS = 'kernel32') + build.env.Append(LIBS = 'user32') # QtGui, QtOpenGL, libHSS1394 + build.env.Append(LIBS = 'shell32') + build.env.Append(LIBS = 'uuid') + build.env.Append(LIBS = 'ole32') # QtGui, + build.env.Append(LIBS = 'advapi32') # QtGui, portaudio, portmidi + build.env.Append(LIBS = 'ws2_32') # QtGui, QtNetwork, libshout + # QtGui + build.env.Append(LIBS = 'gdi32') #QtOpenGL, libshout + build.env.Append(LIBS = 'comdlg32') + build.env.Append(LIBS = 'oleaut32') + build.env.Append(LIBS = 'imm32') + build.env.Append(LIBS = 'winmm') + build.env.Append(LIBS = 'winspool') + # QtOpenGL + build.env.Append(LIBS = 'glu32') + build.env.Append(LIBS = 'opengl32') + + # QtNetwork openssl-linked + build.env.Append(LIBS = 'crypt32') + + # NOTE(rryan): If you are adding a plugin here, you must also + # update src/mixxxapplication.cpp to define a Q_IMPORT_PLUGIN + # for it. Not all imageformats plugins are built as .libs when + # building Qt statically on Windows. Check the build environment + # to see exactly what's available as a standalone .lib vs linked + # into Qt .libs by default. + + # iconengines plugins + build.env.Append(LIBPATH=[ + os.path.join(build.env['QTDIR'],'plugins/iconengines')]) + build.env.Append(LIBS = 'qsvgicon') + + # imageformats plugins + build.env.Append(LIBPATH=[ + os.path.join(build.env['QTDIR'],'plugins/imageformats')]) + build.env.Append(LIBS = 'qico') + build.env.Append(LIBS = 'qsvg') + build.env.Append(LIBS = 'qtga') + + # accessibility plugins + build.env.Append(LIBPATH=[ + os.path.join(build.env['QTDIR'],'plugins/accessible')]) + build.env.Append(LIBS = 'qtaccessiblewidgets') + # Set the rpath for linux/bsd/osx. # This is not supported on OS X before the 10.5 SDK. @@ -389,7 +440,6 @@ def configure(self, build, conf): build.env.Append(CPPPATH="#lib/gtest-1.7.0/include") class FidLib(Dependence): - def sources(self, build): symbol = None if build.platform_is_windows: @@ -420,8 +470,27 @@ def configure(self, build, conf): build.env.Append(CPPPATH="#lib/replaygain") +class Ebur128Mit(Dependence): + INTERNAL_PATH = '#lib/libebur128-1.1.0' + INTERNAL_LINK = False + + def sources(self, build): + if self.INTERNAL_LINK: + return ['%s/ebur128/ebur128.c' % self.INTERNAL_PATH] + + def configure(self, build, conf, env=None): + if env is None: + env = build.env + if not conf.CheckLib(['ebur128', 'libebur128']): + self.INTERNAL_LINK = True; + env.Append(CPPPATH=['%s/ebur128' % self.INTERNAL_PATH]) + #env.Append(CPPDEFINES='USE_SPEEX_RESAMPLER') # Required for unused EBUR128_MODE_TRUE_PEAK + if not conf.CheckHeader('sys/queue.h'): + env.Append(CPPPATH=['%s/ebur128/queue' % self.INTERNAL_PATH]) + + class SoundTouch(Dependence): - SOUNDTOUCH_INTERNAL_PATH = '#lib/soundtouch-1.8.0' + SOUNDTOUCH_INTERNAL_PATH = '#lib/soundtouch-1.9.2' INTERNAL_LINK = True def sources(self, build): @@ -455,7 +524,7 @@ def configure(self, build, conf, env=None): if build.platform_is_linux: # Try using system lib if conf.CheckForPKG('soundtouch', '1.8.0'): - # No System Lib found + # System Lib found build.env.ParseConfig('pkg-config soundtouch --silence-errors \ --cflags --libs') self.INTERNAL_LINK = False @@ -511,7 +580,7 @@ def configure(self, build, conf): build.env.Append(CPPDEFINES='CHROMAPRINT_NODLL') # On Windows, we link chromaprint with FFTW3. - if not conf.CheckLib(['fftw', 'libfftw', 'fftw3', 'libfftw3']): + if not conf.CheckLib(['fftw', 'libfftw', 'fftw3', 'libfftw3', 'libfftw-3.3']): raise Exception( "Could not find fftw3 or its development headers.") @@ -549,6 +618,12 @@ def sources(self, build): return ['#lib/qtscript-bytearray/bytearrayclass.cpp', '#lib/qtscript-bytearray/bytearrayprototype.cpp'] +class PortAudioRingBuffer(Dependence): + def configure(self, build, conf): + build.env.Append(CPPPATH='#lib/portaudio') + + def sources(self, build): + return ['#lib/portaudio/pa_ringbuffer.c'] class Reverb(Dependence): def configure(self, build, conf): @@ -567,30 +642,28 @@ def enabled(self, build): return True def sources(self, build): - sources = ["mixxxkeyboard.cpp", - - "configobject.cpp", - "control/control.cpp", + sources = ["control/control.cpp", + "control/controlaudiotaperpot.cpp", "control/controlbehavior.cpp", + "control/controleffectknob.cpp", + "control/controlindicator.cpp", + "control/controllinpotmeter.cpp", + "control/controllogpotmeter.cpp", "control/controlmodel.cpp", - "controlobject.cpp", - "controlobjectslave.cpp", - "controlobjectscript.cpp", - "controlaudiotaperpot.cpp", - "controlpotmeter.cpp", - "controllinpotmeter.cpp", - "controllogpotmeter.cpp", - "controleffectknob.cpp", - "controlpushbutton.cpp", - "controlindicator.cpp", - "controlttrotary.cpp", + "control/controlobject.cpp", + "control/controlobjectscript.cpp", + "control/controlpotmeter.cpp", + "control/controlproxy.cpp", + "control/controlpushbutton.cpp", + "control/controlttrotary.cpp", "controllers/dlgcontrollerlearning.cpp", "controllers/dlgprefcontroller.cpp", "controllers/dlgprefcontrollers.cpp", - "dlgabout.cpp", - "dlgdevelopertools.cpp", + "dialog/dlgabout.cpp", + "dialog/dlgdevelopertools.cpp", + "preferences/configobject.cpp", "preferences/dialog/dlgprefautodj.cpp", "preferences/dialog/dlgprefcontrols.cpp", "preferences/dialog/dlgprefcrossfader.cpp", @@ -605,9 +678,12 @@ def sources(self, build): "preferences/dialog/dlgprefsounditem.cpp", "preferences/dialog/dlgprefwaveform.cpp", "preferences/settingsmanager.cpp", + "preferences/replaygainsettings.cpp", + "preferences/broadcastsettings.cpp", "preferences/upgrade.cpp", "preferences/dlgpreferencepage.cpp", + "effects/effectmanifest.cpp", "effects/effectmanifestparameter.cpp", @@ -628,9 +704,13 @@ def sources(self, build): "effects/native/nativebackend.cpp", "effects/native/bitcrushereffect.cpp", + "effects/native/balanceeffect.cpp", "effects/native/linkwitzriley8eqeffect.cpp", "effects/native/bessel4lvmixeqeffect.cpp", "effects/native/bessel8lvmixeqeffect.cpp", + "effects/native/threebandbiquadeqeffect.cpp", + "effects/native/biquadfullkilleqeffect.cpp", + "effects/native/loudnesscontoureffect.cpp", "effects/native/graphiceqeffect.cpp", "effects/native/flangereffect.cpp", "effects/native/filtereffect.cpp", @@ -639,6 +719,7 @@ def sources(self, build): "effects/native/echoeffect.cpp", "effects/native/autopaneffect.cpp", "effects/native/phasereffect.cpp", + "effects/native/metronomeeffect.cpp", "engine/effects/engineeffectsmanager.cpp", "engine/effects/engineeffectrack.cpp", @@ -661,6 +742,7 @@ def sources(self, build): "engine/enginefilterbessel8.cpp", "engine/enginefilterbutterworth4.cpp", "engine/enginefilterbutterworth8.cpp", + "engine/enginefilterlinkwitzriley2.cpp", "engine/enginefilterlinkwitzriley4.cpp", "engine/enginefilterlinkwitzriley8.cpp", "engine/enginefilter.cpp", @@ -690,15 +772,17 @@ def sources(self, build): "engine/clockcontrol.cpp", "engine/readaheadmanager.cpp", "engine/enginetalkoverducking.cpp", - "cachingreader.cpp", - "cachingreaderchunk.cpp", - "cachingreaderworker.cpp", + "engine/cachingreader.cpp", + "engine/cachingreaderchunk.cpp", + "engine/cachingreaderworker.cpp", "analyzer/analyzerqueue.cpp", "analyzer/analyzerwaveform.cpp", "analyzer/analyzergain.cpp", + "analyzer/analyzerebur128.cpp", "controllers/controller.cpp", + "controllers/controllerdebug.cpp", "controllers/controllerengine.cpp", "controllers/controllerenumerator.cpp", "controllers/controllerlearningeventfilter.cpp", @@ -723,17 +807,19 @@ def sources(self, build): "controllers/midi/midienumerator.cpp", "controllers/midi/midioutputhandler.cpp", "controllers/softtakeover.cpp", + "controllers/keyboard/keyboardeventfilter.cpp", "main.cpp", "mixxx.cpp", "mixxxapplication.cpp", "errordialoghandler.cpp", - "sources/soundsourceproviderregistry.cpp", + "sources/audiosource.cpp", + "sources/soundsource.cpp", "sources/soundsourceplugin.cpp", "sources/soundsourcepluginlibrary.cpp", - "sources/soundsource.cpp", - "sources/audiosource.cpp", + "sources/soundsourceproviderregistry.cpp", + "sources/soundsourceproxy.cpp", "widget/controlwidgetconnection.cpp", "widget/wbasewidget.cpp", @@ -744,6 +830,7 @@ def sources(self, build): "widget/wlabel.cpp", "widget/wtracktext.cpp", "widget/wnumber.cpp", + "widget/wbeatspinbox.cpp", "widget/wnumberdb.cpp", "widget/wnumberpos.cpp", "widget/wnumberrate.cpp", @@ -763,16 +850,21 @@ def sources(self, build): "widget/wskincolor.cpp", "widget/wsearchlineedit.cpp", "widget/wpixmapstore.cpp", + "widget/paintable.cpp", "widget/wimagestore.cpp", "widget/hexspinbox.cpp", "widget/wtrackproperty.cpp", "widget/wstarrating.cpp", "widget/weffectchain.cpp", "widget/weffect.cpp", + "widget/weffectselector.cpp", "widget/weffectparameter.cpp", + "widget/weffectparameterknob.cpp", + "widget/weffectparameterknobcomposed.cpp", "widget/weffectbuttonparameter.cpp", "widget/weffectparameterbase.cpp", "widget/wtime.cpp", + "widget/wrecordingduration.cpp", "widget/wkey.cpp", "widget/wbattery.cpp", "widget/wcombobox.cpp", @@ -798,6 +890,10 @@ def sources(self, build): "widget/wlibrarytableview.cpp", "widget/wanalysislibrarytableview.cpp", "widget/wlibrarytextbrowser.cpp", + + "database/mixxxdb.cpp", + "database/schemamanager.cpp", + "library/trackcollection.cpp", "library/basesqltablemodel.cpp", "library/basetrackcache.cpp", @@ -813,6 +909,11 @@ def sources(self, build): "library/coverartcache.cpp", "library/coverartutils.cpp", + "library/crate/cratestorage.cpp", + "library/crate/cratefeature.cpp", + "library/crate/cratefeaturehelper.cpp", + "library/crate/cratetablemodel.cpp", + "library/playlisttablemodel.cpp", "library/libraryfeature.cpp", "library/analysisfeature.cpp", @@ -858,7 +959,6 @@ def sources(self, build): "library/itunes/itunesfeature.cpp", "library/traktor/traktorfeature.cpp", - "library/cratefeature.cpp", "library/sidebarmodel.cpp", "library/library.cpp", @@ -868,8 +968,6 @@ def sources(self, build): "library/scanner/importfilestask.cpp", "library/scanner/recursivescandirectorytask.cpp", - "library/dao/cratedao.cpp", - "library/cratetablemodel.cpp", "library/dao/cuedao.cpp", "library/dao/cue.cpp", "library/dao/trackdao.cpp", @@ -877,9 +975,9 @@ def sources(self, build): "library/dao/libraryhashdao.cpp", "library/dao/settingsdao.cpp", "library/dao/analysisdao.cpp", + "library/dao/autodjcratesdao.cpp", "library/librarycontrol.cpp", - "library/schemamanager.cpp", "library/songdownloader.cpp", "library/starrating.cpp", "library/stardelegate.cpp", @@ -896,8 +994,6 @@ def sources(self, build): "library/parserm3u.cpp", "library/parsercsv.cpp", - "soundsourceproxy.cpp", - "widget/wwaveformviewer.cpp", "waveform/sharedglcontext.cpp", @@ -926,13 +1022,14 @@ def sources(self, build): "waveform/renderers/waveformrenderersignalbase.cpp", "waveform/renderers/waveformmark.cpp", + "waveform/renderers/waveformmarkproperties.cpp", "waveform/renderers/waveformmarkset.cpp", "waveform/renderers/waveformmarkrange.cpp", - "waveform/renderers/glwaveformrenderersimplesignal.cpp", - "waveform/renderers/glwaveformrendererrgb.cpp", - "waveform/renderers/glwaveformrendererfilteredsignal.cpp", - "waveform/renderers/glslwaveformrenderersignal.cpp", - "waveform/renderers/glvsynctestrenderer.cpp", + "waveform/renderers/glwaveformrenderersimplesignal.cpp", + "waveform/renderers/glwaveformrendererrgb.cpp", + "waveform/renderers/glwaveformrendererfilteredsignal.cpp", + "waveform/renderers/glslwaveformrenderersignal.cpp", + "waveform/renderers/glvsynctestrenderer.cpp", "waveform/widgets/waveformwidgetabstract.cpp", "waveform/widgets/emptywaveformwidget.cpp", @@ -961,20 +1058,20 @@ def sources(self, build): "skin/pixmapsource.cpp", "skin/launchimage.cpp", - "trackinfoobject.cpp", + "track/beatfactory.cpp", "track/beatgrid.cpp", "track/beatmap.cpp", - "track/beatfactory.cpp", "track/beatutils.cpp", - "track/keys.cpp", + "track/bpm.cpp", "track/keyfactory.cpp", + "track/keys.cpp", "track/keyutils.cpp", "track/playcounter.cpp", "track/replaygain.cpp", - "track/bpm.cpp", - "track/tracknumbers.cpp", + "track/track.cpp", "track/trackmetadata.cpp", "track/trackmetadatataglib.cpp", + "track/tracknumbers.cpp", "mixer/auxiliary.cpp", "mixer/baseplayer.cpp", @@ -997,12 +1094,19 @@ def sources(self, build): "encoder/encoder.cpp", "encoder/encodermp3.cpp", "encoder/encodervorbis.cpp", + "encoder/encoderwave.cpp", + "encoder/encodersndfileflac.cpp", + "encoder/encodermp3settings.cpp", + "encoder/encodervorbissettings.cpp", + "encoder/encoderwavesettings.cpp", + "encoder/encoderflacsettings.cpp", + "encoder/encoderbroadcastsettings.cpp", - "util/pa_ringbuffer.c", "util/sleepableqthread.cpp", "util/statsmanager.cpp", "util/stat.cpp", "util/statmodel.cpp", + "util/duration.cpp", "util/time.cpp", "util/timer.cpp", "util/performancetimer.cpp", @@ -1020,14 +1124,29 @@ def sources(self, build): "util/tapfilter.cpp", "util/movinginterquartilemean.cpp", "util/console.cpp", - "util/dbid.cpp", + "util/db/dbconnection.cpp", + "util/db/dbconnectionpool.cpp", + "util/db/dbconnectionpooler.cpp", + "util/db/dbconnectionpooled.cpp", + "util/db/dbid.cpp", + "util/db/fwdsqlquery.cpp", + "util/db/fwdsqlqueryselectresult.cpp", + "util/db/sqllikewildcardescaper.cpp", + "util/db/sqlqueryfinisher.cpp", + "util/db/sqlstringformatter.cpp", + "util/db/sqltransaction.cpp", "util/sample.cpp", "util/samplebuffer.cpp", "util/singularsamplebuffer.cpp", "util/circularsamplebuffer.cpp", "util/rotary.cpp", + "util/logger.cpp", "util/logging.cpp", "util/cmdlineargs.cpp", + "util/audiosignal.cpp", + "util/widgethider.cpp", + "util/autohidpi.cpp", + "util/screensaver.cpp", '#res/mixxx.qrc' ] @@ -1050,8 +1169,8 @@ def sources(self, build): 'controllers/dlgcontrollerlearning.ui', 'controllers/dlgprefcontrollerdlg.ui', 'controllers/dlgprefcontrollersdlg.ui', - 'dlgaboutdlg.ui', - 'dlgdevelopertoolsdlg.ui', + 'dialog/dlgaboutdlg.ui', + 'dialog/dlgdevelopertoolsdlg.ui', 'library/autodj/dlgautodj.ui', 'library/dlganalysis.ui', 'library/dlgcoverartfullsize.ui', @@ -1110,6 +1229,10 @@ def configure(self, build, conf): build.env.Append(CPPDEFINES='MIXXX_BUILD_DEBUG') elif build.build_is_release: build.env.Append(CPPDEFINES='MIXXX_BUILD_RELEASE') + # Disable assert.h assertions in release mode. Some libraries use + # this as a signal for when to enable code that should be disabled + # in release mode. + build.env.Append(CPPDEFINES='NDEBUG') # In a release build we want to disable all Q_ASSERTs in Qt headers # that we include. We can't define QT_NO_DEBUG because that would @@ -1124,20 +1247,29 @@ def configure(self, build, conf): # Default GNU Options build.env.Append(CCFLAGS='-pipe') build.env.Append(CCFLAGS='-Wall') - # Quiet down Clang warnings about inconsistent use of override - # keyword until Qt fixes qt_metacall. if build.compiler_is_clang: + # Quiet down Clang warnings about inconsistent use of override + # keyword until Qt fixes qt_metacall. build.env.Append(CCFLAGS='-Wno-inconsistent-missing-override') + + # Do not warn about use of the deprecated 'register' keyword + # since it produces noise from libraries we depend on using it. + build.env.Append(CCFLAGS='-Wno-deprecated-register') + + # Warn about implicit fallthrough. + build.env.Append(CCFLAGS='-Wimplicit-fallthrough') + + # Enable thread-safety analysis. + # http://clang.llvm.org/docs/ThreadSafetyAnalysis.html + build.env.Append(CCFLAGS='-Wthread-safety') build.env.Append(CCFLAGS='-Wextra') # Always generate debugging info. build.env.Append(CCFLAGS='-g') elif build.toolchain_is_msvs: # Validate the specified winlib directory exists - mixxx_lib_path = SCons.ARGUMENTS.get( - 'winlib', '..\\..\\..\\mixxx-win32lib-msvc100-release') + mixxx_lib_path = build.winlib_path if not os.path.exists(mixxx_lib_path): - print mixxx_lib_path raise Exception("Winlib path does not exist! Please specify your winlib directory" "path by running 'scons winlib=[path]'") Script.Exit(1) @@ -1171,7 +1303,7 @@ def configure(self, build, conf): # executables linked regardless of whether we are creating a debug # build. Having PDB files for our releases is helpful for debugging. build.env.Append(LINKFLAGS='/DEBUG') - build.env.Append(CCFLAGS='/Zi') + build.env.Append(CCFLAGS='/Zi /Fd${TARGET}.pdb') if build.build_is_debug: # Important: We always build Mixxx with the Multi-Threaded DLL @@ -1290,10 +1422,10 @@ def configure(self, build, conf): CPPDEFINES=('UNIX_LIB_PATH', r'\"%s\"' % lib_path)) def depends(self, build): - return [SoundTouch, ReplayGain, PortAudio, PortMIDI, Qt, TestHeaders, + return [SoundTouch, ReplayGain, Ebur128Mit, PortAudio, PortMIDI, Qt, TestHeaders, FidLib, SndFile, FLAC, OggVorbis, OpenGL, TagLib, ProtoBuf, - Chromaprint, RubberBand, SecurityFramework, CoreServices, - QtScriptByteArray, Reverb, FpClassify] + Chromaprint, RubberBand, SecurityFramework, CoreServices, IOKit, + QtScriptByteArray, Reverb, FpClassify, PortAudioRingBuffer] def post_dependency_check_configure(self, build, conf): """Sets up additional things in the Environment that must happen diff --git a/build/features.py b/build/features.py index 0f5c9153b235..5429c6d10a69 100644 --- a/build/features.py +++ b/build/features.py @@ -371,7 +371,7 @@ def sources(self, build): class Vamp(Feature): INTERNAL_LINK = False - INTERNAL_VAMP_PATH = '#lib/vamp-2.3' + INTERNAL_VAMP_PATH = '#lib/vamp-2.6' def description(self): return "Vamp Analyzer support" @@ -390,6 +390,7 @@ def configure(self, build, conf): return build.env.Append(CPPDEFINES='__VAMP__') + build.env.Append(CPPDEFINES='kiss_fft_scalar=double') # If there is no system vamp-hostdk installed, then we'll directly link # the vamp-hostsdk. @@ -422,7 +423,8 @@ def sources(self, build): if self.INTERNAL_LINK: hostsdk_src_path = '%s/src/vamp-hostsdk' % self.INTERNAL_VAMP_PATH sources.extend(path % hostsdk_src_path for path in - ['%s/PluginBufferingAdapter.cpp', + ['%s/Files.cpp', + '%s/PluginBufferingAdapter.cpp', '%s/PluginChannelAdapter.cpp', '%s/PluginHostAdapter.cpp', '%s/PluginInputDomainAdapter.cpp', @@ -548,27 +550,41 @@ def configure(self, build, conf): build.env.Append(CCFLAGS='-fcolor-diagnostics') -class AddressSanitizer(Feature): +class Sanitizers(Feature): + # Known sanitizers, their names, and their -fsanitize=foo argument. + SANITIZERS = [('asan', 'AddressSanitizer', 'address'), + ('ubsan', 'UndefinedBehaviorSanitizer', 'undefined'), + ('tsan', 'ThreadSanitizer', 'thread')] def description(self): - return "Address Sanitizer" + return "Clang Sanitizers (asan, ubsan, tsan, etc.)" def enabled(self, build): - build.flags['asan'] = util.get_flags(build.env, 'asan', 0) - return bool(int(build.flags['asan'])) + any_enabled = False + for keyword, _, _ in Sanitizers.SANITIZERS: + build.flags[keyword] = util.get_flags(build.env, keyword, 0) + any_enabled = any_enabled or bool(int(build.flags[keyword])) + return any_enabled def add_options(self, build, vars): - vars.Add("asan", "Set to 1 to enable linking against the Clang AddressSanitizer.", 0) + for keyword, name, _ in Sanitizers.SANITIZERS: + vars.Add(keyword, "Set to 1 to enable the Clang %s." % name, 0) def configure(self, build, conf): if not self.enabled(build): return if not build.compiler_is_clang: - raise Exception('Address Sanitizer is only available using clang.') + raise Exception('Sanitizers are only available when using clang.') - # -fno-omit-frame-pointer gets much better stack traces in asan output. - build.env.Append(CCFLAGS="-fsanitize=address -fno-omit-frame-pointer") - build.env.Append(LINKFLAGS="-fsanitize=address -fno-omit-frame-pointer") + sanitizers = [] + for keyword, _, fsanitize in Sanitizers.SANITIZERS: + if bool(int(build.flags[keyword])): + sanitizers.append(fsanitize) + + # The Optimize feature below checks whether we are enabled and prevents + # -fomit-frame-pointer if any sanitizer is enabled. + build.env.Append(CCFLAGS="-fsanitize=%s" % ','.join(sanitizers)) + build.env.Append(LINKFLAGS="-fsanitize=%s" % ','.join(sanitizers)) class PerfTools(Feature): @@ -667,7 +683,7 @@ def description(self): return "Debugging message output" def enabled(self, build): - build.flags['qdebug'] = util.get_flags(build.env, 'qdebug', 0) + build.flags['qdebug'] = util.get_flags(build.env, 'qdebug', 1) if build.platform_is_windows: if build.build_is_debug: # Turn general debugging flag on too if debug build is specified @@ -724,7 +740,7 @@ def configure(self, build, conf): class Profiling(Feature): def description(self): - return "gprof/Saturn profiling support" + return "profiling (e.g. gprof) support" def enabled(self, build): build.flags['profiling'] = util.get_flags(build.env, 'profiling', 0) @@ -736,7 +752,7 @@ def enabled(self, build): def add_options(self, build, vars): if not build.platform_is_windows: vars.Add('profiling', - '(DEVELOPER) Set to 1 to enable profiling using gprof (Linux) or Saturn (OS X)', 0) + '(DEVELOPER) Set to 1 to enable profiling using gprof (Linux). Disables -fomit-frame-pointer.', 0) def configure(self, build, conf): if not self.enabled(build): @@ -744,9 +760,6 @@ def configure(self, build, conf): if build.platform_is_linux or build.platform_is_bsd: build.env.Append(CCFLAGS='-pg') build.env.Append(LINKFLAGS='-pg') - elif build.platform_is_osx: - build.env.Append(CCFLAGS='-finstrument-functions') - build.env.Append(LINKFLAGS='-lSaturn') class TestSuite(Feature): @@ -808,9 +821,9 @@ def sources(self, build): return [] -class Shoutcast(Feature): +class LiveBroadcasting(Feature): def description(self): - return "Shoutcast Broadcasting (OGG/MP3)" + return "Live Broadcasting Support" def enabled(self, build): build.flags['shoutcast'] = util.get_flags(build.env, 'shoutcast', 1) @@ -819,14 +832,14 @@ def enabled(self, build): return False def add_options(self, build, vars): - vars.Add('shoutcast', 'Set to 1 to enable shoutcast support', 1) + vars.Add('shoutcast', 'Set to 1 to enable live broadcasting support', 1) def configure(self, build, conf): if not self.enabled(build): return libshout_found = conf.CheckLib(['libshout', 'shout']) - build.env.Append(CPPDEFINES='__SHOUTCAST__') + 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.') @@ -834,12 +847,13 @@ def configure(self, build, conf): if build.platform_is_windows and build.static_dependencies: conf.CheckLib('winmm') conf.CheckLib('ws2_32') + conf.CheckLib('gdi32') def sources(self, build): - depends.Qt.uic(build)('preferences/dialog/dlgprefshoutcastdlg.ui') - return ['preferences/dialog/dlgprefshoutcast.cpp', - 'shoutcast/shoutcastmanager.cpp', - 'engine/sidechain/engineshoutcast.cpp'] + depends.Qt.uic(build)('preferences/dialog/dlgprefbroadcastdlg.ui') + return ['preferences/dialog/dlgprefbroadcast.cpp', + 'broadcast/broadcastmanager.cpp', + 'engine/sidechain/enginebroadcast.cpp'] class Opus(Feature): @@ -981,7 +995,7 @@ class Optimize(Feature): LEVEL_PORTABLE = 'portable' LEVEL_NATIVE = 'native' LEVEL_LEGACY = 'legacy' - + LEVEL_FASTBUILD = 'fastbuild' LEVEL_DEFAULT = LEVEL_PORTABLE def description(self): @@ -1012,7 +1026,8 @@ def get_optimization_level(build): optimize_level = Optimize.LEVEL_OFF if optimize_level not in (Optimize.LEVEL_OFF, Optimize.LEVEL_PORTABLE, - Optimize.LEVEL_NATIVE, Optimize.LEVEL_LEGACY): + Optimize.LEVEL_NATIVE, Optimize.LEVEL_LEGACY, + Optimize.LEVEL_FASTBUILD): raise Exception("optimize={} is not supported. " "Use portable, native, legacy or off" .format(optimize_level)) @@ -1026,11 +1041,17 @@ def add_options(self, build, vars): vars.Add( 'optimize', 'Set to:\n' \ ' portable: sse2 CPU (>= Pentium 4)\n' \ + ' fastbuild: portable, but without costly optimization steps\n' \ ' native: optimized for the CPU of this system\n' \ ' legacy: pure i386 code' \ ' off: no optimization' \ , Optimize.LEVEL_DEFAULT) + def build_status(self, level, text=None): + if text is None: + return level + return '%s: %s' % (level, text) + def configure(self, build, conf): if not self.enabled(build): return @@ -1038,13 +1059,15 @@ def configure(self, build, conf): optimize_level = build.flags['optimize'] if optimize_level == Optimize.LEVEL_OFF: - self.status = "off: no optimization" + self.status = self.build_status(optimize_level, "no optimization") return if build.toolchain_is_msvs: + fastbuild_enabled = optimize_level == Optimize.LEVEL_FASTBUILD + # /GL : http://msdn.microsoft.com/en-us/library/0zza0de8.aspx # !!! /GL is incompatible with /ZI, which is set by mscvdebug - build.env.Append(CCFLAGS='/GL') + build.env.Append(CCFLAGS='/GL-' if fastbuild_enabled else '/GL') # Use the fastest floating point math library # http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx @@ -1055,7 +1078,7 @@ def configure(self, build, conf): # -- this relies on ANSI control characters and tends to overwhelm # Jenkins logs) Should we turn on PGO ? # http://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx - build.env.Append(LINKFLAGS='/LTCG:NOSTATUS') + build.env.Append(LINKFLAGS='/LTCG:OFF' if fastbuild_enabled else '/LTCG:NOSTATUS') # Suggested for unused code removal # http://msdn.microsoft.com/en-us/library/ms235601.aspx @@ -1073,19 +1096,22 @@ def configure(self, build, conf): # In general, you should pick /O2 over /Ox build.env.Append(CCFLAGS='/O2') - if optimize_level == Optimize.LEVEL_PORTABLE: - # portable-binary: sse2 CPU (>= Pentium 4) - self.status = "portable: sse2 CPU (>= Pentium 4)" + if optimize_level == Optimize.LEVEL_PORTABLE or fastbuild_enabled: + # fastbuild/portable-binary: sse2 CPU (>= Pentium 4) + self.status = self.build_status(optimize_level, + "sse2 CPU (>= Pentium 4)") # SSE and SSE2 are core instructions on x64 # and consequently raise a warning message from compiler with this flag on x64. if not build.machine_is_64bit: build.env.Append(CCFLAGS='/arch:SSE2') build.env.Append(CPPDEFINES=['__SSE__', '__SSE2__']) elif optimize_level == Optimize.LEVEL_NATIVE: - self.status = "native: tuned for this CPU (%s)" % build.machine + self.status = self.build_status( + optimize_level, "tuned for this CPU (%s)" % build.machine) build.env.Append(CCFLAGS='/favor:' + build.machine) elif optimize_level == Optimize.LEVEL_LEGACY: - self.status = "legacy: pure i386 code" + self.status = self.build_status(optimize_level, + "pure i386 code") else: # Not possible to reach this code if enabled is written # correctly. @@ -1098,6 +1124,10 @@ def configure(self, build, conf): build.env.Append(CPPDEFINES=['__SSE__', '__SSE2__']) elif build.toolchain_is_gnu: + # Portable is fast enough on GNU. + if optimize_level == Optimize.LEVEL_FASTBUILD: + optimize_level = Optimize.LEVEL_PORTABLE + # Common flags to all optimizations. # -ffast-math will pevent a performance penalty by denormals # (floating point values almost Zero are treated as Zero) @@ -1109,28 +1139,32 @@ def configure(self, build, conf): build.env.Append(CCFLAGS='-ffast-math') build.env.Append(CCFLAGS='-funroll-loops') - # set -fomit-frame-pointer when we don't profile. + # set -fomit-frame-pointer when we don't profile and are not using + # Clang sanitizers. # Note: It is only included in -O on machines where it does not # interfere with debugging - if not int(build.flags['profiling']): + if not int(build.flags['profiling']) and not Sanitizers().enabled(build): build.env.Append(CCFLAGS='-fomit-frame-pointer') if optimize_level == Optimize.LEVEL_PORTABLE: # portable: sse2 CPU (>= Pentium 4) if build.architecture_is_x86: - self.status = "portable: sse2 CPU (>= Pentium 4)" + self.status = self.build_status(optimize_level, + "sse2 CPU (>= Pentium 4)") build.env.Append(CCFLAGS='-mtune=generic') # -mtune=generic pick the most common, but compatible options. # on arm platforms equivalent to -march=arch 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 -mfpmath=sse') + build.env.Append(CCFLAGS='-msse2') + build.env.Append(CCFLAGS='-mfpmath=sse') elif build.architecture_is_arm: - self.status = "portable" - build.env.Append(CCFLAGS='-mfloat-abi=hard -mfpu=neon') + self.status = self.build_status(optimize_level) + build.env.Append(CCFLAGS='-mfloat-abi=hard') + build.env.Append(CCFLAGS='-mfpu=neon') else: - self.status = "portable" + self.status = self.build_status(optimize_level) # this sets macros __SSE2_MATH__ __SSE_MATH__ __SSE2__ __SSE__ # This should be our default build for distribution # It's a little sketchy, but turning on SSE2 will gain @@ -1143,32 +1177,37 @@ def configure(self, build, conf): # -- rryan 2/2011 # Note: SSE2 is a core part of x64 CPUs elif optimize_level == Optimize.LEVEL_NATIVE: - self.status = "native: tuned for this CPU (%s)" % build.machine + self.status = self.build_status( + optimize_level, "tuned for this CPU (%s)" % build.machine) build.env.Append(CCFLAGS='-march=native') # http://en.chys.info/2010/04/what-exactly-marchnative-means/ # Note: requires gcc >= 4.2.0 # macros like __SSE2_MATH__ __SSE_MATH__ __SSE2__ __SSE__ # are set automaticaly if build.architecture_is_x86 and 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 -mfpmath=sse') + # For 32 bit builds using gcc < 5.0, the mfpmath=sse is + # not set by default (not supported on arm builds) + # If -msse is not implicite set, it falls back to mfpmath=387 + # and a compiler warning is issued (tested with gcc 4.8.4) + build.env.Append(CCFLAGS='-mfpmath=sse') elif build.architecture_is_arm: - self.status = "portable" - build.env.Append(CCFLAGS='-mfloat-abi=hard -mfpu=neon') + self.status = self.build_status(optimize_level) + build.env.Append(CCFLAGS='-mfloat-abi=hard') + build.env.Append(CCFLAGS='-mfpu=neon') elif optimize_level == Optimize.LEVEL_LEGACY: if build.architecture_is_x86: - self.status = "legacy: pure i386 code" + self.status = self.build_status( + optimize_level, "pure i386 code") build.env.Append(CCFLAGS='-mtune=generic') # -mtune=generic pick the most common, but compatible options. # on arm platforms equivalent to -march=arch else: - self.status = "legacy" + self.status = self.build_status(optimize_level) else: # Not possible to reach this code if enabled is written # correctly. raise Exception("optimize={} is not supported. " - "Use portable, native, legacy or off" + "Use portable, native, fastbuild, legacy or off" .format(optimize_level)) # what others do: @@ -1179,29 +1218,6 @@ def configure(self, build, conf): # -fstrict-aliasing -fno-schedule-insns -ffast-math -class AutoDjCrates(Feature): - def description(self): - return "Auto-DJ crates (for random tracks)" - - def enabled(self, build): - build.flags['autodjcrates'] = \ - util.get_flags(build.env, 'autodjcrates', 1) - if int(build.flags['autodjcrates']): - return True - return False - - def add_options(self, build, vars): - vars.Add('autodjcrates', - 'Set to 1 to enable crates as a source for random Auto-DJ tracks.', 1) - - def configure(self, build, conf): - if not self.enabled(build): - return - build.env.Append(CPPDEFINES='__AUTODJCRATES__') - - def sources(self, build): - return ['library/dao/autodjcratesdao.cpp'] - class MacAppStoreException(Feature): def description(self): return "Build for Mac App Store" diff --git a/build/mixxx.py b/build/mixxx.py index 9b03c609f2b3..aeed9e8e98f1 100644 --- a/build/mixxx.py +++ b/build/mixxx.py @@ -48,12 +48,16 @@ def __init__(self, target, machine, build, toolchain, available_features): if machine.lower() not in ['x86_64', 'x86', 'i686', 'i586', 'alpha', 'hppa', 'mips', 'mipsel', 's390', 'sparc', 'ia64', 'armel', 'armhf', 'hurd-i386', + 'armv5tel', 'armv5tejl', 'armv6l', 'armv6hl', + 'armv7l', 'armv7hl', 'armv7hnl', 'sh3', 'sh4', 'kfreebsd-amd64', 'kfreebsd-i386', 'i486', 'i386', 'ppc', 'ppc64', 'powerpc', 'powerpc64', 'powerpcspe', 's390x', 'amd64', 'em64t', 'intel64', 'arm64', - 'ppc64el', 'm68k', 'mips64', 'mips64el', 'mipsn32', 'mipsn32el']: + 'ppc64el', 'ppc64le', 'm68k', 'mips64', + 'mips64el', 'mipsn32', 'mipsn32el', + 'aarch64']: raise Exception("invalid machine type") if toolchain not in ['gnu', 'msvs']: @@ -111,6 +115,10 @@ def __init__(self, target, machine, build, toolchain, available_features): # Currently this only works for Windows self.static_dependencies = int(Script.ARGUMENTS.get('staticlibs', 0)) + self.static_qt = int(Script.ARGUMENTS.get('staticqt', 0)) + + self.bundle_pdbs = self.platform_is_windows and ( + self.build_is_debug or Script.ARGUMENTS.get('bundle_pdbs', '') in ('yes', 'y', '1')) logging.info("Target Platform: %s" % self.platform) logging.info("Target Machine: %s" % self.machine) @@ -119,8 +127,12 @@ def __init__(self, target, machine, build, toolchain, available_features): logging.info( "Crosscompile: %s" % ("YES" if self.crosscompile else "NO")) if self.platform_is_windows: + self.winlib_path = Script.ARGUMENTS.get('winlib', '') + logging.info("Winlib Path: %s" % self.winlib_path) logging.info("Static dependencies: %s" % ( "YES" if self.static_dependencies else "NO")) + logging.info("Static Qt: %s" % ( + "YES" if self.static_qt else "NO")) if self.crosscompile: logging.info("Host Platform: %s" % self.host_platform) @@ -320,37 +332,39 @@ def setup_osx_platform_sdk(self): print 'Automatically detecting Mac OS X SDK.' - # SDK versions in order of precedence. - sdk_versions = ( '10.11', '10.10', '10.9', '10.8', '10.7', '10.6', '10.5', ) - clang_sdk_versions = ( '10.11', '10.10', '10.9', '10.8', '10.7', ) - valid_cpp_lib_versions = ( 'libstdc++', 'libc++', ) - - # By default use old gcc C++ library version - osx_stdlib = Script.ARGUMENTS.get('stdlib', 'libstdc++') - if osx_stdlib not in valid_cpp_lib_versions: - raise Exception('Unsupported C++ stdlib version') - - if osx_stdlib == 'libc++': - sdk_version_default = '10.9' - else: - sdk_version_default = '10.5' - - min_sdk_version = Script.ARGUMENTS.get('osx_sdk_version_min', sdk_version_default) - if min_sdk_version not in sdk_versions: - raise Exception('Unsupported osx_sdk_version_min value') - if osx_stdlib == 'libc++' and min_sdk_version not in clang_sdk_versions: - raise Exception('stdlib=libc++ requires osx_sdk_version_min >= 10.7') + # Returns a version like "10.8.0". We strip off the last ".0". + osx_min_version = util.get_osx_min_version() + assert osx_min_version.endswith('.0') + osx_min_version = osx_min_version[:len(osx_min_version) - 2] + osx_stdlib = 'libc++' print "XCode developer directory:", os.popen('xcode-select -p').readline().strip() - for sdk in sdk_versions: + + available_sdks = [] + macosx_matcher = re.compile(r'^MacOSX\d+\.\d+\.sdk.*\((.*)\)$') + for line in os.popen('xcodebuild -version -sdk'): + match = macosx_matcher.match(line) + if not match: + continue + version = match.group(1) + print "Found OS X SDK:", version + available_sdks.append(version) + + def version_sorter(version): + assert version.startswith('macosx') + major_version, minor_version = version.replace('macosx', '').split('.') + return int(major_version), int(minor_version) + + # Use the latest SDK. + for sdk in sorted(available_sdks, reverse=True, key=version_sorter): sdk_path = os.popen( - 'xcodebuild -version -sdk macosx%s Path' % sdk).readline().strip() + 'xcodebuild -version -sdk %s Path' % sdk).readline().strip() if sdk_path: print "Automatically selected OS X SDK:", sdk_path common_flags = ['-isysroot', sdk_path, - '-mmacosx-version-min=%s' % min_sdk_version, + '-mmacosx-version-min=%s' % osx_min_version, '-stdlib=%s' % osx_stdlib] link_flags = [ '-Wl,-syslibroot,' + sdk_path, diff --git a/build/nsis/Mixxx.nsi b/build/nsis/Mixxx.nsi index a38c6b4a9174..0aa97ad90f20 100644 --- a/build/nsis/Mixxx.nsi +++ b/build/nsis/Mixxx.nsi @@ -108,7 +108,7 @@ Function .onInit ; Prevent multiple installer instances FunctionEnd ;------------------------------- -; Install the VC 2010 redistributable DLLs if they're not already. +; Install the VC redistributable DLLs if they're not already. Function InstallVCRedist Push $R0 Call CheckVCRedist @@ -119,12 +119,12 @@ Function InstallVCRedist SetOutPath $TEMP ; Put the VC redist installer files there - File ${WINLIB_PATH}\vcredist_${ARCH}.exe + File ${WINLIB_PATH}\vc_redist.${ARCH}.exe ClearErrors ; Call it & wait for it to install - ExecWait 'vcredist_${ARCH}.exe /quiet /install' - Delete "$TEMP\vc_redist_${ARCH}.exe" + ExecWait "$TEMP\vc_redist.${ARCH}.exe /quiet /install /norestart" + Delete "$TEMP\vc_redist.${ARCH}.exe" IfErrors 0 VCRedistDone MessageBox MB_ICONSTOP|MB_OK "There was a problem installing the Microsoft Visual C++ libraries.$\r$\nYou may need to run this installer as an administrator." Abort @@ -160,17 +160,12 @@ Function InstallVCRedist FunctionEnd ;------------------------------- -; Test if Visual C++ Redistributables 10.0 are installed +; Test if Visual C++ Redistributables are installed ; Returns -1 if they're not Function CheckVCRedist Push $R0 ClearErrors - ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\12.0\VC\Runtimes\${ARCH}" "Installed" - ; Old way: - ; x64 - ;ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}" "Version" - ; x86 - ;ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{196BB40D-1578-3D01-B289-BEFC77A11A1E}" "Version" + ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\${ARCH}" "Installed" IfErrors 0 VSRedistInstalled StrCpy $R0 "-1" @@ -194,7 +189,15 @@ Section "Mixxx (required)" SecMixxx ; Put binary files there File "${BASE_BUILD_DIR}\dist${BITWIDTH}\mixxx.exe" - File "${BASE_BUILD_DIR}\dist${BITWIDTH}\*.dll" + + !ifdef STATICDEPS + ; The below is not fatal if Mixxx is built with static dependencies + ; since there may not be any DLLs to bundle + File /nonfatal "${BASE_BUILD_DIR}\dist${BITWIDTH}\*.dll" + !else + File "${BASE_BUILD_DIR}\dist${BITWIDTH}\*.dll" + !endif + ; If PDB files are present bundle them. For release builds we will not copy ; PDBs into the distXX folder so they won't get bundled. File /nonfatal "${BASE_BUILD_DIR}\dist${BITWIDTH}\*.pdb" @@ -205,9 +208,6 @@ Section "Mixxx (required)" SecMixxx File "${BASE_BUILD_DIR}\README" File "${BASE_BUILD_DIR}\COPYING" - SetOutPath $INSTDIR\promo\${PRODUCT_VERSION} - File /nonfatal /r "${BASE_BUILD_DIR}\dist${BITWIDTH}\promo\${PRODUCT_VERSION}\*" - SetOutPath $INSTDIR\sqldrivers ; Copies both DLLs and PDBs. File /nonfatal /r "${BASE_BUILD_DIR}\dist${BITWIDTH}\sqldrivers\*" @@ -354,7 +354,6 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Akai-LPD8-RK.midi.xml" Delete "$INSTDIR\controllers\American Audio RADIUS 2000 CH1.midi.xml" Delete "$INSTDIR\controllers\American Audio RADIUS 2000 CH2.midi.xml" - Delete "$INSTDIR\controllers\American Audio VMS2 Alternative.midi.xml" Delete "$INSTDIR\controllers\American Audio VMS2.midi.xml" Delete "$INSTDIR\controllers\American Audio VMS4.midi.xml" Delete "$INSTDIR\controllers\American-Audio-RADIUS-2000-scripts.js" @@ -363,9 +362,13 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Behringer BCD2000.midi.xml" Delete "$INSTDIR\controllers\Behringer BCD3000 Advanced.midi.xml" Delete "$INSTDIR\controllers\Behringer BCD3000.midi.xml" + Delete "$INSTDIR\controllers\Behringer CMDStudio4a.midi.xml" Delete "$INSTDIR\controllers\Behringer-BCD2000-scripts.js" Delete "$INSTDIR\controllers\Behringer-BCD3000-Advanced-scripts.js" Delete "$INSTDIR\controllers\Behringer-BCD3000-scripts.js" + Delete "$INSTDIR\controllers\Behringer CMD Micro.midi.xml" + Delete "$INSTDIR\controllers\Behringer-CMD-Micro-scripts.js" + Delete "$INSTDIR\controllers\Behringer-CMDStudio4a-scripts.js" Delete "$INSTDIR\controllers\common-bulk-midi.js" Delete "$INSTDIR\controllers\common-controller-scripts.js" Delete "$INSTDIR\controllers\common-hid-devices.js" @@ -376,6 +379,8 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Denon-DN-HS5500-scripts.js" Delete "$INSTDIR\controllers\Denon-DN-SC2000.midi.js" Delete "$INSTDIR\controllers\Denon-MC3000-scripts.js" + Delete "$INSTDIR\controllers\Denon-MC4000-scripts.js" + Delete "$INSTDIR\controllers\Denon MC4000.midi.xml" Delete "$INSTDIR\controllers\Denon-MC6000MK2-scripts.js" Delete "$INSTDIR\controllers\Denon-MC6000MK2.midi.xml" Delete "$INSTDIR\controllers\DJ-Tech CDJ-101.midi.xml" @@ -420,6 +425,7 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Hercules DJ Control MP3.hid.xml" Delete "$INSTDIR\controllers\Hercules DJ Control MP3.midi.xml" Delete "$INSTDIR\controllers\Hercules DJ Control Steel.midi.xml" + Delete "$INSTDIR\controllers\Hercules P32 DJ.midi.xml" Delete "$INSTDIR\controllers\Hercules-DJ-Console-4-Mx-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Console-Mk1-hid-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Console-Mk2-hid-scripts.js" @@ -429,11 +435,14 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Hercules-DJ-Console-RMX-hid-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Console-RMX-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Control-AIR-scripts.js" + Delete "$INSTDIR\controllers\Hercules DJControl Compact.midi.xml" + Delete "$INSTDIR\controllers\Hercules-DJControl-Compact-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Control-Instinct-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Control-MP3-hid-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Control-MP3-scripts.js" Delete "$INSTDIR\controllers\Hercules-DJ-Control-Steel-scripts.js" Delete "$INSTDIR\controllers\Hercules-mp3e2-compat.js" + Delete "$INSTDIR\controllers\Hercules-P32-scripts.js" Delete "$INSTDIR\controllers\HID-Keyboard.js" Delete "$INSTDIR\controllers\HID-Trackpad.js" Delete "$INSTDIR\controllers\Ion Discover DJ.midi.xml" @@ -447,9 +456,15 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Korg nanoPAD2.midi.xml" Delete "$INSTDIR\controllers\Korg-nanoKONTROL-2-scripts.js" Delete "$INSTDIR\controllers\Korg-nanoPAD2-scripts.js" + Delete "$INSTDIR\controllers\lodash.mixxx.js" Delete "$INSTDIR\controllers\M-Audio-Xponent-scripts.js" Delete "$INSTDIR\controllers\M-Audio_Xponent.midi.xml" + Delete "$INSTDIR\controllers\korg_nanokontrol2.mixco.output.js" + Delete "$INSTDIR\controllers\korg_nanokontrol2.mixco.output.midi.xml" Delete "$INSTDIR\controllers\M-Audio_Xsession_pro.midi.xml" + Delete "$INSTDIR\controllers\maudio_xponent.mixco.output.js" + Delete "$INSTDIR\controllers\maudio_xponent.mixco.output.midi.xml" + Delete "$INSTDIR\controllers\midi-controls-0.0.js" Delete "$INSTDIR\controllers\Midi-Keyboard.midi.xml" Delete "$INSTDIR\controllers\Midi_for_light.midi.xml" Delete "$INSTDIR\controllers\Midi_for_light-scripts.js" @@ -470,9 +485,13 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Novation-Launchpad-Mini-scripts.js" Delete "$INSTDIR\controllers\Novation-Launchpad-Mini.midi.xml" Delete "$INSTDIR\controllers\Novation-Launchpad-scripts.js" + Delete "$INSTDIR\controllers\novation_twitch.mixco.output.js" + Delete "$INSTDIR\controllers\novation_twitch.mixco.output.midi.xml" Delete "$INSTDIR\controllers\Numark DJ2Go.midi.xml" Delete "$INSTDIR\controllers\Numark Mixtrack Pro.midi.xml" Delete "$INSTDIR\controllers\Numark MIXTRACK.midi.xml" + Delete "$INSTDIR\controllers\Numark-Mixtrack-3.midi.xml" + Delete "$INSTDIR\controllers\Numark-Mixtrack-3-scripts.js" Delete "$INSTDIR\controllers\Numark N4.midi.xml" Delete "$INSTDIR\controllers\Numark NS7.midi.xml" Delete "$INSTDIR\controllers\Numark Omni Control.midi.xml" @@ -499,12 +518,18 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Pioneer-DDJ-SB-scripts.js" Delete "$INSTDIR\controllers\Pioneer-DDJ-SB2.midi.xml" Delete "$INSTDIR\controllers\Pioneer-DDJ-SB2-scripts.js" + Delete "$INSTDIR\controllers\Pioneer DDJ-SX.midi.xml" + Delete "$INSTDIR\controllers\Pioneer-DDJ-SX-scripts.js" + Delete "$INSTDIR\controllers\Reloop Beatmix 2-4.midi.xml" Delete "$INSTDIR\controllers\Reloop Beatpad.midi.xml" - Delete "$INSTDIR\controllers\Reloop-Beatpad-scripts.js" Delete "$INSTDIR\controllers\Reloop Digital Jockey 2 Controller Edition.midi.xml" Delete "$INSTDIR\controllers\Reloop Terminal Mix 2-4.js" Delete "$INSTDIR\controllers\Reloop Terminal Mix 2-4.midi.xml" + Delete "$INSTDIR\controllers\Reloop-Beatmix-2-4-scripts.js" + Delete "$INSTDIR\controllers\Reloop-Beatpad-scripts.js" + Delete "$INSTDIR\controllers\Reloop Jockey 3 ME.midi.xml" Delete "$INSTDIR\controllers\Reloop-Digital-Jockey2-Controller-scripts.js" + Delete "$INSTDIR\controllers\Reloop-Jockey-3-ME-scripts.js" Delete "$INSTDIR\controllers\Sony SixxAxis.hid.xml" Delete "$INSTDIR\controllers\Sony-SixxAxis.js" Delete "$INSTDIR\controllers\Stanton SCS.1d.midi.xml" @@ -528,6 +553,7 @@ Section "Uninstall" Delete "$INSTDIR\controllers\us428.midi.xml" Delete "$INSTDIR\controllers\Vestax Spin.midi.xml" Delete "$INSTDIR\controllers\Vestax Typhoon.midi.xml" + Delete "$INSTDIR\controllers\Vestax Typhoon Enhanced.midi.xml" Delete "$INSTDIR\controllers\Vestax VCI-100-3DEX.midi.xml" Delete "$INSTDIR\controllers\Vestax VCI-100-hile.midi.xml" Delete "$INSTDIR\controllers\Vestax VCI-100.midi.xml" @@ -546,15 +572,11 @@ Section "Uninstall" Delete "$INSTDIR\controllers\Wireless-DJ-scripts.js" Delete "$INSTDIR\controllers\Xone K2.midi.xml" Delete "$INSTDIR\controllers\Xone-K2-scripts.js" + + ;Delete $INSTDIR\controllers\*.* ; Avoid this since it will delete customized files too RMDir "$INSTDIR\controllers" - ; Remove promos - Delete $INSTDIR\promo\${PRODUCT_VERSION}\*.* - Delete $INSTDIR\promo\*.* - RMDir /r "$INSTDIR\promo\${PRODUCT_VERSION}" - RMDir "$INSTDIR\promo" - ; Remove skins we (might have) installed Delete $INSTDIR\skins\*.* ; This just deletes files at the root of the skins directory RMDir /r "$INSTDIR\skins\Deere" diff --git a/build/osx/golden_environment b/build/osx/golden_environment new file mode 100644 index 000000000000..9239bc273266 --- /dev/null +++ b/build/osx/golden_environment @@ -0,0 +1 @@ +2.1-j00016-21856a6-osx10.7-x86_64-release \ No newline at end of file diff --git a/build/osx/install_environment.sh b/build/osx/install_environment.sh new file mode 100755 index 000000000000..65e7d6088b66 --- /dev/null +++ b/build/osx/install_environment.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e +set -x + +BASEURL=$1 +ENVIRONMENT_NAME=$2 +ENVIRONMENTS_PATH=$3 + +mkdir -p ${ENVIRONMENTS_PATH} +curl ${BASEURL}/${ENVIRONMENT_NAME}.tar.gz -o ${ENVIRONMENTS_PATH}/${ENVIRONMENT_NAME}.tar.gz +tar zxf ${ENVIRONMENTS_PATH}/${ENVIRONMENT_NAME}.tar.gz -C ${ENVIRONMENTS_PATH} +rm ${ENVIRONMENTS_PATH}/${ENVIRONMENT_NAME}.tar.gz diff --git a/build/osx/product_definition.plist b/build/osx/product_definition.plist index 1a42b64b1d8f..5629e0e216db 100644 --- a/build/osx/product_definition.plist +++ b/build/osx/product_definition.plist @@ -4,12 +4,11 @@ arch - i386 x86_64 os - 10.5.0 + 10.8.0 diff --git a/build/qt4.py b/build/qt4.py index 29573b1ae5c2..2eb69e889102 100644 --- a/build/qt4.py +++ b/build/qt4.py @@ -846,7 +846,7 @@ def locateQt4Command(env, command, qtdir) : from SCons.Script.SConscript import SConsEnvironment SConsEnvironment.EnableQt4Modules = enable_modules -def enable_modules(self, modules, debug=False, crosscompiling=False) : +def enable_modules(self, modules, debug=False, crosscompiling=False, staticdeps=False) : import sys validModules = [ @@ -883,6 +883,9 @@ def enable_modules(self, modules, debug=False, crosscompiling=False) : staticModules = [ 'QtUiTools', ] + if sys.platform == "win32" and staticdeps : + staticModules.extend(validModules) + invalidModules=[] for module in modules: if module not in validModules : diff --git a/build/qt5.py b/build/qt5.py index b4deb702c0d8..aa70a42c8158 100644 --- a/build/qt5.py +++ b/build/qt5.py @@ -860,7 +860,7 @@ def locateQt5Command(env, command, qtdir) : from SCons.Script.SConscript import SConsEnvironment SConsEnvironment.EnableQt5Modules = enable_modules -def enable_modules(self, modules, debug=False, crosscompiling=False) : +def enable_modules(self, modules, debug=False, crosscompiling=False, staticdeps=False) : validModules = [ # Qt Essentials 'QtCore', @@ -905,6 +905,8 @@ def enable_modules(self, modules, debug=False, crosscompiling=False) : ] staticModules = [ ] + if sys.platform == "win32" and staticdeps : + staticModules.extend(validModules) invalidModules=[] for module in modules: if module not in validModules : diff --git a/build/qtcreator/mixxx.pro b/build/qtcreator/mixxx.pro deleted file mode 100644 index df83bd93fb71..000000000000 --- a/build/qtcreator/mixxx.pro +++ /dev/null @@ -1,889 +0,0 @@ -CONFIG += debug link_pkgconfig portmidi script vinylcontrol m4a autodjcrates -DEFINES += QMAKE \ # define QMAKE for not-SCons specific ifdefs like ui_scriptstudio.h - __PORTAUDIO__ \ - __SNDFILE__ \ - SETTINGS_FILE=\\\"mixxx.cfg\\\" \ - BPMSCHEME_FILE=\\\"mixxxbpmscheme.xml\\\" \ - TRACK_FILE=\\\"mixxxtrack.xml\\\" - -## Cross compile: -# Project MESSAGE: MAKEFILE_GENERATOR is [[ MINGW ]] -# DIRLIST_SEPARATOR is [[ : ]] -# DIR_SEPARATOR is [[ / ]] - -## Native Windows MinGW -# Project MESSAGE: MAKEFILE_GENERATOR is [[ MINGW ]] -# DIRLIST_SEPARATOR is [[ ; ]] -# DIR_SEPARATOR is [[ \ ]] - -# Linux / BSD? -# Project MESSAGE: MAKEFILE_GENERATOR is [[ UNIX ]] - -DESTDIR=unknown_build -contains(MAKEFILE_GENERATOR, MINGW) { - DIRLIST_SEPARATOR(:) { - DESTDIR=xmingw-win32_build - } else { - DESTDIR=mingw-win32_build - } -} -contains(MAKEFILE_GENERATOR, UNIX) { - DESTDIR=$$system(uname)_build -} - -# Attempt to move the build/qtcreator -# BASE_DIR=../.. -# OUT_PWD=$$BASE_DIR -# The above works to load inside QtCreator, but fails to compile when make runs because files are -# trying to reference each other in ../.. rather then in the compile CWD -# Since I don't know how to fix this problem, the work around is to copy mixxx.pro back -# to Mixxx/mixxx checkout directory and load into from there using BASE_DIR=. -OUTDIRCHECK = $$basename(OUT_PWD) -contains(OUTDIRCHECK,qtcreator) { - error("Copy mixxx.pro from Mixxx/mixxx/build/qtcreator/mixxx.pro to Mixxx/mixxx/mixxx.pro (so that /src is a subdirectory) then reopen from there.") -} - -BASE_DIR=. - -DESTDIR=$$BASE_DIR/$$DESTDIR - -message(BASE_DIR is [[ $$BASE_DIR ]]) -message(PWD is [[ $$PWD ]]) -message(IN_PWD is [[ $$IN_PWD ]]) -message(OUT_PWD is [[ $$OUT_PWD ]]) - - -BUILDDIR = $$DESTDIR -UI_DIR = $$BUILDDIR/ui -RCC_DIR = $$BUILDDIR/rcc -MOC_DIR = $$BUILDDIR/moc -OBJECTS_DIR = $$BUILDDIR/obj - -win32-g++ { # Bit ugly, but you can thank MS-DOS shell for f-ing up the normal way of parsing. - QMAKE_CXXFLAGS += "\"-DSETTINGS_PATH=\\\"Local\\ Settings/Application\\ Data/Mixxx/\\\"\"" - DEFINES += __WINDOWS__ -} else { - win32 { # i586-mingw32msvc-g++ -- cross compiling - DEFINES += "SETTINGS_PATH=\\\"Local\ Settings/Application\ Data/Mixxx/\\\"" - DEFINES += __WINDOWS__ - } else { - DEFINES += SETTINGS_PATH=\\\".mixxx/\\\" - } -} - -TEMPLATE = app -TARGET = mixxx -QT += core \ - gui \ - sql \ - xmlpatterns \ - xml \ - network \ - svg \ - opengl \ - script \ - qt3support - -CONFIG(debug) { # gdbmacros is required for inspecting Qt datatypes using gdb within QtC - exists($$(QTDIR)/../share/qtcreator/gdbmacros/gdbmacros.cpp) { - message(found gdbmacros.cpp relative to QTDIR) - SOURCES += $$(QTDIR)/../share/qtcreator/gdbmacros/gdbmacros.cpp - } else { - exists($$(HOME)/qtcreator-1.3.0/share/qtcreator/gdbmacros/gdbmacros.cpp) { - message(found gdbmacros.cpp relative to $$(HOME)/qtcreator-1.3.0) - SOURCES += $$(HOME)/qtcreator-1.3.0/share/qtcreator/gdbmacros/gdbmacros.cpp - } - } -} - -HEADERS += $$UI_DIR/ui_dlgaboutdlg.h \ - $$UI_DIR/ui_dlgmidilearning.h \ - $$UI_DIR/ui_dlgprefcontrolsdlg.h \ - $$UI_DIR/ui_dlgprefcrossfaderdlg.h \ - $$UI_DIR/ui_dlgprefeqdlg.h \ - $$UI_DIR/ui_dlgpreferencesdlg.h \ - $$UI_DIR/ui_dlgprefmidibindingsdlg.h \ - $$UI_DIR/ui_dlgprefplaylistdlg.h \ - $$UI_DIR/ui_dlgtagfetcher.h \ - $$UI_DIR/ui_dlgprefrecorddlg.h \ - $$UI_DIR/ui_dlgprefsounddlg.h \ - $$UI_DIR/ui_dlgprefvinyldlg.h \ - $$UI_DIR/ui_dlgprefnovinyldlg.h \ - $$UI_DIR/ui_dlgprefnomididlg.h - -INCLUDEPATH += src \ - lib/replaygain \ - /sw/include \ - $$UI_DIR - -## Generate lists of all code/form files present in a source directory for inclusion in a .pro file -# EXCLUDE_SHOUTCAST=shoutcast|encodermp3|encodervorbis -# EXCLUDE_STUDIO=/script/ -# EXCLUDE_FFMPEG=ffmpeg -# EXCLUDE_TONAL=tonal -# FIND_EXCLUDE=~|unused|patch|diff|/test/|/lib/|.scon|${EXCLUDE_SHOUTCAST}|${EXCLUDE_STUDIO}|${EXCLUDE_FFMPEG}|${EXCLUDE_TONAL} -# for FILE_EXT in h cpp ui; do -# find . | egrep -ive "${FIND_EXCLUDE}" | grep \\.${FILE_EXT} | sort -ui | sed -e "s=./=\$\$BASE_DIR/=" -e "s=\.${FILE_EXT}=\.${FILE_EXT} \\\=" -# done - -HEADERS += \ -$$BASE_DIR/src/analyser.h \ -$$BASE_DIR/src/analyserqueue.h \ -$$BASE_DIR/src/analyserwaveform.h \ -$$BASE_DIR/src/analyserwavesummary.h \ -$$BASE_DIR/src/bpm/bpmreceiver.h \ -$$BASE_DIR/src/bpm/bpmscheme.h \ -$$BASE_DIR/src/bpm/wavesegmentation.h \ -$$BASE_DIR/src/build.h \ -$$BASE_DIR/src/cachingreader.h \ -$$BASE_DIR/src/configobject.h \ -$$BASE_DIR/src/controlbeat.h \ -$$BASE_DIR/src/controlevent.h \ -$$BASE_DIR/src/controlgroupdelegate.h \ -$$BASE_DIR/src/controllogpotmeter.h \ -$$BASE_DIR/src/controlnull.h \ -$$BASE_DIR/src/controlobject.h \ -$$BASE_DIR/src/controlobjectthread.h \ -$$BASE_DIR/src/controlobjectthreadmain.h \ -$$BASE_DIR/src/controlobjectthreadwidget.h \ -$$BASE_DIR/src/controlpotmeter.h \ -$$BASE_DIR/src/controlpushbutton.h \ -$$BASE_DIR/src/controlttrotary.h \ -$$BASE_DIR/src/controlvaluedelegate.h \ -$$BASE_DIR/src/defs_audiofiles.h \ -$$BASE_DIR/src/defs.h \ -$$BASE_DIR/src/defs_urls.h \ -$$BASE_DIR/src/defs_version.h \ -$$BASE_DIR/src/dlgabout.h \ -$$BASE_DIR/src/dlgautodj.h \ -$$BASE_DIR/src/dlgmidilearning.h \ -$$BASE_DIR/src/dlgprefcontrols.h \ -$$BASE_DIR/src/dlgprefcrossfader.h \ -$$BASE_DIR/src/dlgprefeq.h \ -$$BASE_DIR/src/dlgpreferences.h \ -$$BASE_DIR/src/dlgprefmidibindings.h \ -$$BASE_DIR/src/dlgprefnomidi.h \ -$$BASE_DIR/src/dlgprefplaylist.h \ -$$BASE_DIR/src/dlgprefrecord.h \ -$$BASE_DIR/src/dlgprefsound.h \ -$$BASE_DIR/src/dlgprefvinyl.h \ -$$BASE_DIR/src/dlgprepare.h \ -$$BASE_DIR/src/dlgtrackinfo.h \ -$$BASE_DIR/src/encoder.h \ -$$BASE_DIR/src/engine/bpmcontrol.h \ -$$BASE_DIR/src/engine/cuecontrol.h \ -$$BASE_DIR/src/engine/engineabstractrecord.h \ -$$BASE_DIR/src/engine/enginebuffer.h \ -$$BASE_DIR/src/engine/enginebufferscaledummy.h \ -$$BASE_DIR/src/engine/enginebufferscale.h \ -$$BASE_DIR/src/engine/enginebufferscalelinear.h \ -$$BASE_DIR/src/engine/enginebufferscalereal.h \ -$$BASE_DIR/src/engine/enginebufferscalest.h \ -$$BASE_DIR/src/engine/enginechannel.h \ -$$BASE_DIR/src/engine/engineclipping.h \ -$$BASE_DIR/src/engine/enginecontrol.h \ -$$BASE_DIR/src/engine/enginedelay.h \ -$$BASE_DIR/src/engine/enginefilterblock.h \ -$$BASE_DIR/src/engine/enginefilterbutterworth8.h \ -$$BASE_DIR/src/engine/enginefilter.h \ -$$BASE_DIR/src/engine/enginefilteriir.h \ -$$BASE_DIR/src/engine/engineflanger.h \ -$$BASE_DIR/src/engine/enginemaster.h \ -$$BASE_DIR/src/engine/engineobject.h \ -$$BASE_DIR/src/engine/enginepregain.h \ -$$BASE_DIR/src/engine/enginesidechain.h \ -$$BASE_DIR/src/engine/enginespectralfwd.h \ -$$BASE_DIR/src/engine/enginevinylcontrol.h \ -$$BASE_DIR/src/engine/enginevinylsoundemu.h \ -$$BASE_DIR/src/engine/enginevolume.h \ -$$BASE_DIR/src/engine/enginevumeter.h \ -$$BASE_DIR/src/engine/enginexfader.h \ -$$BASE_DIR/src/engine/loopingcontrol.h \ -$$BASE_DIR/src/engine/ratecontrol.h \ -$$BASE_DIR/src/engine/readaheadmanager.h \ -$$BASE_DIR/src/errordialog.h \ -$$BASE_DIR/src/imgcolor.h \ -$$BASE_DIR/src/imginvert.h \ -$$BASE_DIR/src/imgloader.h \ -$$BASE_DIR/src/imgsource.h \ -$$BASE_DIR/src/input.h \ -$$BASE_DIR/src/library/abstractxmltrackmodel.h \ -$$BASE_DIR/src/library/autodjfeature.h \ -$$BASE_DIR/src/library/browsefeature.h \ -$$BASE_DIR/src/library/browsefilter.h \ -$$BASE_DIR/src/library/browsetablemodel.h \ -$$BASE_DIR/src/library/cratefeature.h \ -$$BASE_DIR/src/library/cratetablemodel.h \ -$$BASE_DIR/src/library/dao/cratedao.h \ -$$BASE_DIR/src/library/dao/cuedao.h \ -$$BASE_DIR/src/library/dao/cue.h \ -$$BASE_DIR/src/library/dao/dao.h \ -$$BASE_DIR/src/library/dao/libraryhashdao.h \ -$$BASE_DIR/src/library/dao/playlistdao.h \ -$$BASE_DIR/src/library/dao/settingsdao.h \ -$$BASE_DIR/src/library/dao/trackdao.h \ -$$BASE_DIR/src/library/itunesfeature.h \ -$$BASE_DIR/src/library/itunesplaylistmodel.h \ -$$BASE_DIR/src/library/itunestrackmodel.h \ -$$BASE_DIR/src/library/legacylibraryimporter.h \ -$$BASE_DIR/src/library/libraryfeature.h \ -$$BASE_DIR/src/library/library.h \ -$$BASE_DIR/src/library/librarymidicontrol.h \ -$$BASE_DIR/src/library/libraryscannerdlg.h \ -$$BASE_DIR/src/library/libraryscanner.h \ -$$BASE_DIR/src/library/librarytablemodel.h \ -$$BASE_DIR/src/library/libraryview.h \ -$$BASE_DIR/src/library/missingtablemodel.h \ -$$BASE_DIR/src/library/mixxxlibraryfeature.h \ -$$BASE_DIR/src/library/playlistfeature.h \ -$$BASE_DIR/src/library/playlisttablemodel.h \ -$$BASE_DIR/src/library/preparecratedelegate.h \ -$$BASE_DIR/src/library/preparefeature.h \ -$$BASE_DIR/src/library/preparelibrarytablemodel.h \ -$$BASE_DIR/src/library/proxytrackmodel.h \ -$$BASE_DIR/src/library/rhythmboxfeature.h \ -$$BASE_DIR/src/library/rhythmboxplaylistmodel.h \ -$$BASE_DIR/src/library/rhythmboxtrackmodel.h \ -$$BASE_DIR/src/library/schemamanager.h \ -$$BASE_DIR/src/library/searchthread.h \ -$$BASE_DIR/src/library/sidebarmodel.h \ -$$BASE_DIR/src/library/trackcollection.h \ -$$BASE_DIR/src/library/trackmodel.h \ -$$BASE_DIR/src/m4a/comment.h \ -$$BASE_DIR/src/m4a/ip.h \ -$$BASE_DIR/src/m4a/sf.h \ -$$BASE_DIR/src/mathstuff.h \ -$$BASE_DIR/src/midi/midichanneldelegate.h \ -$$BASE_DIR/src/midi/mididevicedummy.h \ -$$BASE_DIR/src/midi/mididevice.h \ -$$BASE_DIR/src/midi/mididevicemanager.h \ -$$BASE_DIR/src/midi/midideviceportmidi.h \ -$$BASE_DIR/src/midi/midiinputmapping.h \ -$$BASE_DIR/src/midi/midiinputmappingtablemodel.h \ -$$BASE_DIR/src/midi/midiledhandler.h \ -$$BASE_DIR/src/midi/midimapping.h \ -$$BASE_DIR/src/midi/midimessage.h \ -$$BASE_DIR/src/midi/midinodelegate.h \ -$$BASE_DIR/src/midi/midioptiondelegate.h \ -$$BASE_DIR/src/midi/midioutputmapping.h \ -$$BASE_DIR/src/midi/midioutputmappingtablemodel.h \ -$$BASE_DIR/src/midi/midiscriptengine.h \ -$$BASE_DIR/src/midi/midistatusdelegate.h \ -$$BASE_DIR/src/mixxxcontrol.h \ -$$BASE_DIR/src/mixxxevent.h \ -$$BASE_DIR/src/mixxx.h \ -$$BASE_DIR/src/mixxxkeyboard.h \ -$$BASE_DIR/src/mixxxview.h \ -$$BASE_DIR/src/parser.h \ -$$BASE_DIR/src/parserm3u.h \ -$$BASE_DIR/src/parserpls.h \ -$$BASE_DIR/src/peaklist.h \ -$$BASE_DIR/src/player.h \ -$$BASE_DIR/src/playerinfo.h \ -$$BASE_DIR/src/probabilityvector.h \ -$$BASE_DIR/src/recording/defs_recording.h \ -$$BASE_DIR/src/recording/enginerecord.h \ -$$BASE_DIR/src/recording/writeaudiofile.h \ -$$BASE_DIR/src/rotary.h \ -$$BASE_DIR/src/rtthread.h \ -$$BASE_DIR/src/segmentation.h \ -$$BASE_DIR/src/sounddevice.h \ -$$BASE_DIR/src/sounddeviceportaudio.h \ -$$BASE_DIR/src/soundmanager.h \ -$$BASE_DIR/src/soundsource.h \ -$$BASE_DIR/src/soundsourcem4a.h \ -$$BASE_DIR/src/soundsourcemp3.h \ -$$BASE_DIR/src/soundsourceoggvorbis.h \ -$$BASE_DIR/src/soundsourceproxy.h \ -$$BASE_DIR/src/soundsourcesndfile.h \ -$$BASE_DIR/src/trackinfoobject.h \ -$$BASE_DIR/src/transposeproxymodel.h \ -$$BASE_DIR/src/upgrade.h \ -$$BASE_DIR/src/vinylcontrol.h \ -$$BASE_DIR/src/vinylcontrolproxy.h \ -$$BASE_DIR/src/vinylcontrolscratchlib.h \ -$$BASE_DIR/src/vinylcontrolsignalwidget.h \ -$$BASE_DIR/src/vinylcontrolxwax.h \ -$$BASE_DIR/src/waveform/glwaveformrenderer.h \ -$$BASE_DIR/src/waveform/renderobject.h \ -$$BASE_DIR/src/waveformviewerfactory.h \ -$$BASE_DIR/src/waveform/waveformrenderbackground.h \ -$$BASE_DIR/src/waveform/waveformrenderbeat.h \ -$$BASE_DIR/src/waveform/waveformrenderer.h \ -$$BASE_DIR/src/waveform/waveformrendermark.h \ -$$BASE_DIR/src/waveform/waveformrendermarkrange.h \ -$$BASE_DIR/src/waveform/waveformrendersignal.h \ -$$BASE_DIR/src/waveform/waveformrendersignalpixmap.h \ -$$BASE_DIR/src/widget/hexspinbox.h \ -$$BASE_DIR/src/widget/wabstractcontrol.h \ -$$BASE_DIR/src/widget/wbrowsetableview.h \ -$$BASE_DIR/src/widget/wdisplay.h \ -$$BASE_DIR/src/widget/wglwaveformviewer.h \ -$$BASE_DIR/src/widget/wknob.h \ -$$BASE_DIR/src/widget/wlabel.h \ -$$BASE_DIR/src/widget/wlibrary.h \ -$$BASE_DIR/src/widget/wlibrarysidebar.h \ -$$BASE_DIR/src/widget/wlibrarytableview.h \ -$$BASE_DIR/src/widget/wlibrarytextbrowser.h \ -$$BASE_DIR/src/widget/wnumberbpm.h \ -$$BASE_DIR/src/widget/wnumber.h \ -$$BASE_DIR/src/widget/wnumberpos.h \ -$$BASE_DIR/src/widget/wnumberrate.h \ -$$BASE_DIR/src/widget/woverview.h \ -$$BASE_DIR/src/widget/wpixmapstore.h \ -$$BASE_DIR/src/widget/wpreparecratestableview.h \ -$$BASE_DIR/src/widget/wpreparelibrarytableview.h \ -$$BASE_DIR/src/widget/wpushbutton.h \ -$$BASE_DIR/src/widget/wsearchlineedit.h \ -$$BASE_DIR/src/widget/wskincolor.h \ -$$BASE_DIR/src/widget/wslidercomposed.h \ -$$BASE_DIR/src/widget/wslider.h \ -$$BASE_DIR/src/widget/wstatuslight.h \ -$$BASE_DIR/src/widget/wtracktableviewheader.h \ -$$BASE_DIR/src/widget/wvisualsimple.h \ -$$BASE_DIR/src/widget/wvumeter.h \ -$$BASE_DIR/src/widget/wwaveformviewer.h \ -$$BASE_DIR/src/widget/wwidget.h \ -$$BASE_DIR/src/windowkaiser.h \ -$$BASE_DIR/src/wtracktableview.h \ -$$BASE_DIR/src/xmlparse.h - - -SOURCES += \ -$$BASE_DIR/src/analyserqueue.cpp \ -$$BASE_DIR/src/analyserwaveform.cpp \ -$$BASE_DIR/src/analyserwavesummary.cpp \ -$$BASE_DIR/src/bpm/bpmscheme.cpp \ -$$BASE_DIR/src/bpm/wavesegmentation.cpp \ -$$BASE_DIR/src/cachingreader.cpp \ -$$BASE_DIR/src/configobject.cpp \ -$$BASE_DIR/src/controlbeat.cpp \ -$$BASE_DIR/src/controlevent.cpp \ -$$BASE_DIR/src/controlgroupdelegate.cpp \ -$$BASE_DIR/src/controllogpotmeter.cpp \ -$$BASE_DIR/src/controlnull.cpp \ -$$BASE_DIR/src/controlobject.cpp \ -$$BASE_DIR/src/controlobjectthread.cpp \ -$$BASE_DIR/src/controlobjectthreadmain.cpp \ -$$BASE_DIR/src/controlobjectthreadwidget.cpp \ -$$BASE_DIR/src/controlpotmeter.cpp \ -$$BASE_DIR/src/controlpushbutton.cpp \ -$$BASE_DIR/src/controlttrotary.cpp \ -$$BASE_DIR/src/controlvaluedelegate.cpp \ -$$BASE_DIR/src/dlgabout.cpp \ -$$BASE_DIR/src/dlgautodj.cpp \ -$$BASE_DIR/src/dlgmidilearning.cpp \ -$$BASE_DIR/src/dlgprefcontrols.cpp \ -$$BASE_DIR/src/dlgprefcrossfader.cpp \ -$$BASE_DIR/src/dlgprefeq.cpp \ -$$BASE_DIR/src/dlgpreferences.cpp \ -$$BASE_DIR/src/dlgprefmidibindings.cpp \ -$$BASE_DIR/src/dlgprefnomidi.cpp \ -$$BASE_DIR/src/dlgprefplaylist.cpp \ -$$BASE_DIR/src/dlgprefrecord.cpp \ -$$BASE_DIR/src/dlgprefsound.cpp \ -$$BASE_DIR/src/dlgprefvinyl.cpp \ -$$BASE_DIR/src/dlgprepare.cpp \ -$$BASE_DIR/src/dlgtrackinfo.cpp \ -$$BASE_DIR/src/encoder.cpp \ -$$BASE_DIR/src/engine/bpmcontrol.cpp \ -$$BASE_DIR/src/engine/cuecontrol.cpp \ -$$BASE_DIR/src/engine/enginebuffer.cpp \ -$$BASE_DIR/src/engine/enginebufferscale.cpp \ -$$BASE_DIR/src/engine/enginebufferscaledummy.cpp \ -$$BASE_DIR/src/engine/enginebufferscalelinear.cpp \ -$$BASE_DIR/src/engine/enginebufferscalereal.cpp \ -$$BASE_DIR/src/engine/enginebufferscalest.cpp \ -$$BASE_DIR/src/engine/enginechannel.cpp \ -$$BASE_DIR/src/engine/engineclipping.cpp \ -$$BASE_DIR/src/engine/enginecontrol.cpp \ -$$BASE_DIR/src/engine/enginedelay.cpp \ -$$BASE_DIR/src/engine/enginefilterblock.cpp \ -$$BASE_DIR/src/engine/enginefilterbutterworth8.cpp \ -$$BASE_DIR/src/engine/enginefilter.cpp \ -$$BASE_DIR/src/engine/enginefilteriir.cpp \ -$$BASE_DIR/src/engine/engineflanger.cpp \ -$$BASE_DIR/src/engine/enginemaster.cpp \ -$$BASE_DIR/src/engine/engineobject.cpp \ -$$BASE_DIR/src/engine/enginepregain.cpp \ -$$BASE_DIR/src/engine/enginesidechain.cpp \ -$$BASE_DIR/src/engine/enginespectralfwd.cpp \ -$$BASE_DIR/src/engine/enginevinylcontrol.cpp \ -$$BASE_DIR/src/engine/enginevinylsoundemu.cpp \ -$$BASE_DIR/src/engine/enginevolume.cpp \ -$$BASE_DIR/src/engine/enginevumeter.cpp \ -$$BASE_DIR/src/engine/enginexfader.cpp \ -$$BASE_DIR/src/engine/loopingcontrol.cpp \ -$$BASE_DIR/src/engine/ratecontrol.cpp \ -$$BASE_DIR/src/engine/readaheadmanager.cpp \ -$$BASE_DIR/src/errordialog.cpp \ -$$BASE_DIR/src/imgcolor.cpp \ -$$BASE_DIR/src/imginvert.cpp \ -$$BASE_DIR/src/imgloader.cpp \ -$$BASE_DIR/src/input.cpp \ -$$BASE_DIR/src/library/abstractxmltrackmodel.cpp \ -$$BASE_DIR/src/library/autodjfeature.cpp \ -$$BASE_DIR/src/library/browsefeature.cpp \ -$$BASE_DIR/src/library/browsefilter.cpp \ -$$BASE_DIR/src/library/browsetablemodel.cpp \ -$$BASE_DIR/src/library/cratefeature.cpp \ -$$BASE_DIR/src/library/cratetablemodel.cpp \ -$$BASE_DIR/src/library/dao/cratedao.cpp \ -$$BASE_DIR/src/library/dao/cue.cpp \ -$$BASE_DIR/src/library/dao/cuedao.cpp \ -$$BASE_DIR/src/library/dao/libraryhashdao.cpp \ -$$BASE_DIR/src/library/dao/playlistdao.cpp \ -$$BASE_DIR/src/library/dao/settingsdao.cpp \ -$$BASE_DIR/src/library/dao/trackdao.cpp \ -$$BASE_DIR/src/library/itunesfeature.cpp \ -$$BASE_DIR/src/library/itunesplaylistmodel.cpp \ -$$BASE_DIR/src/library/itunestrackmodel.cpp \ -$$BASE_DIR/src/library/legacylibraryimporter.cpp \ -$$BASE_DIR/src/library/library.cpp \ -$$BASE_DIR/src/library/libraryfeature.cpp \ -$$BASE_DIR/src/library/librarymidicontrol.cpp \ -$$BASE_DIR/src/library/libraryscanner.cpp \ -$$BASE_DIR/src/library/libraryscannerdlg.cpp \ -$$BASE_DIR/src/library/librarytablemodel.cpp \ -$$BASE_DIR/src/library/missingtablemodel.cpp \ -$$BASE_DIR/src/library/mixxxlibraryfeature.cpp \ -$$BASE_DIR/src/library/playlistfeature.cpp \ -$$BASE_DIR/src/library/playlisttablemodel.cpp \ -$$BASE_DIR/src/library/preparecratedelegate.cpp \ -$$BASE_DIR/src/library/preparefeature.cpp \ -$$BASE_DIR/src/library/preparelibrarytablemodel.cpp \ -$$BASE_DIR/src/library/proxytrackmodel.cpp \ -$$BASE_DIR/src/library/rhythmboxfeature.cpp \ -$$BASE_DIR/src/library/rhythmboxplaylistmodel.cpp \ -$$BASE_DIR/src/library/rhythmboxtrackmodel.cpp \ -$$BASE_DIR/src/library/schemamanager.cpp \ -$$BASE_DIR/src/library/searchthread.cpp \ -$$BASE_DIR/src/library/sidebarmodel.cpp \ -$$BASE_DIR/src/library/trackcollection.cpp \ -$$BASE_DIR/src/m4a/mp4-mixxx.cpp \ -$$BASE_DIR/src/main.cpp \ -$$BASE_DIR/src/mathstuff.cpp \ -$$BASE_DIR/src/midi/midichanneldelegate.cpp \ -$$BASE_DIR/src/midi/mididevice.cpp \ -$$BASE_DIR/src/midi/mididevicemanager.cpp \ -$$BASE_DIR/src/midi/midideviceportmidi.cpp \ -$$BASE_DIR/src/midi/midiinputmappingtablemodel.cpp \ -$$BASE_DIR/src/midi/midiledhandler.cpp \ -$$BASE_DIR/src/midi/midimapping.cpp \ -$$BASE_DIR/src/midi/midimessage.cpp \ -$$BASE_DIR/src/midi/midinodelegate.cpp \ -$$BASE_DIR/src/midi/midioptiondelegate.cpp \ -$$BASE_DIR/src/midi/midioutputmappingtablemodel.cpp \ -$$BASE_DIR/src/midi/midiscriptengine.cpp \ -$$BASE_DIR/src/midi/midistatusdelegate.cpp \ -$$BASE_DIR/src/mixxxcontrol.cpp \ -$$BASE_DIR/src/mixxx.cpp \ -$$BASE_DIR/src/mixxxkeyboard.cpp \ -$$BASE_DIR/src/mixxxview.cpp \ -$$BASE_DIR/src/parser.cpp \ -$$BASE_DIR/src/parserm3u.cpp \ -$$BASE_DIR/src/parserpls.cpp \ -$$BASE_DIR/src/peaklist.cpp \ -$$BASE_DIR/src/player.cpp \ -$$BASE_DIR/src/playerinfo.cpp \ -$$BASE_DIR/src/probabilityvector.cpp \ -$$BASE_DIR/src/recording/enginerecord.cpp \ -$$BASE_DIR/src/recording/writeaudiofile.cpp \ -$$BASE_DIR/src/rotary.cpp \ -$$BASE_DIR/src/rtthread.cpp \ -$$BASE_DIR/src/segmentation.cpp \ -$$BASE_DIR/src/sounddevice.cpp \ -$$BASE_DIR/src/sounddeviceportaudio.cpp \ -$$BASE_DIR/src/soundmanager.cpp \ -$$BASE_DIR/src/soundsource.cpp \ -$$BASE_DIR/src/soundsourcem4a.cpp \ -$$BASE_DIR/src/soundsourcemp3.cpp \ -$$BASE_DIR/src/soundsourceoggvorbis.cpp \ -$$BASE_DIR/src/soundsourceproxy.cpp \ -$$BASE_DIR/src/soundsourcesndfile.cpp \ -$$BASE_DIR/src/trackinfoobject.cpp \ -$$BASE_DIR/src/upgrade.cpp \ -$$BASE_DIR/src/vinylcontrol.cpp \ -$$BASE_DIR/src/vinylcontrolproxy.cpp \ -$$BASE_DIR/src/vinylcontrolscratchlib.cpp \ -$$BASE_DIR/src/vinylcontrolsignalwidget.cpp \ -$$BASE_DIR/src/vinylcontrolxwax.cpp \ -$$BASE_DIR/src/waveform/glwaveformrenderer.cpp \ -$$BASE_DIR/src/waveform/renderobject.cpp \ -$$BASE_DIR/src/waveformviewerfactory.cpp \ -$$BASE_DIR/src/waveform/waveformrenderbackground.cpp \ -$$BASE_DIR/src/waveform/waveformrenderbeat.cpp \ -$$BASE_DIR/src/waveform/waveformrenderer.cpp \ -$$BASE_DIR/src/waveform/waveformrendermark.cpp \ -$$BASE_DIR/src/waveform/waveformrendermarkrange.cpp \ -$$BASE_DIR/src/waveform/waveformrendersignal.cpp \ -$$BASE_DIR/src/waveform/waveformrendersignalpixmap.cpp \ -$$BASE_DIR/src/widget/hexspinbox.cpp \ -$$BASE_DIR/src/widget/wabstractcontrol.cpp \ -$$BASE_DIR/src/widget/wbrowsetableview.cpp \ -$$BASE_DIR/src/widget/wdisplay.cpp \ -$$BASE_DIR/src/widget/wglwaveformviewer.cpp \ -$$BASE_DIR/src/widget/wknob.cpp \ -$$BASE_DIR/src/widget/wlabel.cpp \ -$$BASE_DIR/src/widget/wlibrary.cpp \ -$$BASE_DIR/src/widget/wlibrarysidebar.cpp \ -$$BASE_DIR/src/widget/wlibrarytableview.cpp \ -$$BASE_DIR/src/widget/wlibrarytextbrowser.cpp \ -$$BASE_DIR/src/widget/wnumberbpm.cpp \ -$$BASE_DIR/src/widget/wnumber.cpp \ -$$BASE_DIR/src/widget/wnumberpos.cpp \ -$$BASE_DIR/src/widget/wnumberrate.cpp \ -$$BASE_DIR/src/widget/woverview.cpp \ -$$BASE_DIR/src/widget/wpixmapstore.cpp \ -$$BASE_DIR/src/widget/wpreparecratestableview.cpp \ -$$BASE_DIR/src/widget/wpreparelibrarytableview.cpp \ -$$BASE_DIR/src/widget/wpushbutton.cpp \ -$$BASE_DIR/src/widget/wsearchlineedit.cpp \ -$$BASE_DIR/src/widget/wskincolor.cpp \ -$$BASE_DIR/src/widget/wslidercomposed.cpp \ -$$BASE_DIR/src/widget/wslider.cpp \ -$$BASE_DIR/src/widget/wstatuslight.cpp \ -$$BASE_DIR/src/widget/wtracktableviewheader.cpp \ -$$BASE_DIR/src/widget/wvisualsimple.cpp \ -$$BASE_DIR/src/widget/wvumeter.cpp \ -$$BASE_DIR/src/widget/wwaveformviewer.cpp \ -$$BASE_DIR/src/widget/wwidget.cpp \ -$$BASE_DIR/src/windowkaiser.cpp \ -$$BASE_DIR/src/wtracktableview.cpp \ -$$BASE_DIR/src/xmlparse.cpp - - -# Soundtouch -INCLUDEPATH += $$BASE_DIR/lib/soundtouch-1.4.1 -SOURCES += $$BASE_DIR/lib/soundtouch-1.4.1/SoundTouch.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/TDStretch.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/RateTransposer.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/AAFilter.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/FIFOSampleBuffer.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/FIRFilter.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/PeakFinder.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/BPMDetect.cpp \ - $$BASE_DIR/lib/soundtouch-1.4.1/cpu_detect_x86_gcc.cpp - -# Fidlib -SOURCES += $$BASE_DIR/lib/fidlib-0.9.10/fidlib.c -win32-g++ { - DEFINES += T_MINGW -} -!win32-g++ { - DEFINES += T_LINUX -} - -# ReplayGain - -SOURCES += $$BASE_DIR/lib/replaygain/replaygain_analysis.c - -FORMS += \ -$$BASE_DIR/src/dlgaboutdlg.ui \ -$$BASE_DIR/src/dlgautodj.ui \ -$$BASE_DIR/src/dlgmidilearning.ui \ -$$BASE_DIR/src/dlgprefcontrolsdlg.ui \ -$$BASE_DIR/src/dlgprefcrossfaderdlg.ui \ -$$BASE_DIR/src/dlgprefeqdlg.ui \ -$$BASE_DIR/src/dlgpreferencesdlg.ui \ -$$BASE_DIR/src/dlgprefmidibindingsdlg.ui \ -$$BASE_DIR/src/dlgprefnomididlg.ui \ -$$BASE_DIR/src/dlgprefplaylistdlg.ui \ -$$BASE_DIR/src/dlgprefrecorddlg.ui \ -$$BASE_DIR/src/dlgprefsounddlg.ui \ -$$BASE_DIR/src/dlgprefvinyldlg.ui \ -$$BASE_DIR/src/dlgprepare.ui \ -$$BASE_DIR/src/dlgtrackinfo.ui \ -$$BASE_DIR/src/script/scriptstudio.ui - - -RESOURCES += $$BASE_DIR/src/../res/mixxx.qrc - -FORMS += $$BASE_DIR/src/dlgprefrecorddlg.ui -!win32:unix { - !macx { - DEFINES += __LINUX__ \ - TEMPORAL \ - __UNIX__ \ - - # if PREFIX is defined by the user, we use it! ( 19/12/2003, J_Zar) - isEmpty( PREFIX ) { - PREFIX = /usr/local - } - UNIX_SHARE_PATH = $${PREFIX}/share/mixxx - DEFINES += UNIX_SHARE_PATH=\\\"$$UNIX_SHARE_PATH\\\" - CONFIG(portmidi) { - DEFINES += __PORTMIDI__ - } - LIBS += -lasound -lportmidi -lporttime - PKGCONFIG += portaudio-2.0 \ - jack \ - id3tag \ - mad \ - vorbisfile \ - sndfile - } -} -macx { - # Needed for portmidi on OSX? Probably not... - LIBS += -framework CoreMIDI \ - -framework CoreFoundation \ - -framework CoreAudio \ - -framework AudioToolbox \ - -framework AudioUnit \ - -L/sw/lib \ - -lportaudio \ - -lmad \ - -lsndfile \ - -logg \ - -lvorbis \ - -lvorbisfile \ - -lfftw3 \ - -lid3tag -} -win32 { - DEFINES += __WINMIDI__ - HEADERS += $$BASE_DIR/src/midiobjectwin.h - SOURCES += $$BASE_DIR/src/midiobjectwin.cpp - LIBS += $$BASE_DIR/../mixxx-winlib/libsndfile-1.dll \ - $$BASE_DIR/../mixxx-winlib/portaudio_x86.dll \ - $$BASE_DIR/../mixxx-winlib/libmad.a \ # libmad-0.15.1b - $$BASE_DIR/../mixxx-winlib/libid3tag.a \ # libid3tag-0.15.1b - $$BASE_DIR/../mixxx-winlib/libvorbisfile.dll \ - $$BASE_DIR/../mixxx-winlib/libvorbis.dll \ -# $$BASE_DIR/../mixxx-winlib/libfftw3-3.dll \ - $$BASE_DIR/../mixxx-winlib/libogg.dll \ - -lwinmm - INCLUDEPATH += $$BASE_DIR/../mixxx-winlib -} -CONFIG(script) { - DEFINES += __MIDISCRIPT__ -} - -CONFIG(Vamp) { -DEFINES += __VAMP__ -INCLUDEPATH += $$BASE_DIR/lib/vamp -HEADERS += $$BASE_DIR/src/vamp/vampanalyser.h \ - $$BASE_DIR/src/analyservamptest.h \ - $$BASE_DIR/src/analyservampkeytest.h \ - $$BASE_DIR/lib/vamp/vamp/vamp.h \ - $$BASE_DIR/lib/vamp/vamp-hostsdk/hostguard.h \ -SOURCES += $$BASE_DIR/src/vamp/vampanalyser.cpp \ - $$BASE_DIR/src/analyservamptest.cpp \ - $$BASE_DIR/src/analyservampkeytest.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginBufferingAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginChannelAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginHostAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginLoader.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/PluginWrapper.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-hostsdk/RealTime.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-sdk/PluginAdapter.cpp \ - $$BASE_DIR/lib/vamp/src/vamp-sdk/RealTime.cpp -} - -CONFIG(tonal) { -# DEFINES += - HEADERS += $$BASE_DIR/src/tonal/ChordCorrelator.hxx \ - $$BASE_DIR/src/tonal/ChordExtractor.hxx \ - $$BASE_DIR/src/tonal/ChordSegmentator.hxx \ - $$BASE_DIR/src/tonal/CircularPeakPicking.hxx \ - $$BASE_DIR/src/tonal/CircularPeakTunner.hxx \ - $$BASE_DIR/src/tonal/CircularPeaksToPCP.hxx \ - $$BASE_DIR/src/tonal/ConstantQFolder.hxx \ - $$BASE_DIR/src/tonal/ConstantQTransform.hxx \ - $$BASE_DIR/src/tonal/DiscontinuousSegmentation.hxx \ - $$BASE_DIR/src/tonal/FourierTransform.hxx \ - $$BASE_DIR/src/tonal/InstantTunningEstimator.hxx \ - $$BASE_DIR/src/tonal/PCPSmother.hxx \ - $$BASE_DIR/src/tonal/Segmentation.hxx \ - $$BASE_DIR/src/tonal/SemitoneCenterFinder.hxx \ - $$BASE_DIR/src/tonal/TonalAnalysis.hxx \ - $$BASE_DIR/src/tonal/tonalanalyser.h - SOURCES += $$BASE_DIR/src/tonal/ConstantQFolder.cxx \ - $$BASE_DIR/src/tonal/ConstantQTransform.cxx \ - $$BASE_DIR/src/tonal/FourierTransform.cxx \ - $$BASE_DIR/src/tonal/Segmentation.cxx \ - $$BASE_DIR/src/tonal/TonalAnalysis.cxx \ - $$BASE_DIR/src/tonal/tonalanalyser.cpp -} -CONFIG(m4a) { - DEFINES += __M4A__ - DEFINES += __MP4V2__ __M4AHACK__ - win32{ - INCLUDEPATH += $$BASE_DIR/../mixxx-winlib/mp4v2/include \ - $$BASE_DIR/../mixxx-winlib/faad2/include - HEADERS += $$BASE_DIR/../mixxx-winlib/mp4v2/include/mp4.h \ - $$BASE_DIR/../mixxx-winlib/mp4v2/include/mpeg4ip.h \ - $$BASE_DIR/../mixxx-winlib/mp4v2/include/mpeg4ip_version.h \ - $$BASE_DIR/../mixxx-winlib/mp4v2/include/mpeg4ip_win32.h - LIBS += $$BASE_DIR/../mixxx-winlib/mp4v2/mingw-bin/libmp4v2-0.dll \ - $$BASE_DIR/../mixxx-winlib/libfaad2.dll - } else { - LIBS += -lmp4v2 \ - -lfaad - } -} -CONFIG(vinylcontrol) { - DEFINES += __VINYLCONTROL__ - HEADERS += \ - $$BASE_DIR/lib/scratchlib/DAnalyse.h \ - $$BASE_DIR/lib/xwax/timecoder.h - SOURCES += \ - $$BASE_DIR/lib/scratchlib/DAnalyse.cpp - - INCLUDEPATH += $$BASE_DIR/lib/scratchlib \ - $$BASE_DIR/lib/xwax - win32:SOURCES += $$BASE_DIR/lib/xwax/timecoder_win32.c - !win32:SOURCES += $$BASE_DIR/lib/xwax/timecoder.c -} -!CONFIG(hifieq):CXXFLAGS += -D__LOFI__ \ - -D__NO_INTTYPES__ -CONFIG(shoutcast) { - DEFINES += __SHOUTCAST__ - HEADERS += $$BASE_DIR/src/dlgprefshoutcast.h \ - $$BASE_DIR/src/encodervorbis.h \ - $$BASE_DIR/src/engine/engineshoutcast.h - SOURCES += $$BASE_DIR/src/dlgprefshoutcast.cpp \ - $$BASE_DIR/src/encodervorbis.cpp \ - $$BASE_DIR/src/engine/engineshoutcast.cpp - LIBS += shout \ - vorbisenc - FORMS += $$BASE_DIR/src/dlgprefshoutcastdlg.ui -} - -# CONFIG(record) { -# DEFINES += __RECORD__ -# HEADERS += $$BASE_DIR/src/recording/defs_recording.h \ -# $$BASE_DIR/src/recording/enginerecord.h \ -# $$BASE_DIR/src/recording/writeaudiofile.h \ -# $$BASE_DIR/src/dlgprefrecord.h -# SOURCES += $$BASE_DIR/src/recording/enginerecord.cpp \ -# $$BASE_DIR/src/recording/writeaudiofile.cpp \ -# $$BASE_DIR/src/dlgprefrecord.cpp -# LIBS += -# FORMS += $$BASE_DIR/src/dlgprefrecorddlg.ui -#} - -CONFIG(ffmpeg) { - DEFINES += __FFMPEGFILE__ - PKGCONFIG += libavcodec \ - libavformat - LIBS += -lavcodec \ - -lavformat \ - -lz \ - -la52 \ - -ldts \ - -lgsm \ - -ldc1394_control \ - -ldl \ - -lvorbisenc \ - -lraw1394 \ - -lavutil \ - -lvorbis \ - -lm \ - -logg -} - -CONFIG(autodjcrates) { - DEFINES += __AUTODJCRATES__ - HEADERS += - $$BASE_DIR/src/library/dao/autodjcratesdao.h - SOURCES += - $$BASE_DIR/src/library/dao/autodjcratesdao.cpp -} - -# Copy Windows dependencies to DESTDIR. -win32 { - !exists($$DESTDIR):system( mkdir \"$$replace(DESTDIR, /,$$DIR_SEPARATOR)\" ) - # MinGW run-time - DLLs += $$(QTDIR)/../mingw/bin/mingwm10.dll $$(QTDIR)/../mingw/bin/libexpat-1.dll - CONFIG(m4a): DLLs += $$BASE_DIR/../mixxx-winlib/mp4v2/mingw-bin/libmp4v2-0.dll \ - $$BASE_DIR/../mixxx-winlib/libfaad2.dll - # Qt4 libraries - debug { - DLLs += $$(QTDIR)/bin/Qt3Supportd4.dll \ - $$(QTDIR)/bin/QtCored4.dll \ - $$(QTDIR)/bin/QtGuid4.dll \ - $$(QTDIR)/bin/QtNetworkd4.dll \ - $$(QTDIR)/bin/QtSqld4.dll \ - $$(QTDIR)/bin/QtXmld4.dll \ - $$(QTDIR)/bin/QtOpenGLd4.dll \ - $$(QTDIR)/bin/QtScriptd4.dll - # include GNU Debugger in debug distros - DLLs += $$(QTDIR)/../mingw/bin/gdb.exe - } else { - DLLs += $$(QTDIR)/bin/Qt3Support4.dll \ - $$(QTDIR)/bin/QtCore4.dll \ - $$(QTDIR)/bin/QtGui4.dll \ - $$(QTDIR)/bin/QtNetwork4.dll \ - $$(QTDIR)/bin/QtSql4.dll \ - $$(QTDIR)/bin/QtXml4.dll \ - $$(QTDIR)/bin/QtOpenGL4.dll \ - $$(QTDIR)/bin/QtScript4.dll - } - # mixxx-winlibs DLLs - DLLs += $$BASE_DIR/../mixxx-winlib/libogg.dll \ - $$BASE_DIR/../mixxx-winlib/portaudio_x86.dll \ -# $$BASE_DIR/../mixxx-winlib/portaudio.dll \ - $$BASE_DIR/../mixxx-winlib/libsndfile-1.dll \ -# $$BASE_DIR/../mixxx-winlib/sndfile.dll \ - $$BASE_DIR/../mixxx-winlib/libvorbis.dll \ - $$BASE_DIR/../mixxx-winlib/libvorbisfile.dll - - # check if DLL exists at target, if not copy it there - for(DLL, DLLs):!exists( $$DESTDIR/$$basename(DLL) ) { - message( copying \"$$replace(DLL, /,$$DIR_SEPARATOR)\" -> \"$$DESTDIR\" ... ) - system( $$QMAKE_COPY \"$$replace(DLL, /,$$DIR_SEPARATOR)\" \"$$DESTDIR\" ) - } - # create DESTDIR\testrun-mixxx.cmd to run mixxx using the workspace resource files. - message ( Creating testrun-mixxx.cmd at \"$${PWD}$${DIR_SEPARATOR}$$replace(DESTDIR, /,$${DIR_SEPARATOR})$${DIR_SEPARATOR}testrun-$${TARGET}.cmd\" ) - system( echo $$TARGET --resourcePath \"$$replace(PWD, /,$${DIR_SEPARATOR})$${DIR_SEPARATOR}res\">\"$${PWD}$${DIR_SEPARATOR}$$replace(DESTDIR, /,$${DIR_SEPARATOR})$${DIR_SEPARATOR}testrun-$${TARGET}.cmd\" ) -} - -exists( .bzr ) { - # Get info from BZR about the current branch - BZR_REVNO = $$system( bzr revno ) - BZR_INFO = $$system( bzr info ) - for(BZR_INFO_BITS, BZR_INFO) { - BZR_BRANCH_URL = $${BZR_INFO_BITS} - } - BZR_BRANCH_NAME = $$dirname(BZR_BRANCH_URL) - BZR_BRANCH_NAME = $$basename(BZR_BRANCH_NAME) - message(BRANCH_NAME is $$BZR_BRANCH_NAME) - message(REVISION is $$BZR_REVNO) - message(BRANCH_URL is $$BZR_BRANCH_URL) - VCS_BRANCH_NAME = $${BZR_BRANCH_NAME} - VCS_REVNO = $${BZR_REVNO} -} - -exists ( .git ) { - # Get info from git about the current branch - GIT_REVNO = $$system( git log --pretty=oneline --first-parent | wc -l ) - GIT_BRANCH_NAME = $$system( git branch | grep \* | sed -e "s/\* //;" ) - message(BRANCH_NAME is $$GIT_BRANCH_NAME) - message(REVISION is $$GIT_REVNO) - VCS_BRANCH_NAME = $${GIT_BRANCH_NAME} - VCS_REVNO = $${GIT_REVNO} -} - -win32 { - # Makefile target to build an NSIS Installer... - # TODO: either fix this to work in a cross-compile or make a seperate cross-compile NSIS target - # CMD Usage: C:/Qt/QtCreator/mingw/bin/mingw32-make -f Makefile.Debug nsis - # SH Usage: make -f Makefile.Debug nsis - nsis.target = nsis - exists($$BUILDDIR/gdb.exe):INCLUDE_GDB = -DINCLUDE_GDB - nsis.commands = \"$$(PROGRAMFILES)\NSIS\makensis.exe\" -NOCD -DGCC -DBINDIR=\"$$BUILDDIR\" -DBUILD_REV=\"$$VCS_BRANCH_NAME-$$VCS_REVNO\" $$INCLUDE_GDB build\\\\nsis\\\\Mixxx.nsi - # nsis.depends = - QMAKE_EXTRA_UNIX_TARGETS += nsis -} - -# build.h -BUILD_REV = $${VCS_BRANCH_NAME} : $${VCS_REVNO} -isEmpty( BUILD_REV ):BUILD_REV = Killroy was here -BUILD_REV += - built via qmake/Qt Creator -message( Generating src$${DIR_SEPARATOR}build.h with contents: $${LITERAL_HASH}define BUILD_REV '"'$$BUILD_REV'"' ) -system( echo $${LITERAL_HASH}define BUILD_REV '"'$$BUILD_REV'"'>src$${DIR_SEPARATOR}build.h ) -system( echo $${LITERAL_HASH}define BUILD_FLAGS '"'$$replace(DEFINES,__,)'"'>>src$${DIR_SEPARATOR}build.h ) diff --git a/build/util.py b/build/util.py index 75b1e27e9bef..12119b2081ce 100644 --- a/build/util.py +++ b/build/util.py @@ -91,7 +91,12 @@ def get_git_branch_name(): branch_name = os.popen( "git rev-parse --abbrev-ref HEAD").readline().strip() if branch_name == 'HEAD': - branch_name = '(no branch)' + # Use APPVEYOR_REPO_BRANCH variable if building on appveyor or (no branch) if unset + branch_name = os.getenv("APPVEYOR_REPO_BRANCH", '(no branch)') + # Add PR# to branch name if building a PR in appveyor to avoid package naming collision + PRnum = os.getenv("APPVEYOR_PULL_REQUEST_NUMBER") + if PRnum != None: + branch_name += ("-PR" + PRnum) return branch_name @@ -112,7 +117,7 @@ def get_mixxx_version(): version = "" for line in open(str(defs)).readlines(): - if line.strip().startswith("#define VERSION "): + if line.strip().startswith("#define MIXXX_VERSION "): version = line break @@ -127,7 +132,7 @@ def get_mixxx_version(): versionMask = '^\d+\.\d+\.\d+([-~].+)?$' if not re.match(versionMask, version): raise ValueError("Version format mismatch. See src/defs_version.h comment") - + return version @@ -157,7 +162,7 @@ def CheckForPKGConfig(context, version='0.0.0'): context.Result(ret) return ret - + # Uses pkg-config to check for a minimum version def CheckForPKG(context, name, version=""): if version == "": @@ -185,3 +190,10 @@ def write_build_header(path): finally: f.close() os.chmod(path, stat.S_IRWXU | stat.S_IRWXG |stat.S_IRWXO) + +def get_osx_min_version(): + """Gets the minimum required OS X version from product_definition.plist.""" + # Mixxx 2.0 supported OS X 10.6 and up. + # Mixxx >2.0 requires C++11 which is only available with libc++ and OS X + # 10.7 onwards. std::promise/std::future requires OS X 10.8. + return os.popen("/usr/libexec/PlistBuddy -c 'Print os:0' build/osx/product_definition.plist").readline().strip() diff --git a/build/windows/golden_environment b/build/windows/golden_environment new file mode 100644 index 000000000000..64fb3bc6431c --- /dev/null +++ b/build/windows/golden_environment @@ -0,0 +1 @@ +2.1-j00023-PLATFORM-CONFIGURATION-static-1b6c054-minimal \ No newline at end of file diff --git a/build/windows/install_buildenv.bat b/build/windows/install_buildenv.bat new file mode 100644 index 000000000000..4e0e6f0f5b38 --- /dev/null +++ b/build/windows/install_buildenv.bat @@ -0,0 +1,30 @@ +@ECHO OFF +SETLOCAL + +REM Base URL to download winlibs from. +SET BASEURL=%1 + +REM The winlib name to install. +SET WINLIB_NAME=%2 + +REM The local directory to cache build environments in. +SET WINLIBS_PATH=%3 + +REM Install build env base dir +IF NOT EXIST "%WINLIBS_PATH%" MKDIR "%WINLIBS_PATH%" + +IF NOT EXIST "%WINLIBS_PATH%\%WINLIB_NAME%" ( + echo Installing winlib %WINLIB_NAME%. + CD "%WINLIBS_PATH%" + echo ..Downloading %WINLIB_NAME%.zip + curl -fsS -L -o %WINLIB_NAME%.zip %BASEURL%/%WINLIB_NAME%.zip + REM TODO(XXX) check fingerprint on zip file. + echo ..unzipping %WINLIB_NAME%.zip + 7z x %WINLIB_NAME%.zip + DEL %WINLIB_NAME%.zip +) else ( + echo %WINLIB_NAME% already exists at %WINLIBS_PATH% + REM TODO(XXX) check fingerprint on build environment? +) + +ENDLOCAL diff --git a/build/wix/LICENSE.rtf b/build/wix/LICENSE.rtf index 61472351bc9a..a3c84660a668 100644 --- a/build/wix/LICENSE.rtf +++ b/build/wix/LICENSE.rtf @@ -1,8 +1,8 @@ {\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Courier New;}} {\colortbl ;\red0\green0\blue255;} -{\*\generator Riched20 10.0.10586}\viewkind4\uc1 +{\*\generator Riched20 10.0.14393}\viewkind4\uc1 \pard\qj\ul\b\f0\fs22\lang1036 Mixxx version 2.1, Digital DJ'ing software.\ulnone\b0\fs24\par -\fs22 Copyright (C) 2001-2016 Mixxx Development Team\par +\fs22 Copyright (C) 2001-2017 Mixxx Development Team\par \par Promotional tracks are copyright their respective owners and\par distributed with permission.\par diff --git a/build/wix/Localization/README-Translations.md b/build/wix/Localization/README-Translations.md index 42909a466fd7..3f3334326153 100644 --- a/build/wix/Localization/README-Translations.md +++ b/build/wix/Localization/README-Translations.md @@ -3,25 +3,64 @@ Transifex doesn't handle wxl files. So we convert the english one to a pot file and convert back the translated po files to wxl using https://github.com/sblaisot/wxl-po-tools -Updating source pot -------------------- +Adding strings and Updating source pot +====================================== +* Add strings to mixxx_en-us.wxl +* Update tranlation source .pot file `build/wix/Localization$ /path/to/wxl2pot.py -l Language mixxx_en-us.wxl po/mixxx.pot` +* push new strings to transifex +``` +$ tx push -s -r mixxxdj-windows-installer.mixxxpot +Pushing translations for resource mixxxdj-windows-installer.mixxxpot: +Pushing source file (build/wix/Localization/po/mixxx.pot) +Done. +``` +* Update all translations to include the new strings (see next paragraph) + + +Updating translations from Transifex +====================================== -Updating translations from transifex ------------------------------------- +First, pull new translations from Transifex -First, pull new translations from transifex -`$ tx pull -r mixxxdj-windows-installer.mixxxpot -a` +`$ tx pull -r mixxxdj-windows-installer.mixxxpot -a --minimum-perc=60` + +Then, rebuild wxl files from po files -Then, rebuils wxl files from po files ``` $ cd build/wix/Localization build/wix/Localization$ for i in po/*.po; do destfile=${i#po/}; /path/to/po2wxl.py -l Language -f -p 60 $i mixxx_${destfile%.po}.wxl; done ``` -explainations for the above line : -For earch po file in the po subdirectory, call po2wxl to transform it to wxl file with the following options : -`-l Language` add a string with Id Language containing the auto-determined LCID -`-f` Overwrite the wxl file if it already exists -`-p 60` don't transform po files if less than 60% of strings are translated \ No newline at end of file +Explanations for the above line : +For each po file in the po subdirectory, call po2wxl to transform it to wxl file with the following options : +* `-l Language` add a string with Id Language containing the auto-determined LCID +* `-f` Overwrite the wxl file if it already exists +* `-p 60` don't transform po files if less than 60% of strings are translated + +NOTES +===== + +Adding new languages +-------------------- + +You can't add new languages from Transifex that are not in wix toolset translation, or package generation will not work. +List of available (base) translations of wixUI is here: http://wixtoolset.org/documentation/manual/v3/wixui/wixui_localization.html + +Bad characters +-------------- + +Sometimes, you can face the following error message after pulling translations from Transifex: + +```path\to\mixxx\build\wix\mixxx.wxs(67) : error LGHT0311 : A string was provided with characters that are not available in the specified database code page '1250'. Either change these characters to ones that exist in the database's code page, or update the database's code page by modifying one of the following attributes: Product/@Codepage, Module/@Codepage, Patch/@Codepage, PatchCreation/@Codepage, or WixLocalization/@Codepage.``` + +This is because a translation you pulled contain a character that is not part of the default codepage used by wix for that language. This happens sometimes with UTF-8 encoded translations from Transifex. +In this case, you need to replace the UTF-8 or UTF-16 char in the translation with the equivalent char in the codepage. + +This has happened in the past for the ro-RO language and the following characters: + +| faulty char (error) | replacement (OK) | +|:---:|:--:| +| ț | ţ | +| ș | ş | diff --git a/build/wix/Localization/mixxx_ca-ES.wxl b/build/wix/Localization/mixxx_ca-ES.wxl index 78c6666fc773..7cd4d909b0b9 100644 --- a/build/wix/Localization/mixxx_ca-ES.wxl +++ b/build/wix/Localization/mixxx_ca-ES.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -23,26 +23,82 @@ Aquesta aplicació requereix Windows XP o una versió més recent. - Ja teniu instal·lada aquesta versió del Mixxx o una de més recent. + Ja teniu instal·lada aquesta versió del Mixxx o una més recent. Heu d'instal·lar la versió de 64 bits d'aquest producte en un Windows de 64 bits. Heu d'instal·lar la versió de 32 bits d'aquest producte en un Windows de 32 bits. - Esteu apunt d'instal·lar la versió de 32 bits en un sistema operatiu de 64 bits. Recomanem utilitzar la versió de 64 bits per a un millor rendiment. Podeu descarregar l'instal·lador de la versió de 64 bits des de http://mixxx.org/download/ - Esteu instal·lant el Mixxx en un sistema operatiu obsolet. Algunes de les funcionalitats poden no funcionar correctament. Recomanem actualitzar el sistema operatiu. - Esteu a punt d'instal·lar la versió de 32 bits tot i que teniu instal·lada una versió de 64 bits. Això pot provocar un comportament no desitjat. Si us plau, desinstal·leu la versió existent del Mixxx primer, o bé descarregueu l'instal·lador de 64 bits per a actualitzar la versió (a no ser que sapigueu exactament el que esteu fent). - Esteu a punt d'instal·lar la versió de 64 bits tot i que teniu instal·lada una versió de 32 bits. Això pot provocar un comportament no desitjat. Si us plau, desinstal·leu la versió existent del Mixxx primer, o bé descarregueu l'instal·lador de 32 bits per a actualitzar la versió (a no ser que sapigueu exactament el que esteu fent). - Hem detectat una versió anterior del Mixxx. Degut a que hem canviat l'instal·lador, no podem portar a terme l'actualització. És necessari que desinstal·leu la versió anterior abans d'instal·lar aquesta nova versió. + Esteu a punt d'instal·lar la versió de 32 bits en un sistema operatiu de 64 bits. Recomanem utilitzar la versió de 64 bits per a un millor rendiment. Podeu baixar l'instal·lador de la versió de 64 bits des de http://mixxx.org/download/ + Esteu instal·lant el Mixxx en un sistema operatiu obsolet. Algunes funcionalitats poden no funcionar correctament. Recomanem actualitzar el sistema operatiu. + Esteu a punt d'instal·lar la versió de 32 bits tot i que teniu instal·lada una versió de 64 bits. Això pot provocar un comportament no desitjat. Desinstal·leu primer la versió existent del Mixxx o baixeu l'instal·lador de 64 bits per actualitzar la versió (a no ser que sapigueu exactament què esteu fent). + Esteu a punt d'instal·lar la versió de 64 bits tot i que teniu instal·lada una versió de 32 bits. Això pot provocar un comportament no desitjat. Desinstal·leu primer la versió existent del Mixxx o baixeu l'instal·lador de 32 bits per a actualitzar la versió (a no ser que sapigueu exactament què esteu fent). + S'ha detectat una versió anterior del Mixxx. Atès la limitació de l'instal·lador, no és possible actualitzar automàticament. Desinstal·leu la versió existent abans d'instal·lar aquesta versió. + 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. {\WixUI_Font_Title}Avís + + Inicia el Mixxx en acabar la instal·lació. + El paquet complet. L'aplicació. - L'aplicació Mixxx incloent les preconfiguracions de controladors. - Accés directe des de l'Escriptori - Afegeix un accés directe al Mixxx al vostre escriptori + L'aplicació Mixxx incloent les configuracions per defecte de diversos controladors. + Fitxers PDB de depuració + Instal·la els fitxers PDB del Mixxx per utilitzar-los amb un depurador. Això és útil per depurar el Mixxx i poder enviar traces entenedores a l'equip de desenvolupadors. + Crea una icona a l'escriptori + Afegeix un accés directe al Mixxx a l'escriptori Manual d'usuari - El Manual d'usuari del Mixxx en format PDF, també disponible des de http://mixxx.org/manual/ + El Manual d'usuari del Mixxx en format PDF i disponible a http://mixxx.org/manual/ Traduccions - Fitxers de recursos addicionals que permeten mostrar el Mixxx en idiomes alternatius a l'anglès nordamericà. + Fitxers de recursos addicionals que permeten mostrar el Mixxx en idiomes alternatius a l'anglès. + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close diff --git a/build/wix/Localization/mixxx_cs-CZ.wxl b/build/wix/Localization/mixxx_cs-CZ.wxl index cb8506069058..7be8d629bf52 100644 --- a/build/wix/Localization/mixxx_cs-CZ.wxl +++ b/build/wix/Localization/mixxx_cs-CZ.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -26,23 +26,79 @@ Již je nainstalována stejná nebo novější verze tohoto výrobku. Do 64bitových Windows musíte nainstalovat 64bitovou verzi tohoto výrobku. Do 32bitových Windows musíte nainstalovat 32bitovou verzi tohoto výrobku. - Chystáte se nainstalovat 32bitovou verzi do 64bitového operačního systému. Doporučujeme použít 64bitovou verzi kvůli lepšímu výkonu. Instalační balíček pro 64bitový systém můžete stáhnout z http://mixxx.org/download/ + Chystáte se nainstalovat 32bitovou verzi do 64bitového operačního systému. Doporučujeme použít 64bitovou verzi kvůli lepšímu výkonu. Instalační balíček pro 64bitový systém můžete stáhnout z http://mixxx.org/download/ Instalujete Mixxx do zastaralého operačního systému. Některé funkce nemusí pracovat dobře, nebo nebudou pracovat vůbec. Doporučujeme vám povýšení operačního sytému. - Chystáte se nainstalovat 32bitovou verzi, ale již je nainstalována 64bitová verze. To může vést k neobvyklému chování. Odinstalujte, prosím, nejprve stávající verzi Mixxxu, nebo pro povýšení verze stáhněte instalační balíček pro 64bitový systém (pokud přesně nevíte, co děláte). - Chystáte se nainstalovat 64bitovou verzi, ale již je nainstalována 32bitová verze. To může vést k neobvyklému chování. Odinstalujte, prosím, nejprve stávající verzi Mixxxu, nebo pro povýšení verze stáhněte instalační balíček pro 32bitový systém (pokud přesně nevíte, co děláte). + Chystáte se nainstalovat 32bitovou verzi, ale již je nainstalována 64bitová verze. To může vést k neobvyklému chování. Odinstalujte, prosím, nejprve stávající verzi Mixxxu, nebo pro povýšení verze stáhněte instalační balíček pro 64bitový systém (pokud přesně nevíte, co děláte). + Chystáte se nainstalovat 64bitovou verzi, ale již je nainstalována 32bitová verze. To může vést k neobvyklému chování. Odinstalujte, prosím, nejprve stávající verzi Mixxxu, nebo pro povýšení verze stáhněte instalační balíček pro 32bitový systém (pokud přesně nevíte, co děláte). Byla zjištěna starší verze Mixxxu. Protože byl změněn instalátor, není možné povýšení provést hladce. Odinstalujte, prosím, starší verzi, předtím než začnete instalovat tuto. + 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. {\WixUI_Font_Title}Varování + + Spustit Mixxx, když existuje nastavení. + Úplný balíček. Hlavní aplikace Hlavní aplikace Mixxxu včetně přednastavení ovladačů. + Soubory ladění PDB + Nainstalujte soubory PDB Mixxxu k použití s ladičem. Toto je užitečné na ladění Mixxxu a poskytuje vývojářskému družstvu čitelné stopy. Klávesová zkratka Přidat klávesovou zkratku pro Mixxx na pracovní plochu Uživatelská příručka Uživatelská příručka Mixxxu v podobě PDF, dostupná též na http://mixxx.org/manual/ Překlady Zdrojové soubory, které Mixxx umožní provedení instalace Mixxxu v jiných jazycích, než je americká angličtina + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close diff --git a/build/wix/Localization/mixxx_de-DE.wxl b/build/wix/Localization/mixxx_de-DE.wxl index 6d39e07d45dd..a069001f46d8 100644 --- a/build/wix/Localization/mixxx_de-DE.wxl +++ b/build/wix/Localization/mixxx_de-DE.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -26,23 +26,79 @@ Die gleiche oder eine neuere Version dieses Produkts ist bereits installiert. Sie müssen die 64-Bit-Version dieses Produkts auf 64-Bit-Windows installieren. Sie müssen die 32-Bit-Version dieses Produkts auf 32-Bit-Windows installieren. - Sie sind dabei, die 32-Bit-Version auf einem 64-Bit-Betriebssystem zu installieren. Wir empfehlen mit der 64-Bit-Version für bessere Performance. Sie können das der 64-Bit-Installationspaket von http://mixxx.org/download/ herunterladen. + Sie sind dabei, die 32-Bit-Version auf einem 64-Bit-Betriebssystem zu installieren. Wir empfehlen mit der 64-Bit-Version für bessere Performance. Sie können das der 64-Bit-Installationspaket von http://mixxx.org/download/ herunterladen. Sie installieren Mixxx auf einem veralteten Betriebssystem. Einige Funktionen arbeiten möglicherweise nicht korrekt oder überhaupt nicht. Wir empfehlen die Aktualisierung Ihres Betriebssystems. Sie sind dabei, die 32-Bit-Version zu installieren, aber eine 64-Bit-Version ist bereits installiert. Dies kann zu unerwünschtem Verhalten führen. Bitte deinstallieren Sie zuerst die vorhandene Mixxx Version oder laden Sie das 64-Bit-Installationspaket zum Aktualisieren (es sei denn, Sie wissen genau was Sie tun.) Sie sind dabei, die 64-Bit-Version zu installieren, aber eine 32-Bit-Version ist bereits installiert. Dies kann zu unerwünschtem Verhalten führen. Bitte deinstallieren Sie zuerst die vorhandene Mixxx Version oder laden Sie das 32-Bit-Installationspaket zum Aktualisieren (es sei denn, Sie wissen genau was Sie tun.) Eine ältere Version von Mixxx wurde erkannt. Da wir die Installer-Software geändert haben, können wir nicht problemlos aktualisieren. Bitte deinstallieren Sie ältere Version vor der Installation dieser neuen Version. + Das Installationsprogramm war nicht in der Lage Microsoft Visual C ++ 2015 Redistributable auf diesem System zu finden. Dies ist wahrscheinlich ein Bug des Installationsprogramms, der an Mixxx-Entwickler gemeldet werden sollte. {\WixUI_Font_Title}Warnung + + Mixxx starten wenn das Setup abgeschlossen ist. + Das Komplettpaket. Kernanwendung Die Mixxx Kernanwendung einschließlich Controller-Voreinstellungen. + PDB-Debug-Dateien + Installiere Mixxx PDB-Dateien für die Verwendung mit einem Debugger. Dies ist nützlich, um Mixxx zu debuggen und dem Entwicklungsteam lesbare Backtraces zur Verfügung zu stellen. Desktop-Verknüpfung Auf Ihrem Desktop eine Verknüpfung zu Mixxx hinzufügen Benutzerhandbuch Das Mixxx Benutzerhandbuch im PDF-Format, auch verfügbar auf http://mixxx.org/manual/ Übersetzungen Ressource-Dateien um Mixxx außer in US-Englisch in alternativen Sprachen anzeigen lassen + + + [WixBundleName] Setup + [WixBundleName] + Sind Sie sicher, dass Sie abbrechen möchten? + Vorherige Version + Setup-Hilfe + /install | /repair | /uninstall | /layout [Verzeichnis] - Installiert, repariert, deinstalliert oder erstellt eine komplette lokale Kopie des Pakets im Verzeichnis Installation ist die Standardeinstellung. /passive | /quiet - Zeigt minimale Benutzeroberfläche ohne Eingabeaufforderungen an oder zeigt keine Benutzeroberfläche und keine Eingabeaufforderungen. Standardmäßig werden Benutzeroberfläche und alle Eingabeaufforderungen angezeigt. /norestart - Unterdrückt Versuche neu zu starten. Standardmäßig wird die Benutzeroberfläche zum Neustart auffordern. /log log.txt - Protokolliert in eine bestimmte Datei. Standardmäßig wird eine Protokolldatei in % TEMP% erstellt. + &Schließen + Willkommen + Setup installiert Mixxx auf Ihrem Computer. Es wird zuerst benötigte Drittanbieter-Bibliotheken, dann Mixxx selbst installieren Klicken Sie auf Installieren um fortzufahren, oder auf Schliessen um zu beenden. + Version [WixBundleVersion] + &Optionen + &Installieren + &Schließen + Setup-Optionen + Installationsverzeichnis: + &Durchsuchen + &OK + &Abbrechen + Dateien in Benutzung + Die folgenden Anwendungen verwenden Dateien, die aktualisiert werden müssen: + Die &Anwendungen schliessen, und versuchen sie neu zu starten. + &Schließe keine Anwendungen. Ein Neustart ist erforderlich. + &OK + &Abbrechen + Setup-Fortschritt + Wird bearbeitet: + Initialisiere... + &Cancel + Setup ändern + &Reparieren + &Deinstallieren + &Schließen + Setup erfolgreich + Installation von Mixxx war erfolgreich + Reparatur von Mixxx war erfolgreich + Deinstallation von Mixxx war erfolgreich + &Start + Sie müssen Ihren Computer neu starten, bevor Sie die Software verwenden können. + &Neustart + &Schließen + Setup fehlgeschlagen + Installation von Mixxx ist fehlgeschlagen + Reparatur von Mixxx ist fehlgeschlagen + Deinstallation von Mixxx ist fehlgeschlagen + Wegen einem oder mehrerer Probleme ist das Setup fehlgeschlagen. Bitte beheben Sie die Probleme und wiederholen das Setup. Weitere Informationen finden Sie in der <a href="#">Protokolldatei</a>. + Sie müssen Ihren Computer neu starten, um die Zurücknahme der Softwareinstallation abzuschliessen. + &Neustart + &Schließen diff --git a/build/wix/Localization/mixxx_en-us.wxl b/build/wix/Localization/mixxx_en-us.wxl index 832a975b5980..8fc4492bd985 100644 --- a/build/wix/Localization/mixxx_en-us.wxl +++ b/build/wix/Localization/mixxx_en-us.wxl @@ -1,42 +1,108 @@ - - 1033 - + 1033 + Mixxx Mixxx The Mixxx Development Team Open-source Digital DJ software Installs Mixxx - + This product requires Windows XP or above. The same or a newer version of this product is already installed. You need to install the 64-bit version of this product on 64-bit Windows. You need to install the 32-bit version of this product on 32-bit Windows. - You are about to install the 32-bit version on a 64-bit operating system. We recommend using the 64-bit version for better performance. You can download the 64-bit installation package from http://mixxx.org/download/ + You are about to install the 32-bit version on a 64-bit operating system. We recommend using the 64-bit version for better performance. You can download the 64-bit installation package from http://mixxx.org/download/ You are installing Mixxx on an outdated operating system. Some functions may not work well or at all. We recommend upgrading your operating system. You are about to install the 32-bit version but a 64-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 64-bit installation package to upgrade (unless you know exactly what you are doing.) You are about to install the 64-bit version but a 32-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 32-bit installation package to upgrade (unless you know exactly what you are doing.) An older version of Mixxx has been detected. As we changed installer, we can not smoothly upgrade. Please uninstall older version before installing this one. + 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. {\WixUI_Font_Title}Warning - - + + + Launch Mixxx when setup exits. + + The complete package. Core application The core Mixxx application including controller presets. + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. Desktop Shortcut Add a shortcut to Mixxx on your desktop User Manual The Mixxx user manual in PDF form, also available at http://mixxx.org/manual/ Translations Resource files that allow Mixxx to display in alternate languages, other than US english - + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. + Install is the default. + + /passive | /quiet - displays minimal user interface with no prompts or displays no user interface + and no prompts. By default user interface and all prompts are displayed. + + /norestart - suppress any attempts to restart. By default user interface will prompt before restart. + + /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. +It will first install required third party libraries, then Mixxx itself. +Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close diff --git a/build/wix/Localization/mixxx_es-ES.wxl b/build/wix/Localization/mixxx_es-ES.wxl index 15286bf5e4b5..6616da0904ea 100644 --- a/build/wix/Localization/mixxx_es-ES.wxl +++ b/build/wix/Localization/mixxx_es-ES.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -26,23 +26,79 @@ La misma versión o una más reciente de este producto está ya instalada. Necesita instalar la versión de 64 bits de este producto en una versión de Windows de 64 bits. Necesita instalar la versión de 32 bits de este producto en una versión de Windows de 32 bits. - Está a punto de instalar la versión de 32 bits en un sistema operativo de 64 bits. Recomendamos usar la versión de 64 bits para un mejor rendimiento. Puede descargar el instalador de la versión de 64 bits desde http://mixxx.org/download/ + Está a punto de instalar la versión de 32 bits en un sistema operativo de 64 bits. Recomendamos usar la versión de 64 bits para un mejor rendimiento. Puede descargar el instalador de la versión de 64 bits desde http://mixxx.org/download/ Está instalando Mixxx en un sistema operativo obsoleto. Algunas funciones pueden no funcionar correctamente. Recomendamos actualizar su sistema operativo. Está a punto de instalar la versión de 32 bits pero la versión de 64 bits está instalada. Esto puede llevar a un comportamiento indeseado del programa. Por favor, desinstale primero la versión existente, o descargue el instalador de 64 bits (a no ser que sepa exactamente lo que está haciendo). Está a punto de instalar la versión de 64 bits pero la versión de 32 bits está instalada. Esto puede llevar a un comportamiento indeseado del programa. Por favor, desinstale primero la versión existente, o descargue el instalador de 32 bits (a no ser que sepa exactamente lo que está haciendo). Una versión anterior de Mixxx ha sido detectada. Dado que hemos cambiado de instalador, no podemos hacer una actualización limpia. Por favor, desinstale la versión anterior antes de instalar esta. + 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. {\WixUI_Font_Title}Advertencia + + Ejecutar Mixxx una vez termine la instalación. + El paquete completo. El núcleo de la aplicación. El núcleo de la aplicación, incluyendo las plantillas para los controladores. + Ficheros PDB de depuración + Instalar los ficheros PDB de Mixxx para uso con un depurador. Esto es útil para depurar Mixxx y enviar trazas de error comprensibles al equipo de desarrollo. Acceso Directo Añadir un acceso directo a Mixxx en su escritorio Manual de Usuario El manual de usuario en formato PDF, también disponible en http://mixxx.org/manual/ Traducciones Archivos de recursos que permiten la visualización de Mixxx en otros idiomas aparte del Inglés americano + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close diff --git a/build/wix/Localization/mixxx_et-EE.wxl b/build/wix/Localization/mixxx_et-EE.wxl new file mode 100644 index 000000000000..4abfd2f2b7b6 --- /dev/null +++ b/build/wix/Localization/mixxx_et-EE.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1061 + + + + Mixxx + Mixxx + Mixxx Arendusmeeskond + Avatud lähtekoodiga digitaalne DJ tarkvara + Paigaldab Mixxxi + + + + See toode nõuab Windows XP-d või uuemat op. süsteemi. + Sama või uuem versioon sellest tootest on juba paigaldatud. + Sul tuleb paigaldada 64-bitine versioon sellest tootest 64-bitisele Windowsile. + Sul tuleb paigaldada 32-bitine versioon sellest tootest 32-bitisele Windowsile. + Sa soovid paigaldada 32-bitist versiooni 64-bitisele operatsioonisüsteemile. Soovitame kasutada 64-bitist versiooni parema jõudluse jaoks. Saate 64-bitise paigalduspaketi alla laadida aadressilt http://mixxx.org/download/ + Te paigaldate Mixxxi vananenud operatsioonisüsteemile. Mõned funktsioonid ei pruugi normaalselt või üldse töödata. Soovitame teil uuendada oma operatsioonisüsteem. + Sa proovid paigaldada 32-bitist versiooni, kuid 64-bitine on juba paigaldatud. See võib viia soovimatu käitumiseni. Palun eemaldage olemasolev Mixxx kõigepealt või laadige 64-bitine paigalduspakett uuendamiseks alla (kui sa just ei tea mida sa täpselt teed) + Sa proovid paigaldada 64-bitist versiooni aga 32-bitine on juba paigaldatud. See võib viia soovimatu käitumiseni. Palun eemaldage olemasolev Mixxx kõigepealt või laadige 32-bitine paigalduspakett uuendamiseks alla (kui sa just ei tea mida sa täpselt teed) + Tuvastati vanem versioo Mixxxist. Kuna me vahetasime paigaldajat, ei saa me tõrgeteta uuendada. Palun eemaldage vanem versioon enne selle paigaldamist. + 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. + + + {\WixUI_Font_Title}Hoiatus + + + Launch Mixxx when setup exits. + + + Kogu pakett. + Põhi rakendus + Põhirakendus Mixxx koos kontrollerite eelseadistustega. + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Töölaua otsetee + Lisa Mixxxi otsetee oma töölauale + Kasutusjuhend + Mixxxi kasutusjuhend on PDF failis, lisaks saadaval http://mixxx.org/manual/ + Tõlked + Ressursifailid mis lubavad Mixxxil kuvada teisi alternatiivkeeli peale Ameerika Ühendriikide inglise keele + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_fr-FR.wxl b/build/wix/Localization/mixxx_fr-FR.wxl index c716fa121f28..0265b8305c71 100644 --- a/build/wix/Localization/mixxx_fr-FR.wxl +++ b/build/wix/Localization/mixxx_fr-FR.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -26,23 +26,79 @@ Une version plus récente ou identique de ce produit est déjà installée. Vous devez installer la version 64-bits de ce produit sur un Windows 64-bits. Vous devez installer la version 32-bits de ce produit sur un Windows 32-bits. - Vous installez une version 32 bits sur un système 64 bits. Nous vous recommandons d'utiliser une version 64 bits pour de meilleures performances. Vous pouvez télécharger l'installeur 64 bits ici : http://mixxx.org/download/ + Vous installez une version 32 bits sur un système 64 bits. Nous vous recommandons d'utiliser une version 64 bits pour de meilleures performances. Vous pouvez télécharger l'installeur 64 bits ici : http://mixxx.org/download/ Vous installez Mixxx sur un système obsolète. Certaines fonctions pourraient ne pas fonctionner. Nous vous recommandons de mettre à jour votre système d'exploitation. Vous installez une version 32 bits de Mixxx, mais il existe déjà une version 64 bits installée. Ceci peut conduire à un comportement imprévisible. SVP, désinstallez d'abord ou téléchargez l'installeur correspondant pour mettre à jour, à moins de savoir exactement ce que vous faites. Vous installez une version 64 bits de Mixxx, mais il existe déjà une version 32 bits installée. Ceci peut conduire à un comportement imprévisible. SVP, désinstallez d'abord ou téléchargez l'installeur correspondant pour mettre à jour, à moins de savoir exactement ce que vous faites. Une ancienne version de Mixxx a été détectée. Comme nous avons changé d'installeur, nous ne pouvons pas mettre à jour de manière transparente. Merci de désinstaller l'ancienne version avant d'installer celle-ci. + L'installeur n'a pas pu trouver "Microsoft Visual C++ 2015 Redistribuable" sur votre système. Il s'agit probablement d'un bug de l'installer qui doit être rapporté aux développeurs de Mixxx. {\WixUI_Font_Title}Attention + + Démarrer Mixxx en quittant l'installeur. + Installation complète. Programme principal Le programme et l'ensemble de ses dépendances. + Fichiers PDB de debug + Installe les fichiers PDB de Mixxx, à utiliser avec un debuggueur. Utile pour débugguer Mixxx et fournir à l'équipe de développement des backtraces exploitables. Raccourci sur le bureau Ajoute un raccourci "Mixxx" sur le bureau Manuel Mixxx Le manuel de Mixxx en PDF Traductions Fichiers de ressources contenant les traductions de Mixxx autres que l'anglais (US) + + + Installeur de [WixBundleName] + [WixBundleName] + Êtes-vous sûr de vouloir annuler ? + Version précédente + Aide de l'installeur + /install | /repair | /uninstall | /layout [directory] - installe, répare, désinstalle ou crée une copie locale complète du bundle dans ce répertoire. install est la valeur par défaut. /passive | /quiet - afiche une interface minimale sans question ou n'affiche aucune interface ni question. Par défaut, l'interface et toutes les questions sont affichés. /norestart - ne tente pas de redémarrer. Par défaut, l'interface demandera avant de redémarrer. /log log.txt - fichier spécifique de journal. Par défaut, les journaux sont créés dans %TEMP%. + &Fermer + Bienvenue + L'installeur installera Mixxx sur votre ordinateur. Il installera d'abord les librairies tierces, puis Mixxx lui-même. Cliquez sur Installer pour continuer ou Fermer pour quitter. + Version [WixBundleVersion] + &Options + &Installer + &Fermer + Options d'installation + Emplacement d'installation : + &Parcourir + &OK + &Annuler + Fichiers en cours d'utilisation + Les applications suivantes utilisent les fichiers à mettre à jour : + Fermer les &applications et tenter de les redémarrer. + &Ne pas fermer les applications. Un reboot sera nécessaire. + &OK + &Annuler + Progression de l'installation + En cours : + Initialisation... + &Annuler + Modifier l'installation + &Réparer + &Désinstaller + &Fermer + Installation réussie + Mixxx a été installé avec succès + Mixxx a été réparé avec succès + Mixxx a été désinstallé avec succès + &Lancer + Vous devez redémarrer votre ordinateur avant de pouvoir utiliser le logiciel. + &Redémarrer + &Fermer + Installation échouée + L'installation de Mixxx a échoué + La réparation de Mixxx a échoué + La désinstallation de Mixxx a échoué + Une ou plusieurs erreurs ont fait échoué l'installation. Corrigez-les et réessayez. Pour de plus amples informations, consultez le <a href="#">fichier journal</a>. + Vous devez redémarrer votre ordinateur pour terminer le retour-arrière du logiciel. + &Redémarrer + &Fermer diff --git a/build/wix/Localization/mixxx_it-IT.wxl b/build/wix/Localization/mixxx_it-IT.wxl new file mode 100644 index 000000000000..2913e36c0f49 --- /dev/null +++ b/build/wix/Localization/mixxx_it-IT.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1040 + + + + Mixxx + Mixxx + Il Team Sviluppo di Mixxx + Software per DJing Open-Source + Installa Mixxx + + + + Questo prodotto richiede Windows XP o superiori. + La stessa o una versione più recente di questo prodotto è già installata. + Devi installare la versione a 64-bit di questo prodotto su Windows a 64-bit. + Devi installare la versione a 32-bit di questo prodotto su Windows a 32-bit. + Stai per installare la versione a 32-bit su un sistema operativo a 64-bit. Raccomandiamo di usare la versione a 64-bit per ottenere prestazioni migliori. Puoi scaricare il pacchetto di installazione a 64-bit da http://mixxx.org/download/ + Stai per installare Mixxx su un sistema operativo vecchio. Alcune funzioni potrebbero non funzionare bene o completamente. Raccomandiamo di aggiornare il tuo sistema operativo. + You are about to install the 32-bit version but a 64-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 64-bit installation package to upgrade (unless you know exactly what you are doing.) + You are about to install the 64-bit version but a 32-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 32-bit installation package to upgrade (unless you know exactly what you are doing.) + An older version of Mixxx has been detected. As we changed installer, we can not smoothly upgrade. Please uninstall older version before installing this one. + 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. + + + {\WixUI_Font_Title}Attenzione + + + Launch Mixxx when setup exits. + + + Il pacchetto software completo. + Applicazione principale + The core Mixxx application including controller presets. + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Collegamento sul Desktop + Aggiunge un collegamento a Mixxx sul tuo desktop + Manuale Utente + Il manuale di Mixxx in formato PDF, disponibile anche su http://mixxx.org/manual/ + Traduzioni + Resource files that allow Mixxx to display in alternate languages, other than US english + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_nl-NL.wxl b/build/wix/Localization/mixxx_nl-NL.wxl new file mode 100644 index 000000000000..d3c8d9f8226f --- /dev/null +++ b/build/wix/Localization/mixxx_nl-NL.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1043 + + + + Mixxx + Mixxx + Het Mixxx ontwikkellingsteam + Open-source Digitale DJ software + Installeert Mixxx + + + + Dit product vereist Windows XP of hoger. + Dezelfde of een nieuwere versie van dit product is reeds geïnstalleerd. + Je moet de 64-bits versie van dit product installeren op een 64-bits versie van Windows. + Je moet de 32-bits versie van dit product installeren op een 32-bits versie van Windows. + Je staat op het punt om de 32-bits versie te installeren op een 64-bits besturingssysteem. We raden aan om de 64-bits versie te gebruiken voor betere prestaties. Je kunt het 64-bits installatiepakket downloaden van http://mixxx.org/download/ + Je wilt Mixxx installeren op een verouderd besturingssysteem. Sommige functies werken mogelijk niet goed of helemaal niet. We raden je aan om je besturingssysteem te upgraden. + Je wilt de 32-bits versie installeren maar een 64-bits is reeds geïnstalleerd. Dit kan leiden tot ongewenste effecten. Gelieve eerst de bestaande Mixxx te verwijderen, of het 64-bits installatiepakket te downloaden en te upgraden (Tenzij je exact weet waar je aan begint) + Je wilt de 64-bits versie installeren maar een 32-bits is reeds geïnstalleerd. Dit kan leiden tot ongewenste effecten. Gelieve eerst de bestaande Mixxx te verwijderen, of het 32-bits installatiepakket te downloaden en te upgraden (Tenzij je exact weet waar je aan begint) + Een oudere versie van Mixxx is gedetecteerd. Door wijziging van de installer is een vlotte bijwerking niet mogelijk. Verwijder de oudere versie voordat u deze versie installeert. + 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. + + + {\WixUI_Font_Title}Waarschuwing + + + Start Mixxx na de installatie. + + + Het volledige pakket. + Kerntoepassing + De Mixxx-kerntoepassing inclusief voorinstellingen voor controllers. + PDB debug-bestanden + Installeer Mixxx PDB-bestanden om te gebruiken met een debugger. Dit is nuttig om Mixxx te debuggen en het ontwikkelingsteam een leesbare backtrace te bieden. + Snelkoppeling op het bureaublad + Voeg een snelkoppeling naar Mixxx toe op je bureaublad + Gebruikershandleiding + De Mixxx gebruikershandleiding in PDF-formaat, ook beschikbaar op http://mixxx.org/manual/ + Vertalingen + Hulpbestanden die Mixxx toelaten om te werken met andere talen dan Amerikaans Engels + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_pl-PL.wxl b/build/wix/Localization/mixxx_pl-PL.wxl new file mode 100644 index 000000000000..a2c7dc03e3d5 --- /dev/null +++ b/build/wix/Localization/mixxx_pl-PL.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1045 + + + + Mixxx + Mixxx + Drużyna Deweloperska Mixxx'a + Oprogramowanie DJ Open-source + Instaluje Mixxx + + + + Ten produkt wymaga Windowsa XP lub wyżsego + Ta lub nowsza wersja tego produktu jest juź zainstalowana. + Musisz zainstalować 64-bitową wersję na 64-bitowym Windowsie. + Musisz zainstalować 32-bitową wersję na 32-bitowym Windowsie. + Masz zamiar zainstalować wersję 32-bitową w 64-bitowym systemie operacyjnym. Zalecane jest użycie 64-bitowej wersji dla lepszej wydajności. Pakiet instalacji 64-bitowej można pobrać z http://mixxx.org/download/ + Instalujesz Mixxx'a na przestarzałym systemie operacyjnym. Niektóre funkcje mogą nie działac prawidłowo lub wcale. Rekomendujemy zaktualizować swój system operacyjny. + Masz zamiar zainstalować 32-bitową wersje, ale już jest zainstalowana wersja 64-bitowa. Może to prowadzić do niepożądanego działania. Najpierw należy odinstalować istniejącego Mixxx'a, lub Pobrać pakiet instalacji 64-bitowej do uaktualnienia (chyba, że wiesz, co robisz.) + Masz zamiar zainstalować 64-bitową wersję, ale już jest zainstalowana wersja 32-bitowa. Może to prowadzić do niepożądanego działania. Najpierw należy odinstalować istniejącego Mixxx'a, lub Pobrać pakiet instalacji 32-bitowe do uaktualnienia (chyba, że wiesz, co robisz.) + Wykryto starszą wersję Mixxx. Zmieniliśy Instalator, nie można płynnie uaktualnić programu. Proszę odinstalować starszą wersję przed zainstalowaniem tej. + 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. + + + {\WixUI_Font_Title}Ostrzeżenie + + + Włącz Mixxx'a kiedy skończy się instalacja. + + + Kompletny pakiet. + Główna aplikacja + Mixxx posiada zapisane ustawienia do różnych kontrolerów. + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Skrót na pulpicie + Dodaj skrót do Mixxx'a na twoim pulpicie + Instrukcja obsługi + Instrukcja obsługi Mixxx'a jest również dostępna jako PDF na http://mixxx.org/manual/ + Translacje + Pliki zasobów, które pozwalają Mixxx'owi do wyświetlania w alternatywnych językach innych niż Angielski US + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_pt-BR.wxl b/build/wix/Localization/mixxx_pt-BR.wxl new file mode 100644 index 000000000000..506f9358f22e --- /dev/null +++ b/build/wix/Localization/mixxx_pt-BR.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1046 + + + + Mixxx + Mixxx + A Equipe de Desenvolvimento do Mixxx + Software de DJ digital de código-aberto + Instala o Mixx + + + + Esse produto requer Windows XP ou melhor. + A mesma ou melhor versão deste produto já está instalada. + Você precisa instalar a versão 64-bit desse produto no Windows 64-bit. + Você precisa instalar a versão 32-bit desse produto no Windows 32-bit. + Você está prestes a instalar a versão 32-bit em um sistema operacional 64-bit. Nós recomendamos usar uma versão 64-bit para melhor performance. Você pode baixar o pacote de instalação 64-bit de http://mixxx.org/download/ + Você está instalando o Mixxx em um sistema operacional desatualizado. Algumas funções podem não funcionar corretamente ou nem funcionar. Nós recomendamos atualizar o seu sistema operacional. + Você está prestes a instalar a versão 32-bit mas uma versão 64-bit já está instalada. Isso pode levar a comportamento indesejado. Por favor desinstale a versão existente do Mixxx primeiro, ou baixe o pacote de instalação 64-bit para atualizar (a menos que você saiba exatamente o que você está fazendo.) + Você está prestes a instalar a versão 64-bit mas uma versão 32-bit já está instalada. Isso pode levar a comportamento indesejado. Por favor desinstale a versão existente do Mixxx primeiro, ou baixe o pacote de instalação 32-bit para atualizar (a menos que você saiba exatamente o que você está fazendo.) + Uma versão antiga do Mixxx foi detectada. Como nós mudamos de instalador, não podemos atualizá-la de forma adequada. Por favor desinstale a versão antiga antes de instalar esta. + 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. + + + {\WixUI_Font_Title}Atenção + + + Executar o Mixxx quando a instalação acabar. + + + O pacote inteiro. + Núcleo da aplicação + O núcleo da aplicação MIxxx incluindo pré-definições de controlador. + Arquivos PDB para debugar + Instalar os arquivos PDB do Mixxx para usar com um debugger. isso é útil para debugar o Mixxx e fornece backtraces legíveis para a equipe de desenvolvimento. + Atalho na Área de Trabalho + Cria um atalho do Mixxx na sua área de trabalho + Manual do Usuário + O manual do usuário do Mixxx em formato PDF, também disponível em http://mixxx.org/manual/ + Traduções + Arquivos de recursos que premitem o Mixxx mostrar outras linguagens além do inglês. + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_pt-PT.wxl b/build/wix/Localization/mixxx_pt-PT.wxl index 4dce45d8e758..c2c81e38aed1 100644 --- a/build/wix/Localization/mixxx_pt-PT.wxl +++ b/build/wix/Localization/mixxx_pt-PT.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -26,23 +26,79 @@ A mesma ou uma versão mais recente deste produto já está instalada. Precisa de instalar a versão 64-bit deste produto no Windows de 64-bit. Precisa de instalar a versão 32-bit deste produto no Windows de 32-bit. - Está prestes a instalar a versão 32-bit num sistema operativo de 64-bit. Nós recomendamos que use a versão 64-bit para obter um melhor desempenho. Pode transferir o pacote de instalação de 64-bit a partir de http://mixxx.org/download/ + Está prestes a instalar a versão 32-bit num sistema operativo de 64-bit. Nós recomendamos que use a versão 64-bit para obter um melhor desempenho. Pode transferir o pacote de instalação de 64-bit a partir de http://mixxx.org/download/ Está a instalar o Mixxx num sistema operativo desatualizado. Algumas funcionalidade poderão não funcionar corretamente. Nós recomendamos que atualize o seu sistema operativo. Está prestes a instalar a versão de 32-bit mas a de 64-bit já está instalada. Isto pode resultar num comportamento indesejado. Por favor, desinstale a versão do Mixxx existente primeiro, ou transfira a versão de 64-bit para atualizar (a não ser que realmente saiba o que está a fazer.) Está prestes a instalar a versão de 64-bit mas a de 32-bit já está instalada. Isto pode resultar num comportamento indesejado. Por favor, desinstale a versão do Mixxx existente primeiro, ou transfira a versão de 32-bit para atualizar (a não ser que realmente saiba o que está a fazer.) Foi detetada uma versão anterior do Mixxx. Como nós mudámos o instalador, não podemos facilmente proceder à atualização. Por favor desinstale a versão antiga antes de instalar esta. + 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. {\WixUI_Font_Title}Aviso + + Iniciar o Mixxx após sair da instalação. + O pacote completo. - Core application + Aplicação principal A Mixxx core application inclui presets de controladores. + Ficheiros PDB de depuração + Instala ficheiros PDB do Mixxx para usar com um depurador. Isto é bastante útil para permitir o retorno de indícios legíveis à equipa de desenvolvimento e depurar o Mixxx. Atalho no ambiente de trabalho Adiciona um atalho do Mixxx no ambiente de trabalho - Manual + Manual do Utilizador O manual do Mixxx em PDF, está disponível também em http://mixxx.org/manual/ Traduções - Ficheiros de recurso que permite ao Mixxx apresentar outras linguagens, diferentes do US english + Ficheiros de recurso que permitem ao Mixxx apresentar outras linguagens, diferentes do inglês - EUA + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close diff --git a/build/wix/Localization/mixxx_ro-RO.wxl b/build/wix/Localization/mixxx_ro-RO.wxl new file mode 100644 index 000000000000..d9dac133acd0 --- /dev/null +++ b/build/wix/Localization/mixxx_ro-RO.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1048 + + + + Mixxx + Mixxx + Echipa de dezvoltare Mixxx + Aplicaţie DJ Digital Opesource + Instalare Mixxx + + + + Acest produs necesită Windows XP sau ulterior. + Aceiaşi sau o versiune mai nouă a acestui produs este deja instalată. + Trebuie să instalaţi versiunea produsului pe 64-biţi pentru Windows. + Trebuie să instalaţi versiunea pe 32-biţi a acestui produs pentru Windows. + You are about to install the 32-bit version on a 64-bit operating system. We recommend using the 64-bit version for better performance. You can download the 64-bit installation package from http://mixxx.org/download/ + Instalaţi Mixxx pe un sistem de operare expirat. Unele funcţii este posibil să nu funcţioneze corect sau deloc. Vă recomandăm să actualizaţi sistemul de operare. + You are about to install the 32-bit version but a 64-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 64-bit installation package to upgrade (unless you know exactly what you are doing.) + You are about to install the 64-bit version but a 32-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 32-bit installation package to upgrade (unless you know exactly what you are doing.) + O versiune veche Mixxx a fost detectată. Deoarece am schimbat instalatorul, nu putem actualiza facil. Dezinstalaţi versiunea veche înaintea instalării acesteia. + 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. + + + {\WixUI_Font_Title}Atenţie + + + Launch Mixxx when setup exits. + + + Pachetul complet. + Aplicaţia de bază + Aplicaţia de bază Mixxx include preconfigurări controllere. + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Scurtătură birou + Adaugă o scurtătură pentru Mixxx pe birou + Manual utilizator + Manualul utilizatorului Mixxx în format PDF, este disponibil la + Traduceri + Fişierele resursă care permit Mixxx să afişeze în alte limbi, altele decât Engleza US + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_ru-RU.wxl b/build/wix/Localization/mixxx_ru-RU.wxl new file mode 100644 index 000000000000..8b01361f311d --- /dev/null +++ b/build/wix/Localization/mixxx_ru-RU.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1049 + + + + Mixxx + Mixxx + Команда разработчиков The Mixxx + Программа с открытым исходным кодом для ди-джеев + Установите Mixxx + + + + Этот продукт поддерживается на Windows XP и выше. + Данная или выше версия продукта уже установлена. + Вам необходимо установить 64-битную версию продукта на 64-битную версию Windows. + Вам необходимо установить 32-битную версию продукта на 32-битную версию Windows. + Вы пытаетесь установить 32-битную версию на 64-битную версию операционной системы. Мы рекомендуем использовать 64-битную версию для увеличения производительности. Вы можете скачать 64-битную версию программы на http://mixxx.org/download/. + Вы установили Mixxx на операционную систему, которая более не поддерживается. Некоторые функции могут не работать или работать некорректно. Рекомендуем Вам обновить операционную систему. + Вы пытаетесь установить 32-битную версию, но у вас уже установлена 64-битная версия. Это может привести к нежелательным последствиям. Пожалуйста, удалите сначала установленную версию, или скачайте 64-битную версию установщика для обновления текущей версии ПО (если вы уверены в том, что делаете.) + Вы пытаетесь установить 64-битную версию, но у вас уже установлена 32-битная версия. Это может привести к нежелательным последствиям. Пожалуйста, удалите сначала установленную версию, или скачайте 32-битную версию установщика для обновления текущей версии ПО (если вы уверены в том, что делаете.) + Обнаружена страя версия Mixxx. Так как установщик был изменен, нет возможности обновения версии ПО. Пожалуйста, удалите старую версию перед запуском данного установщика. + 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. + + + {\WixUI_Font_Title}Предупреждение + + + Запуск Mixxx, и выход из режима настройки + + + Полный пакет. + Основная программа + Основная программа Mixxx включает настройки контроллера. + PDB файлы отладки + Установите Mixxx PDB файлы для использования с помощью отладчика. Это полезно для отладки Mixxx и обеспечит считывание у цепочек вызова команды разработчиков. + Ярлык на Рабочем столе + Добавляет ярлык Mixxx на Рабочий стол + Руководство пользователя + Руквоводство пользователя Mixxx в формате PDF, так же доступно на http://mixxx.org/manual/ + Переводы + Файлы, позволяющие Mixxx отображать интерфейс на альтернативных языках, нежели US английский. + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_sv-SE.wxl b/build/wix/Localization/mixxx_sv-SE.wxl new file mode 100644 index 000000000000..f66289a4b784 --- /dev/null +++ b/build/wix/Localization/mixxx_sv-SE.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1053 + + + + Mixxx + Mixxx + Mixxx-utvecklingsteamet + Open-source digital DJ-mjukvara + Installerar Mixxx + + + + Denna produkt kräver Windows XP eller högre. + Samma eller en nyare version av denna produkt är redan installerad. + Du behöver installera 64-bitars-versionen utav denna produkt på 64-bitars Windows. + Du behöver installera 32-bitars-versionen utav denna produkt på 32-bitars Windows. + You are about to install the 32-bit version on a 64-bit operating system. We recommend using the 64-bit version for better performance. You can download the 64-bit installation package from http://mixxx.org/download/ + You are installing Mixxx on an outdated operating system. Some functions may not work well or at all. We recommend upgrading your operating system. + You are about to install the 32-bit version but a 64-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 64-bit installation package to upgrade (unless you know exactly what you are doing.) + You are about to install the 64-bit version but a 32-bit one is already installed. This can lead to undesired behavior. Please un-install the existing Mixxx first, or download the 32-bit installation package to upgrade (unless you know exactly what you are doing.) + An older version of Mixxx has been detected. As we changed installer, we can not smoothly upgrade. Please uninstall older version before installing this one. + 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. + + + {\WixUI_Font_Title}Varning + + + Starta Mixxx när installationen avslutar. + + + Hela paketet. + Kärnapplikation + Kärn-Mixxx-applikationen inklusive controller-förval. + PDB-debugfiler + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Skrivbordsgenväg + Lägg till en genväg till Mixxx på ditt skrivbord + Användarmanual + Mixxx användarmanual i PDF-format, även tillgänglig på http://mixxx.org/manual/ + Översättningar + Resursfiler som tillåter Mixxx att visas i alternativa språk, andra än amerikansk engelska + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_tr-TR.wxl b/build/wix/Localization/mixxx_tr-TR.wxl new file mode 100644 index 000000000000..48fc131616e7 --- /dev/null +++ b/build/wix/Localization/mixxx_tr-TR.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1055 + + + + Mixxx + Mixxx + Mixxx Geliştirici Takımı + Açık-kaynak Dijital DJ yazılımı + Mixxx'i Yükler + + + + Bu ürün Windows XP ve üzerini gerektirir. + Bu ürünün aynı veya daha yeni bir sürümü zaten yüklü. + 64-bit Windows üzerine bu ürünün 64-bit sürümünü yüklemeniz gerekmektedir. + 32-bit Windows üzerine bu ürünün 32-bit sürümünü yüklemeniz gerekmektedir. + 64-bit bir işletim sistemine 32-bit sürümü yüklemek üzeresiniz. Daha iyi bir performans için 64-bit sürümü kullanmanızı öneririz. 64-bit Yükleme paketini http://mixxx.org/download/ adresinden edinebilirsiniz. + Mixxx'i eski bir işletim sistemine yüklemek üzeresiniz. Bazı özellikler istendiği gibi veya hiç çalışmayabilir. İşletim sisteminizi yükseltmenizi öneririz. + 32-bit sürümü yüklemek üzeresiniz ancak bir 64-bit sürüm zaten yüklü. Devam etmek istenmeyen sonuçlar doğurabilir. Lütfen önce mevcut Mixxx'i kaldırın, veya güncellemek için 64-bit yükleme paketini indirin (ne yaptığınızı tam olarak bilmiyorsanız). + 64-bit sürümü yüklemek üzeresiniz ancak bir 32-bit versiyon zaten yüklü. Devam etmek istenmeyen sonuçlar doğurabilir. Lütfen önce Mixxx'i kaldırın, veya güncellemek için 32-bit yükleme paketini indirin (ne yaptığınızı tam olarak bilmiyorsanız). + Mixxx'in daha eski bir sürümü tespit edildi. Yükleyici'yi değiştirdiğimiz için pürüzsüz bir güncelleme deneyimi sunamıyoruz. Lütfen yüklemeden önce eski sürümü kaldırın. + 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. + + + {\WixUI_Font_Title} Uyarı + + + Kurulumdan çıktıktan sonra Mixxx'i çalıştır. + + + Tam paket. + Çekirdek uygulama + Çekirdek Mixxx uygulaması, kontrolör önayarları dahil + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + Masaüstü Kısayolu + Masaüstüne Mixxx'e bir kısayol ekle + Kullanım Kılavuzu + Mixxx kullanım kılavuzu PDF formunda, ayrıca http://mixxx.org/manual/ adresinde mevcut. + Çeviriler + Mixxx'in ABD dili dışındaki alternatif dillerde görüntülenmesine izin veren kaynak dosyaları + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_zh-CN.wxl b/build/wix/Localization/mixxx_zh-CN.wxl new file mode 100644 index 000000000000..b745be363a0b --- /dev/null +++ b/build/wix/Localization/mixxx_zh-CN.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 2052 + + + + Mixxx + Mixxx + Mixxx开发团队 + 开源数字DJ软件 + 安装Mixxx + + + + 此产品要求Windows XP或更高版本。 + 已安装此产品相同或更高版本。 + 您需要在64位Windows上安装本产品的64位版本。 + 您需要在32位Windows上安装本产品的32位版本。 + 您将要在64位操作系统上安装32位版本的Mixxx。 我们建议使用64位版本以获取更好的性能。 您可以从http://mixxx.org/download/ 下载64位的安装包。 + 您正在一个过时的操作系统上安装Mixxx。部分甚至全部功能可能无法正常工作,我们建议您升级操作系统。 + 您将要安装Mixxx的32位版本,但64位版本已经安装,这可能会导致超乎您意料的结果。请先卸载现有的Mixxx,或下载64位的安装包进行升级 (除非您知道自己在做什么。) + 您将要安装Mixxx的64位版本,但32位版本已经安装,这可能会导致超乎您意料的结果。请先卸载现有的Mixxx,或下载64位的安装包进行升级 (除非您知道自己在做什么。) + 已检测到旧版本的Mixxx。我们现已更换安装程序,这将导致不能直接进行升级。安装此版本之前请先卸载旧版本。 + 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. + + + {\WixUI_Font_Title}警告 + + + 退出安装程序后,启动Mixxx + + + 完整软件包 + 核心程序 + 核心Mixxx程序包含控制器预设 + PDB 调试符号文件 + 安装用于辅助调试的 PDB 文件。这些文件在调试 Mixxx 时会非常有用,有了这些文件就能向开发团队提供人类可读的回溯信息。 + 桌面快捷方式 + 添加Mixxx的快捷方式到您的桌面 + 用户手册 + Mixxx用户手册为PDF格式,您也可在http://mixxx.org/manual/ 上查看。 + 翻译 + 资源文件将允许Mixxx显示英语(美国)以外的语言 + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/mixxx_zh-TW.wxl b/build/wix/Localization/mixxx_zh-TW.wxl new file mode 100644 index 000000000000..50c194c90176 --- /dev/null +++ b/build/wix/Localization/mixxx_zh-TW.wxl @@ -0,0 +1,104 @@ + + + + + + + + + + + + 1028 + + + + Mixxx + Mixxx + Mixxx 開發團隊 + 開放源碼數位 DJ 軟體 + 安裝 Mixxx + + + + 此產品需要 Windows XP 或以上。 + 已安裝相同版本或更新版本的這種產品。 + 您需要在 64 位 Windows 上安裝此產品的 64 位版本。 + 您需要在 32 位 Windows 上安裝 32 位版本的這種產品。 + 您將要在 64 位作業系統上安裝 32 位版本。 我們推薦使用 64 位版本的更好的性能。 你可以從 HTTP://mixxx.org/download/ 下載 64 位安裝包 + 你過時的作業系統上安裝 Mixxx。好或根本,某些功能可能無法工作。我們建議升級您的作業系統。 + 您將要安裝的 32 位版本,但已經安裝了一個 64 位。這可能導致意外的行為。首先,請卸載現有的 Mixxx 首先,請卸載現有的 Mixxx 或下載 64 位安裝套裝軟體來升級 (除非你知道你在做什麼)。 + 您將要安裝 64 位版本,但已經安裝了一個 32 位。這可能導致意外的行為。首先,請卸載現有的 Mixxx 首先,請卸載現有的 Mixxx 或下載 32 位安裝套裝軟體來升級 (除非你知道你在做什麼)。 + 檢測到舊版本的 Mixxx。當我們改變了安裝程式,我們不能順利升級。請安裝這個之前,卸載舊版本。 + 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. + + + {\WixUI_Font_Title}警告 + + + Launch Mixxx when setup exits. + + + 完整的包。 + 核心應用程式 + 核心 Mixxx 應用程式包括控制器預設。 + PDB debug files + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + 桌面快捷方式 + 添加 Mixxx 在您的桌面上的快捷方式 + 使用者手冊 + The Mixxx user manual in PDF form, also available at http://mixxx.org/manual/ + Translations + Resource files that allow Mixxx to display in alternate languages, other than US english + + + [WixBundleName] Setup + [WixBundleName] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or creates a complete local copy of the bundle in directory. Install is the default. /passive | /quiet - displays minimal user interface with no prompts or displays no user interface and no prompts. By default user interface and all prompts are displayed. /norestart - suppress any attempts to restart. By default user interface will prompt before restart. /log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + Welcome + Setup will install Mixxx on your computer. It will first install required third party libraries, then Mixxx itself. Click Install to continue or Close to exit. + Version [WixBundleVersion] + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Setup Successful + Mixxx installation has been successful + Mixxx repair has been successful + Mixxx uninstall has been successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Mixxx installation failed + Mixxx repair failed + Mixxx uninstall failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + diff --git a/build/wix/Localization/po/ca-ES.po b/build/wix/Localization/po/ca-ES.po index b024e2081d9f..88ed3497cbe3 100644 --- a/build/wix/Localization/po/ca-ES.po +++ b/build/wix/Localization/po/ca-ES.po @@ -1,13 +1,15 @@ # # Translators: +# Benny Beat , 2016 # Ferran Pujol Camins , 2016 -# Josep Maria Antolin Segura , 2016 +# Josep Maria Antolin , 2016-2017 +# Josep Maria Antolin , 2016 # S.Brandt , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Catalan (Spain) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/ca_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,7 +46,7 @@ msgstr "Aquesta aplicació requereix Windows XP o una versió més recent." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "Ja teniu instal·lada aquesta versió del Mixxx o una de més recent." +msgstr "Ja teniu instal·lada aquesta versió del Mixxx o una més recent." msgctxt "x64VersionRequired" msgid "" @@ -61,13 +63,13 @@ msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "Esteu apunt d'instal·lar la versió de 32 bits en un sistema operatiu de 64 bits.\nRecomanem utilitzar la versió de 64 bits per a un millor rendiment.\nPodeu descarregar l'instal·lador de la versió de 64 bits des de http://mixxx.org/download/" +msgstr "Esteu a punt d'instal·lar la versió de 32 bits en un sistema operatiu de 64 bits.\nRecomanem utilitzar la versió de 64 bits per a un millor rendiment.\nPodeu baixar l'instal·lador de la versió de 64 bits des de http://mixxx.org/download/" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "Esteu instal·lant el Mixxx en un sistema operatiu obsolet. Algunes de les funcionalitats poden no funcionar correctament. Recomanem actualitzar el sistema operatiu." +msgstr "Esteu instal·lant el Mixxx en un sistema operatiu obsolet. Algunes funcionalitats poden no funcionar correctament. Recomanem actualitzar el sistema operatiu." msgctxt "bitWidthMismatch32" msgid "" @@ -75,7 +77,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "Esteu a punt d'instal·lar la versió de 32 bits tot i que teniu instal·lada una versió de 64 bits. Això pot provocar un comportament no desitjat. Si us plau, desinstal·leu la versió existent del Mixxx primer, o bé descarregueu l'instal·lador de 64 bits per a actualitzar la versió (a no ser que sapigueu exactament el que esteu fent)." +msgstr "Esteu a punt d'instal·lar la versió de 32 bits tot i que teniu instal·lada una versió de 64 bits. Això pot provocar un comportament no desitjat. Desinstal·leu primer la versió existent del Mixxx o baixeu l'instal·lador de 64 bits per actualitzar la versió (a no ser que sapigueu exactament què esteu fent)." msgctxt "bitWidthMismatch64" msgid "" @@ -83,20 +85,32 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "Esteu a punt d'instal·lar la versió de 64 bits tot i que teniu instal·lada una versió de 32 bits. Això pot provocar un comportament no desitjat. Si us plau, desinstal·leu la versió existent del Mixxx primer, o bé descarregueu l'instal·lador de 32 bits per a actualitzar la versió (a no ser que sapigueu exactament el que esteu fent)." +msgstr "Esteu a punt d'instal·lar la versió de 64 bits tot i que teniu instal·lada una versió de 32 bits. Això pot provocar un comportament no desitjat. Desinstal·leu primer la versió existent del Mixxx o baixeu l'instal·lador de 32 bits per a actualitzar la versió (a no ser que sapigueu exactament què esteu fent)." msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." -msgstr "Hem detectat una versió anterior del Mixxx. Degut a que hem canviat l'instal·lador, no podem portar a terme l'actualització. És necessari que desinstal·leu la versió anterior abans d'instal·lar aquesta nova versió." +msgstr "S'ha detectat una versió anterior del Mixxx. Atès la limitació de l'instal·lador, no és possible actualitzar automàticament. Desinstal·leu la versió existent abans d'instal·lar aquesta versió." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Avís" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Inicia el Mixxx en acabar la instal·lació." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -108,15 +122,25 @@ msgstr "L'aplicació." msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." -msgstr "L'aplicació Mixxx incloent les preconfiguracions de controladors." +msgstr "L'aplicació Mixxx incloent les configuracions per defecte de diversos controladors." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Fitxers PDB de depuració" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Instal·la els fitxers PDB del Mixxx per utilitzar-los amb un depurador. Això és útil per depurar el Mixxx i poder enviar traces entenedores a l'equip de desenvolupadors." msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "Accés directe des de l'Escriptori" +msgstr "Crea una icona a l'escriptori" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "Afegeix un accés directe al Mixxx al vostre escriptori" +msgstr "Afegeix un accés directe al Mixxx a l'escriptori" msgctxt "FeatureManualTitle" msgid "User Manual" @@ -126,7 +150,7 @@ msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "El Manual d'usuari del Mixxx en format PDF, també disponible des de http://mixxx.org/manual/" +msgstr "El Manual d'usuari del Mixxx en format PDF i disponible a http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" @@ -136,4 +160,213 @@ msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" -msgstr "Fitxers de recursos addicionals que permeten mostrar el Mixxx en idiomes alternatius a l'anglès nordamericà." +msgstr "Fitxers de recursos addicionals que permeten mostrar el Mixxx en idiomes alternatius a l'anglès." + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/cs-CZ.po b/build/wix/Localization/po/cs-CZ.po index 6438f0671add..bb55d9402743 100644 --- a/build/wix/Localization/po/cs-CZ.po +++ b/build/wix/Localization/po/cs-CZ.po @@ -1,12 +1,13 @@ # # Translators: -# fri, 2016 -# Sébastien BLAISOT , 2016 +# fri, 2016-2017 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -91,11 +92,23 @@ msgid "" " one." msgstr "Byla zjištěna starší verze Mixxxu. Protože byl změněn instalátor, není možné povýšení provést hladce. Odinstalujte, prosím, starší verzi, předtím než začnete instalovat tuto." +msgctxt "VCredistNotFound" +msgid "" +"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 "" + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Varování" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Spustit Mixxx, když existuje nastavení." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -109,6 +122,16 @@ msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "Hlavní aplikace Mixxxu včetně přednastavení ovladačů." +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Soubory ladění PDB" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Nainstalujte soubory PDB Mixxxu k použití s ladičem. Toto je užitečné na ladění Mixxxu a poskytuje vývojářskému družstvu čitelné stopy." + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "Klávesová zkratka" @@ -136,3 +159,212 @@ msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "Zdrojové soubory, které Mixxx umožní provedení instalace Mixxxu v jiných jazycích, než je americká angličtina" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/de-DE.po b/build/wix/Localization/po/de-DE.po index d9fa65939f28..266ad9c2063e 100644 --- a/build/wix/Localization/po/de-DE.po +++ b/build/wix/Localization/po/de-DE.po @@ -1,11 +1,15 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Inpromtu , 2016 +# Inpromtu , 2016 +# S.Brandt , 2017 +# Sebastien BLAISOT , 2016-2017 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:08+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: German (Germany) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -90,11 +94,23 @@ msgid "" " one." msgstr "Eine ältere Version von Mixxx wurde erkannt. Da wir die Installer-Software geändert haben, können wir nicht problemlos aktualisieren. Bitte deinstallieren Sie ältere Version vor der Installation dieser neuen Version." +msgctxt "VCredistNotFound" +msgid "" +"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 "Das Installationsprogramm war nicht in der Lage Microsoft Visual C ++ 2015 Redistributable auf diesem System zu finden. Dies ist wahrscheinlich ein Bug des Installationsprogramms, der an Mixxx-Entwickler gemeldet werden sollte." + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Warnung" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Mixxx starten wenn das Setup abgeschlossen ist." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -108,6 +124,16 @@ msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "Die Mixxx Kernanwendung einschließlich Controller-Voreinstellungen." +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "PDB-Debug-Dateien" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Installiere Mixxx PDB-Dateien für die Verwendung mit einem Debugger. Dies ist nützlich, um Mixxx zu debuggen und dem Entwicklungsteam lesbare Backtraces zur Verfügung zu stellen." + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "Desktop-Verknüpfung" @@ -135,3 +161,212 @@ msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "Ressource-Dateien um Mixxx außer in US-Englisch in alternativen Sprachen anzeigen lassen" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "[WixBundleName] Setup" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "[WixBundleName]" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "Sind Sie sicher, dass Sie abbrechen möchten?" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "Vorherige Version" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "Setup-Hilfe" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "/install | /repair | /uninstall | /layout [Verzeichnis] - Installiert, repariert, deinstalliert\noder erstellt eine komplette lokale Kopie des Pakets im Verzeichnis\nInstallation ist die Standardeinstellung.\n\n /passive | /quiet - Zeigt minimale Benutzeroberfläche ohne Eingabeaufforderungen an oder\nzeigt keine Benutzeroberfläche und keine Eingabeaufforderungen. Standardmäßig werden Benutzeroberfläche und alle Eingabeaufforderungen angezeigt.\n\n /norestart - Unterdrückt Versuche neu zu starten. Standardmäßig wird die Benutzeroberfläche zum Neustart auffordern.\n\n /log log.txt - Protokolliert in eine bestimmte Datei. Standardmäßig wird eine Protokolldatei in % TEMP% erstellt." + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "&Schließen" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "Willkommen" + +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 "Setup installiert Mixxx auf Ihrem Computer.\nEs wird zuerst benötigte Drittanbieter-Bibliotheken, dann Mixxx selbst installieren\nKlicken Sie auf Installieren um fortzufahren, oder auf Schliessen um zu beenden." + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "Version [WixBundleVersion]" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "&Optionen" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "&Installieren" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "&Schließen" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "Setup-Optionen" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "Installationsverzeichnis:" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "&Durchsuchen" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "&OK" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "&Abbrechen" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "Dateien in Benutzung" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "Die folgenden Anwendungen verwenden Dateien, die aktualisiert werden müssen:" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "Die &Anwendungen schliessen, und versuchen sie neu zu starten." + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "&Schließe keine Anwendungen. Ein Neustart ist erforderlich." + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "&OK" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "&Abbrechen" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "Setup-Fortschritt" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "Wird bearbeitet:" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "Initialisiere..." + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "&Cancel" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "Setup ändern" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "&Reparieren" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "&Deinstallieren" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "&Schließen" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "Setup erfolgreich" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "Installation von Mixxx war erfolgreich" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "Reparatur von Mixxx war erfolgreich" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "Deinstallation von Mixxx war erfolgreich" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "&Start" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "Sie müssen Ihren Computer neu starten, bevor Sie die Software verwenden können." + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "&Neustart" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "&Schließen" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "Setup fehlgeschlagen" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "Installation von Mixxx ist fehlgeschlagen" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "Reparatur von Mixxx ist fehlgeschlagen" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "Deinstallation von Mixxx ist fehlgeschlagen" + +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 "Wegen einem oder mehrerer Probleme ist das Setup fehlgeschlagen. Bitte beheben Sie die Probleme und wiederholen das Setup. Weitere Informationen finden Sie in der Protokolldatei." + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "Sie müssen Ihren Computer neu starten, um die Zurücknahme der Softwareinstallation abzuschliessen." + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "&Neustart" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "&Schließen" diff --git a/build/wix/Localization/po/en-GB.po b/build/wix/Localization/po/en-GB.po deleted file mode 100644 index abb0724b0960..000000000000 --- a/build/wix/Localization/po/en-GB.po +++ /dev/null @@ -1,137 +0,0 @@ -# -# Translators: -# Sébastien BLAISOT , 2016 -msgid "" -msgstr "" -"Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/en_GB/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. Programm informations -msgctxt "ApplicationName" -msgid "Mixxx" -msgstr "" - -msgctxt "ManufacturerName" -msgid "Mixxx" -msgstr "" - -msgctxt "ManufacturerFullName" -msgid "The Mixxx Development Team" -msgstr "" - -msgctxt "ProductDescription" -msgid "Open-source Digital DJ software" -msgstr "" - -msgctxt "Comments" -msgid "Installs Mixxx" -msgstr "" - -#. Error messages -#. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE -msgctxt "OS2Old" -msgid "This product requires Windows XP or above." -msgstr "" - -msgctxt "NewerInstalled" -msgid "The same or a newer version of this product is already installed." -msgstr "" - -msgctxt "x64VersionRequired" -msgid "" -"You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" - -msgctxt "x86VersionRequired" -msgid "" -"You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" - -msgctxt "x86VersionWarning" -msgid "" -"You are about to install the 32-bit version on a 64-bit operating system.\r\n" -"We recommend using the 64-bit version for better performance.\r\n" -"You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" - -msgctxt "XPWarning" -msgid "" -"You are installing Mixxx on an outdated operating system. Some functions may" -" not work well or at all. We recommend upgrading your operating system." -msgstr "" - -msgctxt "bitWidthMismatch32" -msgid "" -"You are about to install the 32-bit version but a 64-bit one is already " -"installed. This can lead to undesired behavior. Please un-install the " -"existing Mixxx first, or download the 64-bit installation package to upgrade" -" (unless you know exactly what you are doing.)" -msgstr "" - -msgctxt "bitWidthMismatch64" -msgid "" -"You are about to install the 64-bit version but a 32-bit one is already " -"installed. This can lead to undesired behavior. Please un-install the " -"existing Mixxx first, or download the 32-bit installation package to upgrade" -" (unless you know exactly what you are doing.)" -msgstr "" - -msgctxt "OlderVersionFound" -msgid "" -"An older version of Mixxx has been detected. As we changed installer, we can" -" not smoothly upgrade. Please uninstall older version before installing this" -" one." -msgstr "" - -#. Custom Warning Dialog -msgctxt "WarningDlgTitle" -msgid "{\\WixUI_Font_Title}Warning" -msgstr "" - -#. Features translations -msgctxt "FeatureCompleteDescription" -msgid "The complete package." -msgstr "" - -msgctxt "FeatureMainProgramTitle" -msgid "Core application" -msgstr "" - -msgctxt "FeatureMainProgramDescription" -msgid "The core Mixxx application including controller presets." -msgstr "" - -msgctxt "FeatureDesktopShortcutTitle" -msgid "Desktop Shortcut" -msgstr "" - -msgctxt "FeatureDesktopShortcutDescription" -msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" - -msgctxt "FeatureManualTitle" -msgid "User Manual" -msgstr "" - -msgctxt "FeatureManualDescription" -msgid "" -"The Mixxx user manual in PDF form, also available at " -"http://mixxx.org/manual/" -msgstr "" - -msgctxt "FeatureTranslationsTitle" -msgid "Translations" -msgstr "" - -msgctxt "FeatureTranslationsDescription" -msgid "" -"Resource files that allow Mixxx to display in alternate languages, other " -"than US english" -msgstr "" diff --git a/build/wix/Localization/po/es-ES.po b/build/wix/Localization/po/es-ES.po index f3b052496219..dc6e3fd89665 100644 --- a/build/wix/Localization/po/es-ES.po +++ b/build/wix/Localization/po/es-ES.po @@ -1,13 +1,16 @@ # # Translators: -# Jorge Marcos , 2016 -# Josep Maria Antolin Segura , 2016 -# Sébastien BLAISOT , 2016 +# Jorge Marcos (Jorgeelalto) , 2016 +# Jorge Marcos (Jorgeelalto) , 2016 +# Josep Maria Antolin , 2016-2017 +# Josep Maria Antolin , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -92,11 +95,23 @@ msgid "" " one." msgstr "Una versión anterior de Mixxx ha sido detectada. Dado que hemos cambiado de instalador, no podemos hacer una actualización limpia. Por favor, desinstale la versión anterior antes de instalar esta." +msgctxt "VCredistNotFound" +msgid "" +"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 "" + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Advertencia" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Ejecutar Mixxx una vez termine la instalación." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -110,6 +125,16 @@ msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "El núcleo de la aplicación, incluyendo las plantillas para los controladores." +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Ficheros PDB de depuración" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Instalar los ficheros PDB de Mixxx para uso con un depurador. Esto es útil para depurar Mixxx y enviar trazas de error comprensibles al equipo de desarrollo." + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "Acceso Directo" @@ -137,3 +162,212 @@ msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "Archivos de recursos que permiten la visualización de Mixxx en otros idiomas aparte del Inglés americano" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/et-EE.po b/build/wix/Localization/po/et-EE.po index eddc9a20bfd7..b9643fd67d36 100644 --- a/build/wix/Localization/po/et-EE.po +++ b/build/wix/Localization/po/et-EE.po @@ -1,11 +1,14 @@ # # Translators: +# Laur Pärn , 2016 # S.Brandt , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,56 +19,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Mixxx Arendusmeeskond" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Avatud lähtekoodiga digitaalne DJ tarkvara" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "Paigaldab Mixxxi" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "See toode nõuab Windows XP-d või uuemat op. süsteemi." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "Sama või uuem versioon sellest tootest on juba paigaldatud." msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "Sul tuleb paigaldada 64-bitine versioon sellest tootest 64-bitisele Windowsile." msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "Sul tuleb paigaldada 32-bitine versioon sellest tootest 32-bitisele Windowsile." msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "Sa soovid paigaldada 32-bitist versiooni 64-bitisele operatsioonisüsteemile.\nSoovitame kasutada 64-bitist versiooni parema jõudluse jaoks.\nSaate 64-bitise paigalduspaketi alla laadida aadressilt http://mixxx.org/download/" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "Te paigaldate Mixxxi vananenud operatsioonisüsteemile. Mõned funktsioonid ei pruugi normaalselt või üldse töödata. Soovitame teil uuendada oma operatsioonisüsteem." msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +76,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Sa proovid paigaldada 32-bitist versiooni, kuid 64-bitine on juba paigaldatud. See võib viia soovimatu käitumiseni. Palun eemaldage olemasolev Mixxx kõigepealt või laadige 64-bitine paigalduspakett uuendamiseks alla (kui sa just ei tea mida sa täpselt teed)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +84,288 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Sa proovid paigaldada 64-bitist versiooni aga 32-bitine on juba paigaldatud. See võib viia soovimatu käitumiseni. Palun eemaldage olemasolev Mixxx kõigepealt või laadige 32-bitine paigalduspakett uuendamiseks alla (kui sa just ei tea mida sa täpselt teed)" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "Tuvastati vanem versioo Mixxxist. Kuna me vahetasime paigaldajat, ei saa me tõrgeteta uuendada. Palun eemaldage vanem versioon enne selle paigaldamist." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Hoiatus" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." msgstr "" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "Kogu pakett." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Põhi rakendus" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." +msgstr "Põhirakendus Mixxx koos kontrollerite eelseadistustega." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." msgstr "" msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Töölaua otsetee" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Lisa Mixxxi otsetee oma töölauale" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Kasutusjuhend" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Mixxxi kasutusjuhend on PDF failis, lisaks saadaval http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Tõlked" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "Ressursifailid mis lubavad Mixxxil kuvada teisi alternatiivkeeli peale Ameerika Ühendriikide inglise keele" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/fr-BE.po b/build/wix/Localization/po/fr-BE.po deleted file mode 100644 index 445a4880fe72..000000000000 --- a/build/wix/Localization/po/fr-BE.po +++ /dev/null @@ -1,137 +0,0 @@ -# -# Translators: -# Sébastien BLAISOT , 2016 -msgid "" -msgstr "" -"Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" -"Language-Team: French (Belgium) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/fr_BE/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr_BE\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. Programm informations -msgctxt "ApplicationName" -msgid "Mixxx" -msgstr "" - -msgctxt "ManufacturerName" -msgid "Mixxx" -msgstr "" - -msgctxt "ManufacturerFullName" -msgid "The Mixxx Development Team" -msgstr "" - -msgctxt "ProductDescription" -msgid "Open-source Digital DJ software" -msgstr "" - -msgctxt "Comments" -msgid "Installs Mixxx" -msgstr "" - -#. Error messages -#. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE -msgctxt "OS2Old" -msgid "This product requires Windows XP or above." -msgstr "" - -msgctxt "NewerInstalled" -msgid "The same or a newer version of this product is already installed." -msgstr "" - -msgctxt "x64VersionRequired" -msgid "" -"You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" - -msgctxt "x86VersionRequired" -msgid "" -"You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" - -msgctxt "x86VersionWarning" -msgid "" -"You are about to install the 32-bit version on a 64-bit operating system.\r\n" -"We recommend using the 64-bit version for better performance.\r\n" -"You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" - -msgctxt "XPWarning" -msgid "" -"You are installing Mixxx on an outdated operating system. Some functions may" -" not work well or at all. We recommend upgrading your operating system." -msgstr "" - -msgctxt "bitWidthMismatch32" -msgid "" -"You are about to install the 32-bit version but a 64-bit one is already " -"installed. This can lead to undesired behavior. Please un-install the " -"existing Mixxx first, or download the 64-bit installation package to upgrade" -" (unless you know exactly what you are doing.)" -msgstr "" - -msgctxt "bitWidthMismatch64" -msgid "" -"You are about to install the 64-bit version but a 32-bit one is already " -"installed. This can lead to undesired behavior. Please un-install the " -"existing Mixxx first, or download the 32-bit installation package to upgrade" -" (unless you know exactly what you are doing.)" -msgstr "" - -msgctxt "OlderVersionFound" -msgid "" -"An older version of Mixxx has been detected. As we changed installer, we can" -" not smoothly upgrade. Please uninstall older version before installing this" -" one." -msgstr "" - -#. Custom Warning Dialog -msgctxt "WarningDlgTitle" -msgid "{\\WixUI_Font_Title}Warning" -msgstr "" - -#. Features translations -msgctxt "FeatureCompleteDescription" -msgid "The complete package." -msgstr "" - -msgctxt "FeatureMainProgramTitle" -msgid "Core application" -msgstr "" - -msgctxt "FeatureMainProgramDescription" -msgid "The core Mixxx application including controller presets." -msgstr "" - -msgctxt "FeatureDesktopShortcutTitle" -msgid "Desktop Shortcut" -msgstr "" - -msgctxt "FeatureDesktopShortcutDescription" -msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" - -msgctxt "FeatureManualTitle" -msgid "User Manual" -msgstr "" - -msgctxt "FeatureManualDescription" -msgid "" -"The Mixxx user manual in PDF form, also available at " -"http://mixxx.org/manual/" -msgstr "" - -msgctxt "FeatureTranslationsTitle" -msgid "Translations" -msgstr "" - -msgctxt "FeatureTranslationsDescription" -msgid "" -"Resource files that allow Mixxx to display in alternate languages, other " -"than US english" -msgstr "" diff --git a/build/wix/Localization/po/fr-FR.po b/build/wix/Localization/po/fr-FR.po index 738f403012be..86a2fa0bc456 100644 --- a/build/wix/Localization/po/fr-FR.po +++ b/build/wix/Localization/po/fr-FR.po @@ -1,11 +1,12 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016-2017 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:22+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:07+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: French (France) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/fr_FR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -90,11 +91,23 @@ msgid "" " one." msgstr "Une ancienne version de Mixxx a été détectée. Comme nous avons changé d'installeur, nous ne pouvons pas mettre à jour de manière transparente. Merci de désinstaller l'ancienne version avant d'installer celle-ci." +msgctxt "VCredistNotFound" +msgid "" +"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 "L'installeur n'a pas pu trouver \"Microsoft Visual C++ 2015 Redistribuable\" sur votre système. Il s'agit probablement d'un bug de l'installer qui doit être rapporté aux développeurs de Mixxx." + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Attention" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Démarrer Mixxx en quittant l'installeur." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -108,6 +121,16 @@ msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "Le programme et l'ensemble de ses dépendances." +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Fichiers PDB de debug " + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Installe les fichiers PDB de Mixxx, à utiliser avec un debuggueur. Utile pour débugguer Mixxx et fournir à l'équipe de développement des backtraces exploitables." + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "Raccourci sur le bureau" @@ -135,3 +158,212 @@ msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "Fichiers de ressources contenant les traductions de Mixxx autres que l'anglais (US)" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "Installeur de [WixBundleName]" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "[WixBundleName]" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "Êtes-vous sûr de vouloir annuler ?" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "Version précédente" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "Aide de l'installeur" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "/install | /repair | /uninstall | /layout [directory] - installe, répare, désinstalle ou\n crée une copie locale complète du bundle dans ce répertoire.\n install est la valeur par défaut.\n\n/passive | /quiet - afiche une interface minimale sans question ou\n n'affiche aucune interface ni question.\n Par défaut, l'interface et toutes les questions sont affichés.\n\n/norestart - ne tente pas de redémarrer.\n Par défaut, l'interface demandera avant de redémarrer.\n\n/log log.txt - fichier spécifique de journal. Par défaut, les journaux\n sont créés dans %TEMP%." + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "&Fermer" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "Bienvenue" + +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 "L'installeur installera Mixxx sur votre ordinateur.\nIl installera d'abord les librairies tierces, puis Mixxx lui-même.\nCliquez sur Installer pour continuer ou Fermer pour quitter." + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "Version [WixBundleVersion]" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "&Options" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "&Installer" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "&Fermer" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "Options d'installation" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "Emplacement d'installation :" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "&Parcourir" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "&OK" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "&Annuler" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "Fichiers en cours d'utilisation" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "Les applications suivantes utilisent les fichiers à mettre à jour :" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "Fermer les &applications et tenter de les redémarrer." + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "&Ne pas fermer les applications. Un reboot sera nécessaire." + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "&OK" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "&Annuler" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "Progression de l'installation" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "En cours :" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "Initialisation..." + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "&Annuler" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "Modifier l'installation" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "&Réparer" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "&Désinstaller" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "&Fermer" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "Installation réussie" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "Mixxx a été installé avec succès" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "Mixxx a été réparé avec succès" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "Mixxx a été désinstallé avec succès" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "&Lancer" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "Vous devez redémarrer votre ordinateur avant de pouvoir utiliser le logiciel." + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "&Redémarrer" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "&Fermer" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "Installation échouée" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "L'installation de Mixxx a échoué" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "La réparation de Mixxx a échoué" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "La désinstallation de Mixxx a échoué" + +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 "Une ou plusieurs erreurs ont fait échoué l'installation. Corrigez-les et réessayez. Pour de plus amples informations, consultez le fichier journal." + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "Vous devez redémarrer votre ordinateur pour terminer le retour-arrière du logiciel." + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "&Redémarrer" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "&Fermer" diff --git a/build/wix/Localization/po/it-IT.po b/build/wix/Localization/po/it-IT.po index 640b34ad0883..23a01f184965 100644 --- a/build/wix/Localization/po/it-IT.po +++ b/build/wix/Localization/po/it-IT.po @@ -1,12 +1,15 @@ # # Translators: +# Damtux, 2016 # Edoardo Codeglia , 2016 -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Damtux, 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Italian (Italy) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,15 +20,15 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Il Team Sviluppo di Mixxx" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" @@ -91,48 +94,279 @@ msgid "" " one." msgstr "" +msgctxt "VCredistNotFound" +msgid "" +"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 "" + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Attenzione" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." msgstr "" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "Il pacchetto software completo." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Applicazione principale" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "" +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "" + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Collegamento sul Desktop" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Aggiunge un collegamento a Mixxx sul tuo desktop" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Manuale Utente" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Il manuale di Mixxx in formato PDF, disponibile anche su http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Traduzioni" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/mixxx.pot b/build/wix/Localization/po/mixxx.pot index 055aa2758610..d6358e9da6da 100644 --- a/build/wix/Localization/po/mixxx.pot +++ b/build/wix/Localization/po/mixxx.pot @@ -67,11 +67,20 @@ msgctxt "OlderVersionFound" msgid "An older version of Mixxx has been detected. As we changed installer, we can not smoothly upgrade. Please uninstall older version before installing this one." msgstr "" +msgctxt "VCredistNotFound" +msgid "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 "" + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "" + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -85,6 +94,14 @@ msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "" +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team." +msgstr "" + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "" @@ -108,3 +125,209 @@ msgstr "" msgctxt "FeatureTranslationsDescription" msgid "Resource files that allow Mixxx to display in alternate languages, other than US english" msgstr "" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/nl-NL.po b/build/wix/Localization/po/nl-NL.po index 60c7f631f569..85b6bbb8021d 100644 --- a/build/wix/Localization/po/nl-NL.po +++ b/build/wix/Localization/po/nl-NL.po @@ -1,11 +1,14 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Raf Van De Meirssche , 2016 +# Raf Van De Meirssche , 2016 +# Sebastien BLAISOT , 2016-2017 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \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" @@ -16,56 +19,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Het Mixxx ontwikkellingsteam" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Open-source Digitale DJ software" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "Installeert Mixxx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "Dit product vereist Windows XP of hoger." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "Dezelfde of een nieuwere versie van dit product is reeds geïnstalleerd." msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "Je moet de 64-bits versie van dit product installeren op een 64-bits versie van Windows." msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "Je moet de 32-bits versie van dit product installeren op een 32-bits versie van Windows." msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "Je staat op het punt om de 32-bits versie te installeren op een 64-bits besturingssysteem.\nWe raden aan om de 64-bits versie te gebruiken voor betere prestaties.\nJe kunt het 64-bits installatiepakket downloaden van http://mixxx.org/download/" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "Je wilt Mixxx installeren op een verouderd besturingssysteem. Sommige functies werken mogelijk niet goed of helemaal niet. We raden je aan om je besturingssysteem te upgraden." msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +76,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Je wilt de 32-bits versie installeren maar een 64-bits is reeds geïnstalleerd. Dit kan leiden tot ongewenste effecten. Gelieve eerst de bestaande Mixxx te verwijderen, of het 64-bits installatiepakket te downloaden en te upgraden (Tenzij je exact weet waar je aan begint)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +84,288 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Je wilt de 64-bits versie installeren maar een 32-bits is reeds geïnstalleerd. Dit kan leiden tot ongewenste effecten. Gelieve eerst de bestaande Mixxx te verwijderen, of het 32-bits installatiepakket te downloaden en te upgraden (Tenzij je exact weet waar je aan begint)" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "Een oudere versie van Mixxx is gedetecteerd. Door wijziging van de installer is een vlotte bijwerking niet mogelijk. Verwijder de oudere versie voordat u deze versie installeert." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +msgstr "{\\WixUI_Font_Title}Waarschuwing" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Start Mixxx na de installatie." #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "Het volledige pakket." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Kerntoepassing" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." -msgstr "" +msgstr "De Mixxx-kerntoepassing inclusief voorinstellingen voor controllers." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "PDB debug-bestanden" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Installeer Mixxx PDB-bestanden om te gebruiken met een debugger. Dit is nuttig om Mixxx te debuggen en het ontwikkelingsteam een leesbare backtrace te bieden." msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Snelkoppeling op het bureaublad" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Voeg een snelkoppeling naar Mixxx toe op je bureaublad" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Gebruikershandleiding" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "De Mixxx gebruikershandleiding in PDF-formaat, ook beschikbaar op http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Vertalingen" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "Hulpbestanden die Mixxx toelaten om te werken met andere talen dan Amerikaans Engels" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/pl-PL.po b/build/wix/Localization/po/pl-PL.po new file mode 100644 index 000000000000..e044386b34b1 --- /dev/null +++ b/build/wix/Localization/po/pl-PL.po @@ -0,0 +1,368 @@ +# +# Translators: +# Jan Ochwat , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Mixxx DJ Windows installer\n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" +"Language-Team: Polish (Poland) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#. Programm informations +msgctxt "ApplicationName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerFullName" +msgid "The Mixxx Development Team" +msgstr "Drużyna Deweloperska Mixxx'a" + +msgctxt "ProductDescription" +msgid "Open-source Digital DJ software" +msgstr "Oprogramowanie DJ Open-source" + +msgctxt "Comments" +msgid "Installs Mixxx" +msgstr "Instaluje Mixxx" + +#. Error messages +#. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE +msgctxt "OS2Old" +msgid "This product requires Windows XP or above." +msgstr "Ten produkt wymaga Windowsa XP lub wyżsego" + +msgctxt "NewerInstalled" +msgid "The same or a newer version of this product is already installed." +msgstr "Ta lub nowsza wersja tego produktu jest juź zainstalowana." + +msgctxt "x64VersionRequired" +msgid "" +"You need to install the 64-bit version of this product on 64-bit Windows." +msgstr "Musisz zainstalować 64-bitową wersję na 64-bitowym Windowsie." + +msgctxt "x86VersionRequired" +msgid "" +"You need to install the 32-bit version of this product on 32-bit Windows." +msgstr "Musisz zainstalować 32-bitową wersję na 32-bitowym Windowsie." + +msgctxt "x86VersionWarning" +msgid "" +"You are about to install the 32-bit version on a 64-bit operating system.\r\n" +"We recommend using the 64-bit version for better performance.\r\n" +"You can download the 64-bit installation package from http://mixxx.org/download/" +msgstr "Masz zamiar zainstalować wersję 32-bitową w 64-bitowym systemie operacyjnym.\nZalecane jest użycie 64-bitowej wersji dla lepszej wydajności.\nPakiet instalacji 64-bitowej można pobrać z http://mixxx.org/download/" + +msgctxt "XPWarning" +msgid "" +"You are installing Mixxx on an outdated operating system. Some functions may" +" not work well or at all. We recommend upgrading your operating system." +msgstr "Instalujesz Mixxx'a na przestarzałym systemie operacyjnym. Niektóre funkcje mogą nie działac prawidłowo lub wcale. Rekomendujemy zaktualizować swój system operacyjny." + +msgctxt "bitWidthMismatch32" +msgid "" +"You are about to install the 32-bit version but a 64-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 64-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "Masz zamiar zainstalować 32-bitową wersje, ale już jest zainstalowana wersja 64-bitowa. Może to prowadzić do niepożądanego działania. Najpierw należy odinstalować istniejącego Mixxx'a, lub Pobrać pakiet instalacji 64-bitowej do uaktualnienia (chyba, że wiesz, co robisz.)" + +msgctxt "bitWidthMismatch64" +msgid "" +"You are about to install the 64-bit version but a 32-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 32-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "Masz zamiar zainstalować 64-bitową wersję, ale już jest zainstalowana wersja 32-bitowa. Może to prowadzić do niepożądanego działania. Najpierw należy odinstalować istniejącego Mixxx'a, lub Pobrać pakiet instalacji 32-bitowe do uaktualnienia (chyba, że wiesz, co robisz.)" + +msgctxt "OlderVersionFound" +msgid "" +"An older version of Mixxx has been detected. As we changed installer, we can" +" not smoothly upgrade. Please uninstall older version before installing this" +" one." +msgstr "Wykryto starszą wersję Mixxx. Zmieniliśy Instalator, nie można płynnie uaktualnić programu. Proszę odinstalować starszą wersję przed zainstalowaniem tej." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" + +#. Custom Warning Dialog +msgctxt "WarningDlgTitle" +msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Ostrzeżenie" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Włącz Mixxx'a kiedy skończy się instalacja." + +#. Features translations +msgctxt "FeatureCompleteDescription" +msgid "The complete package." +msgstr "Kompletny pakiet." + +msgctxt "FeatureMainProgramTitle" +msgid "Core application" +msgstr "Główna aplikacja" + +msgctxt "FeatureMainProgramDescription" +msgid "The core Mixxx application including controller presets." +msgstr "Mixxx posiada zapisane ustawienia do różnych kontrolerów." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "" + +msgctxt "FeatureDesktopShortcutTitle" +msgid "Desktop Shortcut" +msgstr "Skrót na pulpicie" + +msgctxt "FeatureDesktopShortcutDescription" +msgid "Add a shortcut to Mixxx on your desktop" +msgstr "Dodaj skrót do Mixxx'a na twoim pulpicie" + +msgctxt "FeatureManualTitle" +msgid "User Manual" +msgstr "Instrukcja obsługi" + +msgctxt "FeatureManualDescription" +msgid "" +"The Mixxx user manual in PDF form, also available at " +"http://mixxx.org/manual/" +msgstr "Instrukcja obsługi Mixxx'a jest również dostępna jako PDF na http://mixxx.org/manual/" + +msgctxt "FeatureTranslationsTitle" +msgid "Translations" +msgstr "Translacje" + +msgctxt "FeatureTranslationsDescription" +msgid "" +"Resource files that allow Mixxx to display in alternate languages, other " +"than US english" +msgstr "Pliki zasobów, które pozwalają Mixxx'owi do wyświetlania w alternatywnych językach innych niż Angielski US" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/pt-BR.po b/build/wix/Localization/po/pt-BR.po index a2f87c5c6c64..219ecd7bcfb5 100644 --- a/build/wix/Localization/po/pt-BR.po +++ b/build/wix/Localization/po/pt-BR.po @@ -1,11 +1,14 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Felipe Morato , 2017 +# Fer22f , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \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" @@ -16,56 +19,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "A Equipe de Desenvolvimento do Mixxx" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Software de DJ digital de código-aberto" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "Instala o Mixx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "Esse produto requer Windows XP ou melhor." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "A mesma ou melhor versão deste produto já está instalada." msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "Você precisa instalar a versão 64-bit desse produto no Windows 64-bit." msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "Você precisa instalar a versão 32-bit desse produto no Windows 32-bit." msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "Você está prestes a instalar a versão 32-bit em um sistema operacional 64-bit.\nNós recomendamos usar uma versão 64-bit para melhor performance.\nVocê pode baixar o pacote de instalação 64-bit de http://mixxx.org/download/" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "Você está instalando o Mixxx em um sistema operacional desatualizado. Algumas funções podem não funcionar corretamente ou nem funcionar. Nós recomendamos atualizar o seu sistema operacional." msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +76,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Você está prestes a instalar a versão 32-bit mas uma versão 64-bit já está instalada. Isso pode levar a comportamento indesejado. Por favor desinstale a versão existente do Mixxx primeiro, ou baixe o pacote de instalação 64-bit para atualizar (a menos que você saiba exatamente o que você está fazendo.)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +84,288 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Você está prestes a instalar a versão 64-bit mas uma versão 32-bit já está instalada. Isso pode levar a comportamento indesejado. Por favor desinstale a versão existente do Mixxx primeiro, ou baixe o pacote de instalação 32-bit para atualizar (a menos que você saiba exatamente o que você está fazendo.)" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "Uma versão antiga do Mixxx foi detectada. Como nós mudamos de instalador, não podemos atualizá-la de forma adequada. Por favor desinstale a versão antiga antes de instalar esta." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +msgstr "{\\WixUI_Font_Title}Atenção" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Executar o Mixxx quando a instalação acabar." #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "O pacote inteiro." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Núcleo da aplicação" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." -msgstr "" +msgstr "O núcleo da aplicação MIxxx incluindo pré-definições de controlador." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Arquivos PDB para debugar" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Instalar os arquivos PDB do Mixxx para usar com um debugger. isso é útil para debugar o Mixxx e fornece backtraces legíveis para a equipe de desenvolvimento." msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Atalho na Área de Trabalho" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Cria um atalho do Mixxx na sua área de trabalho" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Manual do Usuário" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "O manual do usuário do Mixxx em formato PDF, também disponível em http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Traduções" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "Arquivos de recursos que premitem o Mixxx mostrar outras linguagens além do inglês." + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/pt-PT.po b/build/wix/Localization/po/pt-PT.po index cbb89ac73040..a62d2830ba90 100644 --- a/build/wix/Localization/po/pt-PT.po +++ b/build/wix/Localization/po/pt-PT.po @@ -1,12 +1,14 @@ # # Translators: # Diogo Oliveira , 2016 -# Sébastien BLAISOT , 2016 +# Joaquim Carvalho , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -91,11 +93,23 @@ msgid "" " one." msgstr "Foi detetada uma versão anterior do Mixxx. Como nós mudámos o instalador, não podemos facilmente proceder à atualização. Por favor desinstale a versão antiga antes de instalar esta." +msgctxt "VCredistNotFound" +msgid "" +"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 "" + #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" msgstr "{\\WixUI_Font_Title}Aviso" +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Iniciar o Mixxx após sair da instalação." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -103,12 +117,22 @@ msgstr "O pacote completo." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "Core application" +msgstr "Aplicação principal" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." msgstr "A Mixxx core application inclui presets de controladores." +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "Ficheiros PDB de depuração" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Instala ficheiros PDB do Mixxx para usar com um depurador. Isto é bastante útil para permitir o retorno de indícios legíveis à equipa de desenvolvimento e depurar o Mixxx." + msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" msgstr "Atalho no ambiente de trabalho" @@ -119,7 +143,7 @@ msgstr "Adiciona um atalho do Mixxx no ambiente de trabalho" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "Manual" +msgstr "Manual do Utilizador" msgctxt "FeatureManualDescription" msgid "" @@ -135,4 +159,213 @@ msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" -msgstr "Ficheiros de recurso que permite ao Mixxx apresentar outras linguagens, diferentes do US english" +msgstr "Ficheiros de recurso que permitem ao Mixxx apresentar outras linguagens, diferentes do inglês - EUA" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/ro-RO.po b/build/wix/Localization/po/ro-RO.po index b15cca911bc5..bac94b86871e 100644 --- a/build/wix/Localization/po/ro-RO.po +++ b/build/wix/Localization/po/ro-RO.po @@ -1,11 +1,14 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# titus , 2016 +# titus , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Romanian (Romania) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/ro_RO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,43 +19,43 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Echipa de dezvoltare Mixxx" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Aplicaţie DJ Digital Opesource" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "Instalare Mixxx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "Acest produs necesită Windows XP sau ulterior." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "Aceiaşi sau o versiune mai nouă a acestui produs este deja instalată." msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "Trebuie să instalaţi versiunea produsului pe 64-biţi pentru Windows." msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "Trebuie să instalaţi versiunea pe 32-biţi a acestui produs pentru Windows." msgctxt "x86VersionWarning" msgid "" @@ -65,7 +68,7 @@ msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "Instalaţi Mixxx pe un sistem de operare expirat. Unele funcţii este posibil să nu funcţioneze corect sau deloc. Vă recomandăm să actualizaţi sistemul de operare." msgctxt "bitWidthMismatch32" msgid "" @@ -88,50 +91,281 @@ msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "O versiune veche Mixxx a fost detectată. Deoarece am schimbat instalatorul, nu putem actualiza facil. Dezinstalaţi versiunea veche înaintea instalării acesteia." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Atenţie" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." msgstr "" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "Pachetul complet." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Aplicaţia de bază" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." +msgstr "Aplicaţia de bază Mixxx include preconfigurări controllere." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." msgstr "" msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Scurtătură birou" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Adaugă o scurtătură pentru Mixxx pe birou" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Manual utilizator" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Manualul utilizatorului Mixxx în format PDF, este disponibil la " msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Traduceri" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "Fişierele resursă care permit Mixxx să afişeze în alte limbi, altele decât Engleza US" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/ru-RU.po b/build/wix/Localization/po/ru-RU.po index cb012be53f48..49533ad3ba60 100644 --- a/build/wix/Localization/po/ru-RU.po +++ b/build/wix/Localization/po/ru-RU.po @@ -1,11 +1,14 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Vladimir Novikov , 2016 +# Андрей Фролов , 2017 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Russian (Russia) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,56 +19,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Команда разработчиков The Mixxx" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Программа с открытым исходным кодом для ди-джеев" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "Установите Mixxx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "Этот продукт поддерживается на Windows XP и выше." msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "Данная или выше версия продукта уже установлена." msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "Вам необходимо установить 64-битную версию продукта на 64-битную версию Windows." msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "Вам необходимо установить 32-битную версию продукта на 32-битную версию Windows." msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "Вы пытаетесь установить 32-битную версию на 64-битную версию операционной системы.\nМы рекомендуем использовать 64-битную версию для увеличения производительности.\nВы можете скачать 64-битную версию программы на http://mixxx.org/download/." msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "Вы установили Mixxx на операционную систему, которая более не поддерживается. Некоторые функции могут не работать или работать некорректно. Рекомендуем Вам обновить операционную систему." msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +76,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Вы пытаетесь установить 32-битную версию, но у вас уже установлена 64-битная версия. Это может привести к нежелательным последствиям. Пожалуйста, удалите сначала установленную версию, или скачайте 64-битную версию установщика для обновления текущей версии ПО (если вы уверены в том, что делаете.)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +84,288 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "Вы пытаетесь установить 64-битную версию, но у вас уже установлена 32-битная версия. Это может привести к нежелательным последствиям. Пожалуйста, удалите сначала установленную версию, или скачайте 32-битную версию установщика для обновления текущей версии ПО (если вы уверены в том, что делаете.)" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "Обнаружена страя версия Mixxx. Так как установщик был изменен, нет возможности обновения версии ПО. Пожалуйста, удалите старую версию перед запуском данного установщика." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +msgstr "{\\WixUI_Font_Title}Предупреждение" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Запуск Mixxx, и выход из режима настройки" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "Полный пакет." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "Основная программа" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." -msgstr "" +msgstr "Основная программа Mixxx включает настройки контроллера." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "PDB файлы отладки" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "Установите Mixxx PDB файлы для использования с помощью отладчика. Это полезно для отладки Mixxx и обеспечит считывание у цепочек вызова команды разработчиков." msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "Ярлык на Рабочем столе" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Добавляет ярлык Mixxx на Рабочий стол" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Руководство пользователя" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Руквоводство пользователя Mixxx в формате PDF, так же доступно на http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Переводы" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "Файлы, позволяющие Mixxx отображать интерфейс на альтернативных языках, нежели US английский." + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/sv-SE.po b/build/wix/Localization/po/sv-SE.po new file mode 100644 index 000000000000..f9a39d277070 --- /dev/null +++ b/build/wix/Localization/po/sv-SE.po @@ -0,0 +1,368 @@ +# +# Translators: +# Henrik Mattsson-Mårn , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Mixxx DJ Windows installer\n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/sv_SE/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv_SE\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Programm informations +msgctxt "ApplicationName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerFullName" +msgid "The Mixxx Development Team" +msgstr "Mixxx-utvecklingsteamet" + +msgctxt "ProductDescription" +msgid "Open-source Digital DJ software" +msgstr "Open-source digital DJ-mjukvara" + +msgctxt "Comments" +msgid "Installs Mixxx" +msgstr "Installerar Mixxx" + +#. Error messages +#. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE +msgctxt "OS2Old" +msgid "This product requires Windows XP or above." +msgstr "Denna produkt kräver Windows XP eller högre." + +msgctxt "NewerInstalled" +msgid "The same or a newer version of this product is already installed." +msgstr "Samma eller en nyare version av denna produkt är redan installerad." + +msgctxt "x64VersionRequired" +msgid "" +"You need to install the 64-bit version of this product on 64-bit Windows." +msgstr "Du behöver installera 64-bitars-versionen utav denna produkt på 64-bitars Windows." + +msgctxt "x86VersionRequired" +msgid "" +"You need to install the 32-bit version of this product on 32-bit Windows." +msgstr "Du behöver installera 32-bitars-versionen utav denna produkt på 32-bitars Windows." + +msgctxt "x86VersionWarning" +msgid "" +"You are about to install the 32-bit version on a 64-bit operating system.\r\n" +"We recommend using the 64-bit version for better performance.\r\n" +"You can download the 64-bit installation package from http://mixxx.org/download/" +msgstr "" + +msgctxt "XPWarning" +msgid "" +"You are installing Mixxx on an outdated operating system. Some functions may" +" not work well or at all. We recommend upgrading your operating system." +msgstr "" + +msgctxt "bitWidthMismatch32" +msgid "" +"You are about to install the 32-bit version but a 64-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 64-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "" + +msgctxt "bitWidthMismatch64" +msgid "" +"You are about to install the 64-bit version but a 32-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 32-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "" + +msgctxt "OlderVersionFound" +msgid "" +"An older version of Mixxx has been detected. As we changed installer, we can" +" not smoothly upgrade. Please uninstall older version before installing this" +" one." +msgstr "" + +msgctxt "VCredistNotFound" +msgid "" +"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 "" + +#. Custom Warning Dialog +msgctxt "WarningDlgTitle" +msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Varning" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Starta Mixxx när installationen avslutar." + +#. Features translations +msgctxt "FeatureCompleteDescription" +msgid "The complete package." +msgstr "Hela paketet." + +msgctxt "FeatureMainProgramTitle" +msgid "Core application" +msgstr "Kärnapplikation" + +msgctxt "FeatureMainProgramDescription" +msgid "The core Mixxx application including controller presets." +msgstr "Kärn-Mixxx-applikationen inklusive controller-förval." + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "PDB-debugfiler" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "" + +msgctxt "FeatureDesktopShortcutTitle" +msgid "Desktop Shortcut" +msgstr "Skrivbordsgenväg" + +msgctxt "FeatureDesktopShortcutDescription" +msgid "Add a shortcut to Mixxx on your desktop" +msgstr "Lägg till en genväg till Mixxx på ditt skrivbord" + +msgctxt "FeatureManualTitle" +msgid "User Manual" +msgstr "Användarmanual" + +msgctxt "FeatureManualDescription" +msgid "" +"The Mixxx user manual in PDF form, also available at " +"http://mixxx.org/manual/" +msgstr "Mixxx användarmanual i PDF-format, även tillgänglig på http://mixxx.org/manual/" + +msgctxt "FeatureTranslationsTitle" +msgid "Translations" +msgstr "Översättningar" + +msgctxt "FeatureTranslationsDescription" +msgid "" +"Resource files that allow Mixxx to display in alternate languages, other " +"than US english" +msgstr "Resursfiler som tillåter Mixxx att visas i alternativa språk, andra än amerikansk engelska" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/tr-TR.po b/build/wix/Localization/po/tr-TR.po new file mode 100644 index 000000000000..8cd14522a5f7 --- /dev/null +++ b/build/wix/Localization/po/tr-TR.po @@ -0,0 +1,369 @@ +# +# Translators: +# Salih Tekin , 2017 +# Salih Tekin , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Mixxx DJ Windows installer\n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \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" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. Programm informations +msgctxt "ApplicationName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerName" +msgid "Mixxx" +msgstr "Mixxx" + +msgctxt "ManufacturerFullName" +msgid "The Mixxx Development Team" +msgstr "Mixxx Geliştirici Takımı" + +msgctxt "ProductDescription" +msgid "Open-source Digital DJ software" +msgstr "Açık-kaynak Dijital DJ yazılımı" + +msgctxt "Comments" +msgid "Installs Mixxx" +msgstr "Mixxx'i Yükler" + +#. Error messages +#. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE +msgctxt "OS2Old" +msgid "This product requires Windows XP or above." +msgstr "Bu ürün Windows XP ve üzerini gerektirir." + +msgctxt "NewerInstalled" +msgid "The same or a newer version of this product is already installed." +msgstr "Bu ürünün aynı veya daha yeni bir sürümü zaten yüklü." + +msgctxt "x64VersionRequired" +msgid "" +"You need to install the 64-bit version of this product on 64-bit Windows." +msgstr "64-bit Windows üzerine bu ürünün 64-bit sürümünü yüklemeniz gerekmektedir." + +msgctxt "x86VersionRequired" +msgid "" +"You need to install the 32-bit version of this product on 32-bit Windows." +msgstr "32-bit Windows üzerine bu ürünün 32-bit sürümünü yüklemeniz gerekmektedir." + +msgctxt "x86VersionWarning" +msgid "" +"You are about to install the 32-bit version on a 64-bit operating system.\r\n" +"We recommend using the 64-bit version for better performance.\r\n" +"You can download the 64-bit installation package from http://mixxx.org/download/" +msgstr "64-bit bir işletim sistemine 32-bit sürümü yüklemek üzeresiniz.\nDaha iyi bir performans için 64-bit sürümü kullanmanızı öneririz.\n64-bit Yükleme paketini http://mixxx.org/download/ adresinden edinebilirsiniz." + +msgctxt "XPWarning" +msgid "" +"You are installing Mixxx on an outdated operating system. Some functions may" +" not work well or at all. We recommend upgrading your operating system." +msgstr "Mixxx'i eski bir işletim sistemine yüklemek üzeresiniz. Bazı özellikler istendiği gibi veya hiç çalışmayabilir. İşletim sisteminizi yükseltmenizi öneririz." + +msgctxt "bitWidthMismatch32" +msgid "" +"You are about to install the 32-bit version but a 64-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 64-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "32-bit sürümü yüklemek üzeresiniz ancak bir 64-bit sürüm zaten yüklü. Devam etmek istenmeyen sonuçlar doğurabilir. Lütfen önce mevcut Mixxx'i kaldırın, veya güncellemek için 64-bit yükleme paketini indirin (ne yaptığınızı tam olarak bilmiyorsanız)." + +msgctxt "bitWidthMismatch64" +msgid "" +"You are about to install the 64-bit version but a 32-bit one is already " +"installed. This can lead to undesired behavior. Please un-install the " +"existing Mixxx first, or download the 32-bit installation package to upgrade" +" (unless you know exactly what you are doing.)" +msgstr "64-bit sürümü yüklemek üzeresiniz ancak bir 32-bit versiyon zaten yüklü. Devam etmek istenmeyen sonuçlar doğurabilir. Lütfen önce Mixxx'i kaldırın, veya güncellemek için 32-bit yükleme paketini indirin (ne yaptığınızı tam olarak bilmiyorsanız)." + +msgctxt "OlderVersionFound" +msgid "" +"An older version of Mixxx has been detected. As we changed installer, we can" +" not smoothly upgrade. Please uninstall older version before installing this" +" one." +msgstr "Mixxx'in daha eski bir sürümü tespit edildi. Yükleyici'yi değiştirdiğimiz için pürüzsüz bir güncelleme deneyimi sunamıyoruz. Lütfen yüklemeden önce eski sürümü kaldırın." + +msgctxt "VCredistNotFound" +msgid "" +"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 "" + +#. Custom Warning Dialog +msgctxt "WarningDlgTitle" +msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title} Uyarı" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "Kurulumdan çıktıktan sonra Mixxx'i çalıştır." + +#. Features translations +msgctxt "FeatureCompleteDescription" +msgid "The complete package." +msgstr "Tam paket." + +msgctxt "FeatureMainProgramTitle" +msgid "Core application" +msgstr "Çekirdek uygulama" + +msgctxt "FeatureMainProgramDescription" +msgid "The core Mixxx application including controller presets." +msgstr "Çekirdek Mixxx uygulaması, kontrolör önayarları dahil" + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "" + +msgctxt "FeatureDesktopShortcutTitle" +msgid "Desktop Shortcut" +msgstr "Masaüstü Kısayolu" + +msgctxt "FeatureDesktopShortcutDescription" +msgid "Add a shortcut to Mixxx on your desktop" +msgstr "Masaüstüne Mixxx'e bir kısayol ekle" + +msgctxt "FeatureManualTitle" +msgid "User Manual" +msgstr "Kullanım Kılavuzu" + +msgctxt "FeatureManualDescription" +msgid "" +"The Mixxx user manual in PDF form, also available at " +"http://mixxx.org/manual/" +msgstr "Mixxx kullanım kılavuzu PDF formunda, ayrıca http://mixxx.org/manual/ adresinde mevcut." + +msgctxt "FeatureTranslationsTitle" +msgid "Translations" +msgstr "Çeviriler" + +msgctxt "FeatureTranslationsDescription" +msgid "" +"Resource files that allow Mixxx to display in alternate languages, other " +"than US english" +msgstr "Mixxx'in ABD dili dışındaki alternatif dillerde görüntülenmesine izin veren kaynak dosyaları" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/Localization/po/zh-CN.po b/build/wix/Localization/po/zh-CN.po index 30f360259f68..5b5644e23d2c 100644 --- a/build/wix/Localization/po/zh-CN.po +++ b/build/wix/Localization/po/zh-CN.po @@ -1,11 +1,16 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Chee Kin Weng , 2016 +# liushuyu011 , 2017 +# liushuyu011 , 2017 +# Nya Chan (喵酱) , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Chinese (China) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,56 +21,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Mixxx开发团队" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "开源数字DJ软件" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "安装Mixxx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "此产品要求Windows XP或更高版本。" msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "已安装此产品相同或更高版本。" msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "您需要在64位Windows上安装本产品的64位版本。" msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "您需要在32位Windows上安装本产品的32位版本。" msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "您将要在64位操作系统上安装32位版本的Mixxx。\n我们建议使用64位版本以获取更好的性能。\n您可以从http://mixxx.org/download/ 下载64位的安装包。" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "您正在一个过时的操作系统上安装Mixxx。部分甚至全部功能可能无法正常工作,我们建议您升级操作系统。" msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +78,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "您将要安装Mixxx的32位版本,但64位版本已经安装,这可能会导致超乎您意料的结果。请先卸载现有的Mixxx,或下载64位的安装包进行升级 (除非您知道自己在做什么。)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +86,288 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "您将要安装Mixxx的64位版本,但32位版本已经安装,这可能会导致超乎您意料的结果。请先卸载现有的Mixxx,或下载64位的安装包进行升级 (除非您知道自己在做什么。)" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "已检测到旧版本的Mixxx。我们现已更换安装程序,这将导致不能直接进行升级。安装此版本之前请先卸载旧版本。" + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +msgstr "{\\WixUI_Font_Title}警告" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." +msgstr "退出安装程序后,启动Mixxx" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "完整软件包" msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "核心程序" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." -msgstr "" +msgstr "核心Mixxx程序包含控制器预设" + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "PDB 调试符号文件" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." +msgstr "安装用于辅助调试的 PDB 文件。这些文件在调试 Mixxx 时会非常有用,有了这些文件就能向开发团队提供人类可读的回溯信息。" msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "桌面快捷方式" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "添加Mixxx的快捷方式到您的桌面" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "用户手册" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Mixxx用户手册为PDF格式,您也可在http://mixxx.org/manual/ 上查看。" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "翻译" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" +msgstr "资源文件将允许Mixxx显示英语(美国)以外的语言" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" msgstr "" diff --git a/build/wix/Localization/po/zh-TW.po b/build/wix/Localization/po/zh-TW.po index 5b4dc9099c2f..6c449e5cc8a9 100644 --- a/build/wix/Localization/po/zh-TW.po +++ b/build/wix/Localization/po/zh-TW.po @@ -1,11 +1,13 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# 鬼迪 陳 , 2016 msgid "" msgstr "" "Project-Id-Version: Mixxx DJ Windows installer\n" -"PO-Revision-Date: 2016-01-09 20:21+0000\n" -"Last-Translator: Sébastien BLAISOT \n" +"PO-Revision-Date: 2017-07-15 15:06+0000\n" +"Last-Translator: Sebastien BLAISOT \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,56 +18,56 @@ msgstr "" #. Programm informations msgctxt "ApplicationName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerName" msgid "Mixxx" -msgstr "" +msgstr "Mixxx" msgctxt "ManufacturerFullName" msgid "The Mixxx Development Team" -msgstr "" +msgstr "Mixxx 開發團隊" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "開放源碼數位 DJ 軟體" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +msgstr "安裝 Mixxx" #. Error messages #. DO NOT BREAK LINES BECAUSE LINE BREAKS WILL SHOW UP AS-IS IN THE INTERFACE msgctxt "OS2Old" msgid "This product requires Windows XP or above." -msgstr "" +msgstr "此產品需要 Windows XP 或以上。" msgctxt "NewerInstalled" msgid "The same or a newer version of this product is already installed." -msgstr "" +msgstr "已安裝相同版本或更新版本的這種產品。" msgctxt "x64VersionRequired" msgid "" "You need to install the 64-bit version of this product on 64-bit Windows." -msgstr "" +msgstr "您需要在 64 位 Windows 上安裝此產品的 64 位版本。" msgctxt "x86VersionRequired" msgid "" "You need to install the 32-bit version of this product on 32-bit Windows." -msgstr "" +msgstr "您需要在 32 位 Windows 上安裝 32 位版本的這種產品。" msgctxt "x86VersionWarning" msgid "" "You are about to install the 32-bit version on a 64-bit operating system.\r\n" "We recommend using the 64-bit version for better performance.\r\n" "You can download the 64-bit installation package from http://mixxx.org/download/" -msgstr "" +msgstr "您將要在 64 位作業系統上安裝 32 位版本。\r\n我們推薦使用 64 位版本的更好的性能。\r\n你可以從 HTTP://mixxx.org/download/ 下載 64 位安裝包" msgctxt "XPWarning" msgid "" "You are installing Mixxx on an outdated operating system. Some functions may" " not work well or at all. We recommend upgrading your operating system." -msgstr "" +msgstr "你過時的作業系統上安裝 Mixxx。好或根本,某些功能可能無法工作。我們建議升級您的作業系統。" msgctxt "bitWidthMismatch32" msgid "" @@ -73,7 +75,7 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 64-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "您將要安裝的 32 位版本,但已經安裝了一個 64 位。這可能導致意外的行為。首先,請卸載現有的 Mixxx 首先,請卸載現有的 Mixxx 或下載 64 位安裝套裝軟體來升級 (除非你知道你在做什麼)。" msgctxt "bitWidthMismatch64" msgid "" @@ -81,44 +83,66 @@ msgid "" "installed. This can lead to undesired behavior. Please un-install the " "existing Mixxx first, or download the 32-bit installation package to upgrade" " (unless you know exactly what you are doing.)" -msgstr "" +msgstr "您將要安裝 64 位版本,但已經安裝了一個 32 位。這可能導致意外的行為。首先,請卸載現有的 Mixxx 首先,請卸載現有的 Mixxx 或下載 32 位安裝套裝軟體來升級 (除非你知道你在做什麼)。" msgctxt "OlderVersionFound" msgid "" "An older version of Mixxx has been detected. As we changed installer, we can" " not smoothly upgrade. Please uninstall older version before installing this" " one." +msgstr "檢測到舊版本的 Mixxx。當我們改變了安裝程式,我們不能順利升級。請安裝這個之前,卸載舊版本。" + +msgctxt "VCredistNotFound" +msgid "" +"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 "" #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}警告" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." msgstr "" #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." -msgstr "" +msgstr "完整的包。" msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +msgstr "核心應用程式" msgctxt "FeatureMainProgramDescription" msgid "The core Mixxx application including controller presets." +msgstr "核心 Mixxx 應用程式包括控制器預設。" + +msgctxt "FeaturePDBTitle" +msgid "PDB debug files" +msgstr "" + +msgctxt "FeaturePDBDescription" +msgid "" +"Install Mixxx PDB files to use with a debugger. This is useful to debug " +"Mixxx and provide readable backtraces to the development team." msgstr "" msgctxt "FeatureDesktopShortcutTitle" msgid "Desktop Shortcut" -msgstr "" +msgstr "桌面快捷方式" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "添加 Mixxx 在您的桌面上的快捷方式" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "使用者手冊" msgctxt "FeatureManualDescription" msgid "" @@ -135,3 +159,212 @@ msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" msgstr "" + +#. Bootstrapper +msgctxt "Caption" +msgid "[WixBundleName] Setup" +msgstr "" + +msgctxt "Title" +msgid "[WixBundleName]" +msgstr "" + +msgctxt "ConfirmCancelMessage" +msgid "Are you sure you want to cancel?" +msgstr "" + +msgctxt "ExecuteUpgradeRelatedBundleMessage" +msgid "Previous version" +msgstr "" + +msgctxt "HelpHeader" +msgid "Setup Help" +msgstr "" + +msgctxt "HelpText" +msgid "" +"/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or\n" +" creates a complete local copy of the bundle in directory.\n" +" Install is the default.\n" +"\n" +" /passive | /quiet - displays minimal user interface with no prompts or displays no user interface\n" +" and no prompts. By default user interface and all prompts are displayed.\n" +"\n" +" /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 "" + +msgctxt "HelpCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "InstallHeader" +msgid "Welcome" +msgstr "" + +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 "" + +msgctxt "InstallVersion" +msgid "Version [WixBundleVersion]" +msgstr "" + +msgctxt "InstallOptionsButton" +msgid "&Options" +msgstr "" + +msgctxt "InstallInstallButton" +msgid "&Install" +msgstr "" + +msgctxt "InstallCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "OptionsHeader" +msgid "Setup Options" +msgstr "" + +msgctxt "OptionsLocationLabel" +msgid "Install location:" +msgstr "" + +msgctxt "OptionsBrowseButton" +msgid "&Browse" +msgstr "" + +msgctxt "OptionsOkButton" +msgid "&OK" +msgstr "" + +msgctxt "OptionsCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "FilesInUseHeader" +msgid "Files In Use" +msgstr "" + +msgctxt "FilesInUseLabel" +msgid "The following applications are using files that need to be updated:" +msgstr "" + +msgctxt "FilesInUseCloseRadioButton" +msgid "Close the &applications and attempt to restart them." +msgstr "" + +msgctxt "FilesInUseDontCloseRadioButton" +msgid "&Do not close applications. A reboot will be required." +msgstr "" + +msgctxt "FilesInUseOkButton" +msgid "&OK" +msgstr "" + +msgctxt "FilesInUseCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ProgressHeader" +msgid "Setup Progress" +msgstr "" + +msgctxt "ProgressLabel" +msgid "Processing:" +msgstr "" + +msgctxt "OverallProgressPackageText" +msgid "Initializing..." +msgstr "" + +msgctxt "ProgressCancelButton" +msgid "&Cancel" +msgstr "" + +msgctxt "ModifyHeader" +msgid "Modify Setup" +msgstr "" + +msgctxt "ModifyRepairButton" +msgid "&Repair" +msgstr "" + +msgctxt "ModifyUninstallButton" +msgid "&Uninstall" +msgstr "" + +msgctxt "ModifyCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "SuccessHeader" +msgid "Setup Successful" +msgstr "" + +msgctxt "SuccessInstallHeader" +msgid "Mixxx installation has been successful" +msgstr "" + +msgctxt "SuccessRepairHeader" +msgid "Mixxx repair has been successful" +msgstr "" + +msgctxt "SuccessUninstallHeader" +msgid "Mixxx uninstall has been successful" +msgstr "" + +msgctxt "SuccessLaunchButton" +msgid "&Launch" +msgstr "" + +msgctxt "SuccessRestartText" +msgid "You must restart your computer before you can use the software." +msgstr "" + +msgctxt "SuccessRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "SuccessCloseButton" +msgid "&Close" +msgstr "" + +msgctxt "FailureHeader" +msgid "Setup Failed" +msgstr "" + +msgctxt "FailureInstallHeader" +msgid "Mixxx installation failed" +msgstr "" + +msgctxt "FailureRepairHeader" +msgid "Mixxx repair failed" +msgstr "" + +msgctxt "FailureUninstallHeader" +msgid "Mixxx uninstall failed" +msgstr "" + +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 "" + +msgctxt "FailureRestartText" +msgid "" +"You must restart your computer to complete the rollback of the software." +msgstr "" + +msgctxt "FailureRestartButton" +msgid "&Restart" +msgstr "" + +msgctxt "FailureCloseButton" +msgid "&Close" +msgstr "" diff --git a/build/wix/ProductID.wxi.in b/build/wix/ProductID.wxi.in new file mode 100644 index 000000000000..216e182e0a5b --- /dev/null +++ b/build/wix/ProductID.wxi.in @@ -0,0 +1,4 @@ + + + + diff --git a/build/wix/README.md b/build/wix/README.md index c9c7e0d77995..5bd63828b280 100644 --- a/build/wix/README.md +++ b/build/wix/README.md @@ -1,15 +1,33 @@ To build the windows installer package ========================================== -install & configure Wix toolset +Mixxx installation package is built with Wix Toolset v3.9+ +All the build logic is called from Sconscript, which calls Wix Toolset executables +to first build a multilingual MSI package for Mixxx, then create an executable +bundle embedding Visual Studio C++ redistributables and Mixxx's MSI. -once done : +`scons mixxx makerelease` -1. Build Mixxx -2. Package, calling build.bat +To test your multilingual package +================================= -For example, to build 64 bits package: -.\build.bat 64 +* MSI package: `msiexec /i mixxx-full-name.msi ProductLanguage=xxxx` +* EXE bundle: `mixxx-full-name.exe -lang xxxx` -or to build 32 bits package: -.\build.bat 32 \ No newline at end of file +where xxxx is a LCID in decimal notation taken from http://www.science.co.il/Language/Locale-codes.asp and available as a translation in build/wix/Localization + +Bootstrapper (bundle) command line options +========================================== +``` +-q, -quiet, -s, -silent = silent install +-passive = progress bar only install +-norestart = suppress any restarts +-forcerestart = restart no matter what (I don't know why this is still around) +-promptrestart = prompt if a restart is required (default) +-layout = create a local image of the bootstrapper (i.e. download files so they can be burned to DVD) +-l, -log = log to a specific file (default is controled by bundle developer) +-uninstall = uninstall +-repair = repair (or install if not installed) +-package,-update = install (default if no -uninstall or -repair) +-lang xxxx = apply language with lcid xxxx to bootstrapper +``` diff --git a/build/wix/WiLangId.vbs b/build/wix/WiLangId.vbs new file mode 100644 index 000000000000..582f6dbf6bab --- /dev/null +++ b/build/wix/WiLangId.vbs @@ -0,0 +1,164 @@ +' Windows Installer utility to report the language and codepage for a package +' For use with Windows Scripting Host, CScript.exe or WScript.exe +' Copyright (c) Microsoft Corporation. All rights reserved. +' Demonstrates the access of language and codepage values +' +Option Explicit + +Const msiOpenDatabaseModeReadOnly = 0 +Const msiOpenDatabaseModeTransact = 1 +Const ForReading = 1 +Const ForWriting = 2 +Const TristateFalse = 0 + +Const msiViewModifyInsert = 1 +Const msiViewModifyUpdate = 2 +Const msiViewModifyAssign = 3 +Const msiViewModifyReplace = 4 +Const msiViewModifyDelete = 6 + +Dim argCount:argCount = Wscript.Arguments.Count +If argCount > 0 Then If InStr(1, Wscript.Arguments(0), "?", vbTextCompare) > 0 Then argCount = 0 +If (argCount = 0) Then + message = "Windows Installer utility to manage language and codepage values for a package." &_ + vbNewLine & "The package language is a summary information property that designates the" &_ + vbNewLine & " primary language and any language transforms that are available, comma delim." &_ + vbNewLine & "The ProductLanguage in the database Property table is the language that is" &_ + vbNewLine & " registered for the product and determines the language used to load resources." &_ + vbNewLine & "The codepage is the ANSI codepage of the database strings, 0 if all ASCII data," &_ + vbNewLine & " and must represent the text data to avoid loss when persisting the database." &_ + vbNewLine & "The 1st argument is the path to MSI database (installer package)" &_ + vbNewLine & "To update a value, the 2nd argument contains the keyword and the 3rd the value:" &_ + vbNewLine & " Package {base LangId optionally followed by list of language transforms}" &_ + vbNewLine & " Product {LangId of the product (could be updated by language transforms)}" &_ + vbNewLine & " Codepage {ANSI codepage of text data (use with caution when text exists!)}" &_ + vbNewLine &_ + vbNewLine & "Copyright (C) Microsoft Corporation. All rights reserved." + Wscript.Echo message + Wscript.Quit 1 +End If + +' Connect to Windows Installer object +On Error Resume Next +Dim installer : Set installer = Nothing +Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError + + +' Open database +Dim databasePath:databasePath = Wscript.Arguments(0) +Dim openMode : If argCount >= 3 Then openMode = msiOpenDatabaseModeTransact Else openMode = msiOpenDatabaseModeReadOnly +Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError + +' Update value if supplied +If argCount >= 3 Then + Dim value:value = Wscript.Arguments(2) + Select Case UCase(Wscript.Arguments(1)) + Case "PACKAGE" : SetPackageLanguage database, value + Case "PRODUCT" : SetProductLanguage database, value + Case "CODEPAGE" : SetDatabaseCodepage database, value + Case Else : Fail "Invalid value keyword" + End Select + CheckError +End If + +' Extract language info and compose report message +Dim message:message = "Package language = " & PackageLanguage(database) &_ + ", ProductLanguage = " & ProductLanguage(database) &_ + ", Database codepage = " & DatabaseCodepage(database) +database.Commit : CheckError ' no effect if opened ReadOnly +Set database = nothing +Wscript.Echo message +Wscript.Quit 0 + +' Get language list from summary information +Function PackageLanguage(database) + On Error Resume Next + Dim sumInfo : Set sumInfo = database.SummaryInformation(0) : CheckError + Dim template : template = sumInfo.Property(7) : CheckError + Dim iDelim:iDelim = InStr(1, template, ";", vbTextCompare) + If iDelim = 0 Then template = "Not specified!" + PackageLanguage = Right(template, Len(template) - iDelim) + If Len(PackageLanguage) = 0 Then PackageLanguage = "0" +End Function + +' Get ProductLanguge property from Property table +Function ProductLanguage(database) + On Error Resume Next + Dim view : Set view = database.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductLanguage'") + view.Execute : CheckError + Dim record : Set record = view.Fetch : CheckError + If record Is Nothing Then ProductLanguage = "Not specified!" Else ProductLanguage = record.IntegerData(1) +End Function + +' Get ANSI codepage of database text data +Function DatabaseCodepage(database) + On Error Resume Next + Dim WshShell : Set WshShell = Wscript.CreateObject("Wscript.Shell") : CheckError + Dim tempPath:tempPath = WshShell.ExpandEnvironmentStrings("%TEMP%") : CheckError + database.Export "_ForceCodepage", tempPath, "codepage.idt" : CheckError + Dim fileSys : Set fileSys = CreateObject("Scripting.FileSystemObject") : CheckError + Dim file : Set file = fileSys.OpenTextFile(tempPath & "\codepage.idt", ForReading, False, TristateFalse) : CheckError + file.ReadLine ' skip column name record + file.ReadLine ' skip column defn record + DatabaseCodepage = file.ReadLine + file.Close + Dim iDelim:iDelim = InStr(1, DatabaseCodepage, vbTab, vbTextCompare) + If iDelim = 0 Then Fail "Failure in codepage export file" + DatabaseCodepage = Left(DatabaseCodepage, iDelim - 1) + fileSys.DeleteFile(tempPath & "\codepage.idt") +End Function + +' Set ProductLanguge property in Property table +Sub SetProductLanguage(database, language) + On Error Resume Next + If Not IsNumeric(language) Then Fail "ProductLanguage must be numeric" + Dim view : Set view = database.OpenView("SELECT `Property`,`Value` FROM `Property`") + view.Execute : CheckError + Dim record : Set record = installer.CreateRecord(2) + record.StringData(1) = "ProductLanguage" + record.StringData(2) = CStr(language) + view.Modify msiViewModifyAssign, record : CheckError +End Sub + +' Set ANSI codepage of database text data +Sub SetDatabaseCodepage(database, codepage) + On Error Resume Next + If Not IsNumeric(codepage) Then Fail "Codepage must be numeric" + Dim WshShell : Set WshShell = Wscript.CreateObject("Wscript.Shell") : CheckError + Dim tempPath:tempPath = WshShell.ExpandEnvironmentStrings("%TEMP%") : CheckError + Dim fileSys : Set fileSys = CreateObject("Scripting.FileSystemObject") : CheckError + Dim file : Set file = fileSys.OpenTextFile(tempPath & "\codepage.idt", ForWriting, True, TristateFalse) : CheckError + file.WriteLine ' dummy column name record + file.WriteLine ' dummy column defn record + file.WriteLine codepage & vbTab & "_ForceCodepage" + file.Close : CheckError + database.Import tempPath, "codepage.idt" : CheckError + fileSys.DeleteFile(tempPath & "\codepage.idt") +End Sub + +' Set language list in summary information +Sub SetPackageLanguage(database, language) + On Error Resume Next + Dim sumInfo : Set sumInfo = database.SummaryInformation(1) : CheckError + Dim template : template = sumInfo.Property(7) : CheckError + Dim iDelim:iDelim = InStr(1, template, ";", vbTextCompare) + Dim platform : If iDelim = 0 Then platform = ";" Else platform = Left(template, iDelim) + sumInfo.Property(7) = platform & language + sumInfo.Persist : CheckError +End Sub + +Sub CheckError + Dim message, errRec + If Err = 0 Then Exit Sub + message = Err.Source & " " & Hex(Err) & ": " & Err.Description + If Not installer Is Nothing Then + Set errRec = installer.LastErrorRecord + If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText + End If + Fail message +End Sub + +Sub Fail(message) + Wscript.Echo message + Wscript.Quit 2 +End Sub diff --git a/build/wix/WiSubStg.vbs b/build/wix/WiSubStg.vbs new file mode 100644 index 000000000000..93a15efd967f --- /dev/null +++ b/build/wix/WiSubStg.vbs @@ -0,0 +1,101 @@ +' Windows Installer utility to add a transform or nested database as a substorage +' For use with Windows Scripting Host, CScript.exe or WScript.exe +' Copyright (c) Microsoft Corporation. All rights reserved. +' Demonstrates the use of the database _Storages table +' +Option Explicit + +Const msiOpenDatabaseModeReadOnly = 0 +Const msiOpenDatabaseModeTransact = 1 +Const msiOpenDatabaseModeCreate = 3 + +Const msiViewModifyInsert = 1 +Const msiViewModifyUpdate = 2 +Const msiViewModifyAssign = 3 +Const msiViewModifyReplace = 4 +Const msiViewModifyDelete = 6 + +Const ForAppending = 8 +Const ForReading = 1 +Const ForWriting = 2 +Const TristateTrue = -1 + +' Check arg count, and display help if argument not present or contains ? +Dim argCount:argCount = Wscript.Arguments.Count +If argCount > 0 Then If InStr(1, Wscript.Arguments(0), "?", vbTextCompare) > 0 Then argCount = 0 +If (argCount = 0) Then + Wscript.Echo "Windows Installer database substorage managment utility" &_ + vbNewLine & " 1st argument is the path to MSI database (installer package)" &_ + vbNewLine & " 2nd argument is the path to a transform or database to import" &_ + vbNewLine & " If the 2nd argument is missing, substorages will be listed" &_ + vbNewLine & " 3rd argument is optional, the name used for the substorage" &_ + vbNewLine & " If the 3rd arugment is missing, the file name is used" &_ + vbNewLine & " To remove a substorage, use /D or -D as the 2nd argument" &_ + vbNewLine & " followed by the name of the substorage to remove" &_ + vbNewLine &_ + vbNewLine & "Copyright (C) Microsoft Corporation. All rights reserved." + Wscript.Quit 1 +End If + +' Connect to Windows Installer object +On Error Resume Next +Dim installer : Set installer = Nothing +Set installer = Wscript.CreateObject("WindowsInstaller.Installer") : CheckError + +' Evaluate command-line arguments and set open and update modes +Dim databasePath:databasePath = Wscript.Arguments(0) +Dim openMode : If argCount = 1 Then openMode = msiOpenDatabaseModeReadOnly Else openMode = msiOpenDatabaseModeTransact +Dim updateMode : If argCount > 1 Then updateMode = msiViewModifyAssign 'Either insert or replace existing row +Dim importPath : If argCount > 1 Then importPath = Wscript.Arguments(1) +Dim storageName : If argCount > 2 Then storageName = Wscript.Arguments(2) +If storageName = Empty And importPath <> Empty Then storageName = Right(importPath, Len(importPath) - InStrRev(importPath, "\",-1,vbTextCompare)) +If UCase(importPath) = "/D" Or UCase(importPath) = "-D" Then updateMode = msiViewModifyDelete : importPath = Empty 'substorage will be deleted if no input data + +' Open database and create a view on the _Storages table +Dim sqlQuery : Select Case updateMode + Case msiOpenDatabaseModeReadOnly: sqlQuery = "SELECT `Name` FROM _Storages" + Case msiViewModifyAssign: sqlQuery = "SELECT `Name`,`Data` FROM _Storages" + Case msiViewModifyDelete: sqlQuery = "SELECT `Name` FROM _Storages WHERE `Name` = ?" +End Select +Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError +Dim view : Set view = database.OpenView(sqlQuery) +Dim record + +If openMode = msiOpenDatabaseModeReadOnly Then 'If listing storages, simply fetch all records + Dim message, name + view.Execute : CheckError + Do + Set record = view.Fetch + If record Is Nothing Then Exit Do + name = record.StringData(1) + If message = Empty Then message = name Else message = message & vbNewLine & name + Loop + Wscript.Echo message +Else 'If adding a storage, insert a row, else if removing a storage, delete the row + Set record = installer.CreateRecord(2) + record.StringData(1) = storageName + view.Execute record : CheckError + If importPath <> Empty Then 'Insert storage - copy data into stream + record.SetStream 2, importPath : CheckError + Else 'Delete storage, fetch first to provide better error message if missing + Set record = view.Fetch + If record Is Nothing Then Wscript.Echo "Storage not present:", storageName : Wscript.Quit 2 + End If + view.Modify updateMode, record : CheckError + database.Commit : CheckError + Set view = Nothing + Set database = Nothing + CheckError +End If + +Sub CheckError + Dim message, errRec + If Err = 0 Then Exit Sub + message = Err.Source & " " & Hex(Err) & ": " & Err.Description + If Not installer Is Nothing Then + Set errRec = installer.LastErrorRecord + If Not errRec Is Nothing Then message = message & vbNewLine & errRec.FormatText + End If + Wscript.Echo message + Wscript.Quit 2 +End Sub diff --git a/build/wix/build.bat b/build/wix/build.bat deleted file mode 100644 index 6e2f97c761eb..000000000000 --- a/build/wix/build.bat +++ /dev/null @@ -1,88 +0,0 @@ -@echo off - -IF "%1"=="" ( -echo "Usage: build.bat " -echo. -echo "For example : .\build.bat 64" -exit /B 1 -) - -REM set this to the folder where you build the dependencies -set WINLIB_PATH64=D:\mixxx-buildserver64 -set WINLIB_PATH32=D:\mixxx-buildserver32 - - -if "%1" == "64" ( - echo *** Building 64 bits package - set BITWIDTH=64 - set ARCH=x64 - set WINLIB_PATH=%WINLIB_PATH64% -) else ( - echo *** Building 32 bits package - set WINLIB_PATH=%WINLIB_PATH32% - set BITWIDTH=32 - set ARCH=x86 -) - -REM The default language and corresponding LangID -SET DefaultLanguage=en-us -SET LangIds=1033 - -REM Development tool settings -SET WinSDKVersion=v7.0 - -echo. -echo *** Cleaning -if exist *.wixobj del *.wixobj -if exist *.wixpdb del *.wixpdb 2>NUL -if exist *.mst del *.mst 2>NUL -if exist subdirs\*.* del /Q subdirs\*.* - -echo. -echo *** Building intermediate files - -FOR %%d IN (controllers,fonts,imageformats,keyboard,plugins,skins,translations) DO ( - "%WIX%"\bin\heat.exe dir ..\..\dist%BITWIDTH%\%%d -nologo -sfrag -suid -ag -srd -cg %%dComp -dr %%dDir -out subdirs\%%d.wxs -sw5150 -var var.%%dVar - "%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -d%%dVar=..\..\dist%BITWIDTH%\%%d -arch %ARCH% -out subdirs\%%d.wixobj subdirs\%%d.wxs -) - -SET promo=no - -IF EXIST ..\..\dist%BITWIDTH%\promo ( - SET promo=yes - "%WIX%"\bin\heat.exe dir ..\..\dist%BITWIDTH%\promo -nologo -sfrag -suid -ag -srd -cg promoComp -dr promoDir -out subdirs\promo.wxs -sw5150 -var var.promoVar - "%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dpromoVar=..\..\dist%BITWIDTH%\promo -arch %ARCH% -out subdirs\promo.wixobj subdirs\promo.wxs -) - -REM Harvest main DLL from install dir -"%WIX%"\bin\heat.exe dir ..\..\dist%BITWIDTH% -nologo -sfrag -suid -ag -srd -cg mainDLLCompGroup -dr INSTALLDIR -out subdirs\mainDLL.wxs -sw5150 -var var.SourceDir -t only-dll.xslt -"%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dSourceDir=..\..\dist%BITWIDTH% -arch %ARCH% -out subdirs\mainDLL.wixobj subdirs\mainDLL.wxs - -"%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -arch %ARCH% warningDlg.wxs -"%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dPromo=%promo% -arch %ARCH% mixxx.wxs - -echo. -echo *** Building package for default language %DefaultLanguage% -"%WIX%"\bin\light.exe -nologo -sw1076 -ext WixUIExtension -cultures:%DefaultLanguage% -loc Localization\mixxx_%DefaultLanguage%.wxl -out mixxx-%BITWIDTH%-multilingual.msi *.wixobj subdirs\*.wixobj - -FOR %%G IN (Localization\*.wxl) DO ( - REM skip 19 chars (Localization\mixxx_), keep until end -4 char (.wxl) - set _locfile=%%G - set _locale=!_locfile:~19,-4! - IF "!_locale!" NEQ "%DefaultLanguage%" ( - REM Look for LangID in the wxl file. Don't ask me to explain the magic of this line ;) - for /f "delims=<> tokens=3" %%i in ('findstr "^[space]*< + + + + + + + + + + + + VersionNT64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/wix/bundle/bundletheme.xml b/build/wix/bundle/bundletheme.xml new file mode 100644 index 000000000000..6418108eabcc --- /dev/null +++ b/build/wix/bundle/bundletheme.xml @@ -0,0 +1,82 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + + #(loc.InstallHeader) + #(loc.InstallMessage) + #(loc.InstallVersion) + + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + + #(loc.FilesInUseHeader) + #(loc.FilesInUseLabel) + + + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + + + #(loc.ModifyHeader) + + + + + + + #(loc.SuccessHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) + + #(loc.SuccessRestartText) + + + + + + #(loc.FailureHeader) + #(loc.FailureInstallHeader) + #(loc.FailureRepairHeader) + #(loc.FailureUninstallHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + diff --git a/build/wix/clean.bat b/build/wix/clean.bat deleted file mode 100644 index 391bf680a14e..000000000000 --- a/build/wix/clean.bat +++ /dev/null @@ -1,8 +0,0 @@ -@ECHO OFF - -if exist *.wixobj del *.wixobj -if exist *.wixpdb del *.wixpdb -if exist *.log del *.log -if exist *.msi del *.msi -if exist subdirs\*.* del /Q subdirs\*.* -type NUL > subdirs\_EMPTY_ \ No newline at end of file diff --git a/build/wix/images/bundle-sidebar.png b/build/wix/images/bundle-sidebar.png new file mode 100644 index 000000000000..4296e0b43b90 Binary files /dev/null and b/build/wix/images/bundle-sidebar.png differ diff --git a/build/wix/images/bundle-sidebar.xcf b/build/wix/images/bundle-sidebar.xcf new file mode 100644 index 000000000000..d413656a82d5 Binary files /dev/null and b/build/wix/images/bundle-sidebar.xcf differ diff --git a/build/wix/images/bundle_background_black.png b/build/wix/images/bundle_background_black.png new file mode 100644 index 000000000000..c3458d018cbb Binary files /dev/null and b/build/wix/images/bundle_background_black.png differ diff --git a/build/wix/images/bundle_background_black.xcf b/build/wix/images/bundle_background_black.xcf new file mode 100644 index 000000000000..56a5e0713419 Binary files /dev/null and b/build/wix/images/bundle_background_black.xcf differ diff --git a/build/wix/images/dialog.bmp b/build/wix/images/dialog.bmp index 006503b63ca1..fd22c17192da 100644 Binary files a/build/wix/images/dialog.bmp and b/build/wix/images/dialog.bmp differ diff --git a/build/wix/images/dialog.xcf b/build/wix/images/dialog.xcf index b1fa162afba5..ef3894d20a1d 100644 Binary files a/build/wix/images/dialog.xcf and b/build/wix/images/dialog.xcf differ diff --git a/build/wix/mixxx.wxs b/build/wix/mixxx.wxs index 3a5056f0e9a6..04ce95e4acba 100644 --- a/build/wix/mixxx.wxs +++ b/build/wix/mixxx.wxs @@ -1,9 +1,9 @@ - + - + + + + + - + - + - + - + @@ -44,9 +51,9 @@ - + - + - - + @@ -75,9 +82,9 @@ Platform="$(var.Platform)" /> - - - + + + @@ -89,26 +96,40 @@ + + + - + + + + + - - - + Type="raw" + Win64="no" /> - + @@ -127,38 +148,83 @@ - NOT VCREDISTINSTALLED AND NOT Installed AND NOT REMOVE + + + - - - + + + + + + + + + + + + + + + + + + + + + + - - + - - @@ -167,7 +233,7 @@ - + NOT OLDERINSTALLEXISTS - - + VCREDISTINSTALLED + + @@ -203,52 +275,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - OTHERBITWIDTHINSTALLED - - - - OTHERBITWIDTHINSTALLED - - - - - - + + + + + + @@ -266,20 +301,11 @@ - - - - - - - - - - @@ -295,14 +321,13 @@ - - - + - - + + + + @@ -322,23 +347,11 @@ - - - - - - - - - - - - - - + + @@ -364,7 +377,7 @@ ==================================================================================== --> - + + Display="expand"> - - + + + - - + + + + + + + Level="3"> + @@ -410,7 +433,7 @@ InstallDefault='local' Level="1"> - + - + @@ -428,20 +451,23 @@ - - - - - - - 1 - 1 - - - - - - - + + + + + + + + + + + + + + OTHERBITWIDTHINSTALLED + 1 + + + - \ No newline at end of file + diff --git a/build/wix/only-pdb.xslt b/build/wix/only-pdb.xslt new file mode 100644 index 000000000000..8dabc4e0aa8b --- /dev/null +++ b/build/wix/only-pdb.xslt @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/wix/warningDlg.wxs b/build/wix/warningDlg.wxs deleted file mode 100644 index dc37592b8b06..000000000000 --- a/build/wix/warningDlg.wxs +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - 1 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/HID/HID Packet Parser Documentation.odt b/doc/HID/HID Packet Parser Documentation.odt deleted file mode 100644 index 7f8fb2cfa8c0..000000000000 Binary files a/doc/HID/HID Packet Parser Documentation.odt and /dev/null differ diff --git a/doc/HID/HID Packet Parser Documentation.pdf b/doc/HID/HID Packet Parser Documentation.pdf deleted file mode 100644 index 441b2cbcf068..000000000000 Binary files a/doc/HID/HID Packet Parser Documentation.pdf and /dev/null differ diff --git a/lib/fidlib-0.9.10/fidlib.c b/lib/fidlib-0.9.10/fidlib.c index 619325287c7a..f5c46a011b93 100644 --- a/lib/fidlib-0.9.10/fidlib.c +++ b/lib/fidlib-0.9.10/fidlib.c @@ -23,7 +23,7 @@ // // Robert Bristow-Johnson's EQ cookbook formulae: // http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt -// +// #define VERSION "0.9.10" @@ -35,7 +35,7 @@ // specify the filter, or it can be used with the frequency or // frequency range missing, in which case default values are // picked up from values passed directly to the routine. -// +// // The spec consists of a series of letters usually followed by // the order of the filter and then by any other parameters // required, preceded by slashes. For example: @@ -69,15 +69,15 @@ // okay= fid_list_filters_buf(buf, buf+sizeof(buf)); // // // Calculate the response of the filter at a given frequency -// // (frequency is given as a proportion of the sampling rate, in -// // the range 0 to 0.5). If phase is returned, then this is +// // (frequency is given as a proportion of the sampling rate, in +// // the range 0 to 0.5). If phase is returned, then this is // // given in the range 0 to 1 (for 0 to 2*pi). // resp= fid_response(filt, freq); // resp= fid_response_pha(filt, freq, &phase); // // // Estimate the signal delay caused by a particular filter, in samples // delay= fid_calc_delay(filt); -// +// // // Run a given filter (this will do JIT filter compilation if this is // // implemented for this processor / OS) // run= fid_run_new(filt, &funcp); @@ -93,7 +93,7 @@ // fid_run_freebuf(fbuf1); // fid_run_free(run); // -// // If you need to allocate your own buffers separately for some +// // If you need to allocate your own buffers separately for some // // reason, then do it this way: // run= fid_run_new(filt, &funcp); // len= fid_run_bufsize(run); @@ -109,30 +109,30 @@ // free(fbuf1); // fid_run_free(run); // -// // Convert an arbitrary filter into a new filter which is a single -// // IIR/FIR pair. This is done by convolving the coefficients. This -// // flattened filter will give the same result, in theory. However, -// // in practice this will be less accurate, especially in cases where -// // the limits of the floating point format are being reached (e.g. +// // Convert an arbitrary filter into a new filter which is a single +// // IIR/FIR pair. This is done by convolving the coefficients. This +// // flattened filter will give the same result, in theory. However, +// // in practice this will be less accurate, especially in cases where +// // the limits of the floating point format are being reached (e.g. // // subtracting numbers with small highly significant differences). // // The routine also ensures that the IIR first coefficient is 1.0. // filt2= fid_flatten(filt); // free(filt); // // // Parse an entire filter-spec string possibly containing several FIR, -// // IIR and predefined filters and return it as a FidFilter at the given +// // IIR and predefined filters and return it as a FidFilter at the given // // location. Stops at the first ,; or unmatched )]} character, or the end // // of the string. Returns a strdup'd error string on error, or else 0. // err= fid_parse(double rate, char **pp, FidFilter **ffp); // -// // Set up your own fatal-error handler (default is to dump a message +// // Set up your own fatal-error handler (default is to dump a message // // to STDERR and exit on fatal conditions) // fid_set_error_handler(&my_error_func); // // // Get the version number of the library as a string (e.g. "1.0.0") // txt= fid_version(); // -// // Design a filter and reduce it to a list of all the non-const +// // Design a filter and reduce it to a list of all the non-const // // coefficients, which is returned in the given double[]. The number // // of coefficients expected must be provided (as a check). // #define N_COEF @@ -148,11 +148,11 @@ // free(full); free(min); // // // Create a FidFilter based on coefficients provided in the -// // given double array. +// // given double array. // static double array[]= { 'I', 3, 1.0, 0.55, 0.77, 'F', 3, 1, -2, 1, 0 }; // filt= fid_cv_array(array); // -// // Join a number of filters into a single filter (and free them too, +// // Join a number of filters into a single filter (and free them too, // // if the first argument is 1) // filt= fid_cat(0, filt1, filt2, filt3, filt4, 0); // @@ -172,15 +172,15 @@ // elements, or whatever). This is followed by a short bitmap // which indicates which of the coefficients are constants, // aiding code-generation. Next comes the count of the following -// coefficients, as an int. (These header fields normally takes 8 -// bytes, the same as a double, but this might depend on the -// platform). Then follow the coefficients, as doubles. The next -// sub-filter follows on straight after that. The end of the list +// coefficients, as an int. (These header fields normally takes 8 +// bytes, the same as a double, but this might depend on the +// platform). Then follow the coefficients, as doubles. The next +// sub-filter follows on straight after that. The end of the list // is marked by 8 zero bytes, meaning typ==0, cbm==0 and len==0. // // The filter can be read with the aid of the FidFilter structure -// (giving typ, cbm, len and val[] elements) and the FFNEXT() -// macro: using ff= FFNEXT(ff) steps to the next FidFilter +// (giving typ, cbm, len and val[] elements) and the FFNEXT() +// macro: using ff= FFNEXT(ff) steps to the next FidFilter // structure along the chain. // // Note that within the sub-filters, coefficients are listed in @@ -263,7 +263,7 @@ extern FidFilter *mkfilter(char *, ...); #if defined(T_MINGW) || defined(T_MSVC) #define STATIC_INLINE static __inline #else - #define STATIC_INLINE static inline + #define STATIC_INLINE static inline #endif // MinGW and MSVC fixes @@ -275,7 +275,7 @@ extern FidFilter *mkfilter(char *, ...); #define snprintf _snprintf #endif // Not sure if we strictly need this still - STATIC_INLINE double + STATIC_INLINE double my_asinh(double val) { return log(val + sqrt(val*val + 1.0)); } @@ -289,7 +289,7 @@ extern FidFilter *mkfilter(char *, ...); static void (*error_handler)(char *err)= 0; -static void +static void error(char *fmt, ...) { char buf[1024]; va_list ap; @@ -311,7 +311,7 @@ strdupf(char *fmt, ...) { int len; va_start(ap, fmt); len= vsnprintf(buf, sizeof(buf), fmt, ap); - if (len < 0 || len >= sizeof(buf)-1) + if (len < 0 || len >= (int)sizeof(buf)-1) error("strdupf exceeded buffer"); rv= strdup(buf); if (!rv) error("Out of memory"); @@ -367,7 +367,7 @@ cmulr(double *aa, double fact) { // Complex conjugate: aa= aa* // -STATIC_INLINE void +STATIC_INLINE void cconj(double *aa) { aa[1]= -aa[1]; } @@ -389,18 +389,18 @@ cdiv(double *aa, double *bb) { // Complex reciprocal: aa= 1/aa // -STATIC_INLINE void +STATIC_INLINE void crecip(double *aa) { double fact= 1.0 / (aa[0] * aa[0] + aa[1] * aa[1]); aa[0] *= fact; aa[1] *= -fact; -} - +} + // // Complex assign: aa= bb // -STATIC_INLINE void +STATIC_INLINE void cass(double *aa, double *bb) { memcpy(aa, bb, 2*sizeof(double)); // Assigning doubles is really slow } @@ -409,7 +409,7 @@ cass(double *aa, double *bb) { // Complex assign: aa= (rr + ii*j) // -STATIC_INLINE void +STATIC_INLINE void cassz(double *aa, double rr, double ii) { aa[0]= rr; aa[1]= ii; @@ -419,7 +419,7 @@ cassz(double *aa, double rr, double ii) { // Complex add: aa += bb // -STATIC_INLINE void +STATIC_INLINE void cadd(double *aa, double *bb) { aa[0] += bb[0]; aa[1] += bb[1]; @@ -429,7 +429,7 @@ cadd(double *aa, double *bb) { // Complex add: aa += (rr + ii*j) // -STATIC_INLINE void +STATIC_INLINE void caddz(double *aa, double rr, double ii) { aa[0] += rr; aa[1] += ii; @@ -439,7 +439,7 @@ caddz(double *aa, double rr, double ii) { // Complex subtract: aa -= bb // -STATIC_INLINE void +STATIC_INLINE void csub(double *aa, double *bb) { aa[0] -= bb[0]; aa[1] -= bb[1]; @@ -449,7 +449,7 @@ csub(double *aa, double *bb) { // Complex subtract: aa -= (rr + ii*j) // -STATIC_INLINE void +STATIC_INLINE void csubz(double *aa, double rr, double ii) { aa[0] -= rr; aa[1] -= ii; @@ -459,7 +459,7 @@ csubz(double *aa, double rr, double ii) { // Complex negate: aa= -aa // -STATIC_INLINE void +STATIC_INLINE void cneg(double *aa) { aa[0]= -aa[0]; aa[1]= -aa[1]; @@ -503,7 +503,7 @@ evaluate(double *rv, double *coef, int n_coef, double *in) { // Housekeeping // -void +void fid_set_error_handler(void (*rout)(char*)) { error_handler= rout; } @@ -521,7 +521,7 @@ fid_version() { // phase between 0 and two-pi. // -double +double fid_response_pha(FidFilter *filt, double freq, double *phase) { double top[2], bot[2]; double theta= freq * 2 * M_PI; @@ -533,16 +533,16 @@ fid_response_pha(FidFilter *filt, double freq, double *phase) { bot[1]= 0; zz[0]= cos(theta); zz[1]= sin(theta); - + while (filt->len) { double resp[2]; int cnt= filt->len; evaluate(resp, filt->val, cnt, zz); if (filt->typ == 'I') - cmul(bot, resp); + cmul(bot, resp); else if (filt->typ == 'F') cmul(top, resp); - else + else error("Unknown filter type %d in fid_response_pha()", filt->typ); filt= FFNEXT(filt); } @@ -567,7 +567,7 @@ fid_response_pha(FidFilter *filt, double freq, double *phase) { // can be inlined. // -double +double fid_response(FidFilter *filt, double freq) { double top[2], bot[2]; double theta= freq * 2 * M_PI; @@ -579,16 +579,16 @@ fid_response(FidFilter *filt, double freq) { bot[1]= 0; zz[0]= cos(theta); zz[1]= sin(theta); - + while (filt->len) { double resp[2]; int cnt= filt->len; evaluate(resp, filt->val, cnt, zz); if (filt->typ == 'I') - cmul(bot, resp); + cmul(bot, resp); else if (filt->typ == 'F') cmul(top, resp); - else + else error("Unknown filter type %d in fid_response()", filt->typ); filt= FFNEXT(filt); } @@ -605,13 +605,13 @@ fid_response(FidFilter *filt, double freq) { // are complete. This involves running test impulses through the // filter several times. The estimated delay in samples is // returned. -// +// // Delays longer than 8,000,000 samples are not handled well, as // the code drops out at this point rather than get stuck in an // endless loop. // -int +int fid_calc_delay(FidFilter *filt) { FidRun *run; FidFunc *dostep; @@ -626,20 +626,20 @@ fid_calc_delay(FidFilter *filt) { // a reference point much further ahead in the impulse response. f1= fid_run_newbuf(run); f2= fid_run_newbuf(run); - + tot= fabs(dostep(f1, 1.0)); tot100= fabs(dostep(f2, 1.0)); tot100 += fabs(dostep(f2, 0.0)); tot100 += fabs(dostep(f2, 0.0)); tot100 += fabs(dostep(f2, 0.0)); - + for (cnt= 1; cnt < 0x1000000; cnt++) { tot += fabs(dostep(f1, 0.0)); tot100 += fabs(dostep(f2, 0.0)); tot100 += fabs(dostep(f2, 0.0)); tot100 += fabs(dostep(f2, 0.0)); tot100 += fabs(dostep(f2, 0.0)); - + if (tot/tot100 >= 0.999) break; } fid_run_freebuf(f1); @@ -649,7 +649,7 @@ fid_calc_delay(FidFilter *filt) { tot50= tot100/2; f1= fid_run_newbuf(run); tot= fabs(dostep(f1, 1.0)); - for (cnt= 0; tot < tot50; cnt++) + for (cnt= 0; tot < tot50; cnt++) tot += fabs(dostep(f1, 0.0)); fid_run_freebuf(f1); @@ -657,7 +657,7 @@ fid_calc_delay(FidFilter *filt) { fid_run_free(run); return cnt; } - + // // 'mkfilter'-derived code @@ -679,7 +679,7 @@ stack_filter(int order, int n_head, int n_val, ...) { int a, b, len; if (order == 0) return rv; - + // Copy from ap va_start(ap, n_val); p= q= rv; @@ -687,7 +687,7 @@ stack_filter(int order, int n_head, int n_val, ...) { p->typ= va_arg(ap, int); p->cbm= va_arg(ap, int); p->len= va_arg(ap, int); - for (b= 0; blen; b++) + for (b= 0; blen; b++) p->val[b]= va_arg(ap, double); p= FFNEXT(p); } @@ -695,16 +695,16 @@ stack_filter(int order, int n_head, int n_val, ...) { // Check length len= ((char*)p)-((char*)q); - if (len != FFCSIZE(n_head-1, n_val)) + if (len != (int)FFCSIZE(n_head-1, n_val)) error("Internal error; bad call to stack_filter(); length mismatch (%d,%d)", len, FFCSIZE(n_head-1, n_val)); - + // Make as many additional copies as necessary while (order-- > 0) { memcpy(p, q, len); p= (FidFilter*)(len + (char*)p); } - + // List is already terminated due to zeroed allocation return rv; } @@ -714,17 +714,17 @@ stack_filter(int order, int n_head, int n_val, ...) { // assumed that the gradient goes upwards from 'f0' to the peak, // and then down again to 'f3'. If there are any other curves, // this routine will get confused and will come up with some -// frequency, although probably not the right one. +// frequency, although probably not the right one. // // Returns the frequency of the peak. // -static double +static double search_peak(FidFilter *ff, double f0, double f3) { double f1, f2; double r1, r2; int a; - + // Binary search, modified, taking two intermediate points. Do 20 // subdivisions, which should give 1/2^20 == 1e-6 accuracy compared // to original range. @@ -765,7 +765,7 @@ do_lowpass(int mz, double freq) { rv= z2fidfilter(1.0, ~0); // FIR is constant rv->val[0]= 1.0 / fid_response(rv, 0.0); return rv; -} +} static FidFilter* do_highpass(int mz, double freq) { @@ -795,19 +795,19 @@ do_bandstop(int mz, double f0, double f1) { rv= z2fidfilter(1.0, 5); // FIR second coefficient is *non-const* for bandstop rv->val[0]= 1.0 / fid_response(rv, 0.0); // Use 0Hz response as reference return rv; -} +} // // Information passed to individual filter design routines: // -// double* rout(double rate, double f0, double f1, +// double* rout(double rate, double f0, double f1, // int order, int n_arg, double *arg); // // 'rate' is the sampling rate, or 1 if not set -// 'f0' and 'f1' give the frequency or frequency range as a +// 'f0' and 'f1' give the frequency or frequency range as a // proportion of the sampling rate -// 'order' is the order of the filter (the integer passed immediately +// 'order' is the order of the filter (the integer passed immediately // after the name) // 'n_arg' is the number of additional arguments for the filter // 'arg' gives the additional argument values: arg[n] @@ -817,7 +817,7 @@ do_bandstop(int mz, double f0, double f1) { // // See the previous description for the required meaning of the // return value FidFilter list. -// +// // // Filter design routines and supporting code @@ -825,24 +825,41 @@ do_bandstop(int mz, double f0, double f1) { static FidFilter* des_bpre(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; bandpass_res(f0, arg[0]); return z2fidfilter(1.0, ~0); // FIR constant } static FidFilter* des_bsre(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; bandstop_res(f0, arg[0]); return z2fidfilter(1.0, 0); // FIR not constant, depends on freq } static FidFilter* des_apre(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; allpass_res(f0, arg[0]); return z2fidfilter(1.0, 0); // FIR not constant, depends on freq } static FidFilter* des_pi(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; + (void)arg; prop_integral(prewarp(f0)); s2z_bilinear(); return z2fidfilter(1.0, 0); // FIR not constant, depends on freq @@ -850,6 +867,11 @@ des_pi(double rate, double f0, double f1, int order, int n_arg, double *arg) { static FidFilter* des_piz(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; + (void)arg; prop_integral(prewarp(f0)); s2z_matchedZ(); return z2fidfilter(1.0, 0); // FIR not constant, depends on freq @@ -857,58 +879,89 @@ des_piz(double rate, double f0, double f1, int order, int n_arg, double *arg) { static FidFilter* des_lpbe(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)n_arg; + (void)arg; bessel(order); return do_lowpass(BL, f0); } static FidFilter* des_hpbe(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)n_arg; + (void)arg; bessel(order); return do_highpass(BL, f0); } static FidFilter* des_bpbe(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)n_arg; + (void)arg; bessel(order); return do_bandpass(BL, f0, f1); } static FidFilter* des_bsbe(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)n_arg; + (void)arg; bessel(order); return do_bandstop(BL, f0, f1); } static FidFilter* des_lpbez(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)n_arg; + (void)arg; bessel(order); return do_lowpass(MZ, f0); } static FidFilter* des_hpbez(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)n_arg; + (void)arg; bessel(order); return do_highpass(MZ, f0); } static FidFilter* des_bpbez(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)n_arg; + (void)arg; bessel(order); return do_bandpass(MZ, f0, f1); } static FidFilter* des_bsbez(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)n_arg; + (void)arg; bessel(order); return do_bandstop(MZ, f0, f1); } static FidFilter* // Butterworth-Bessel cross des_lpbube(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)n_arg; double tmp[MAXPZ]; int a; bessel(order); memcpy(tmp, pol, order * sizeof(double)); - butterworth(order); + butterworth(order); for (a= 0; alen= max*2+1; ff->val[max]= tot= 1.0; for (a= 1; a<=max; a++) { - double val= 0.42 + + double val= 0.42 + 0.5 * cos(M_PI * a / wid) + 0.08 * cos(M_PI * 2.0 * a / wid); ff->val[max-a]= val; @@ -1136,6 +1266,11 @@ des_lpbl(double rate, double f0, double f1, int order, int n_arg, double *arg) { static FidFilter* des_lphm(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; + (void)arg; double wid= 0.3262096/f0; double tot, adj; int max= (int)floor(wid); @@ -1146,7 +1281,7 @@ des_lphm(double rate, double f0, double f1, int order, int n_arg, double *arg) { ff->len= max*2+1; ff->val[max]= tot= 1.0; for (a= 1; a<=max; a++) { - double val= 0.54 + + double val= 0.54 + 0.46 * cos(M_PI * a / wid); ff->val[max-a]= val; ff->val[max+a]= val; @@ -1159,6 +1294,11 @@ des_lphm(double rate, double f0, double f1, int order, int n_arg, double *arg) { static FidFilter* des_lphn(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; + (void)arg; double wid= 0.360144/f0; double tot, adj; int max= (int)floor(wid); @@ -1169,7 +1309,7 @@ des_lphn(double rate, double f0, double f1, int order, int n_arg, double *arg) { ff->len= max*2+1; ff->val[max]= tot= 1.0; for (a= 1; a<=max; a++) { - double val= 0.5 + + double val= 0.5 + 0.5 * cos(M_PI * a / wid); ff->val[max-a]= val; ff->val[max+a]= val; @@ -1182,6 +1322,11 @@ des_lphn(double rate, double f0, double f1, int order, int n_arg, double *arg) { static FidFilter* des_lpba(double rate, double f0, double f1, int order, int n_arg, double *arg) { + (void)rate; + (void)f1; + (void)order; + (void)n_arg; + (void)arg; double wid= 0.3189435/f0; double tot, adj; int max= (int)floor(wid); @@ -1222,29 +1367,29 @@ static struct { "Proportional-integral filter, frequency #F" }, { des_piz, "PiZ/#F", "Proportional-integral filter, matched z-transform, frequency #F" }, - { des_lpbe, "LpBe#O/#F", + { des_lpbe, "LpBe#O/#F", "Lowpass Bessel filter, order #O, -3.01dB frequency #F" }, - { des_hpbe, "HpBe#O/#F", + { des_hpbe, "HpBe#O/#F", "Highpass Bessel filter, order #O, -3.01dB frequency #F" }, - { des_bpbe, "BpBe#O/#R", + { des_bpbe, "BpBe#O/#R", "Bandpass Bessel filter, order #O, -3.01dB frequencies #R" }, - { des_bsbe, "BsBe#O/#R", + { des_bsbe, "BsBe#O/#R", "Bandstop Bessel filter, order #O, -3.01dB frequencies #R" }, - { des_lpbu, "LpBu#O/#F", + { des_lpbu, "LpBu#O/#F", "Lowpass Butterworth filter, order #O, -3.01dB frequency #F" }, - { des_hpbu, "HpBu#O/#F", + { des_hpbu, "HpBu#O/#F", "Highpass Butterworth filter, order #O, -3.01dB frequency #F" }, - { des_bpbu, "BpBu#O/#R", + { des_bpbu, "BpBu#O/#R", "Bandpass Butterworth filter, order #O, -3.01dB frequencies #R" }, - { des_bsbu, "BsBu#O/#R", + { des_bsbu, "BsBu#O/#R", "Bandstop Butterworth filter, order #O, -3.01dB frequencies #R" }, { des_lpch, "LpCh#O/#V/#F", "Lowpass Chebyshev filter, order #O, passband ripple #VdB, -3.01dB frequency #F" }, - { des_hpch, "HpCh#O/#V/#F", + { des_hpch, "HpCh#O/#V/#F", "Highpass Chebyshev filter, order #O, passband ripple #VdB, -3.01dB frequency #F" }, - { des_bpch, "BpCh#O/#V/#R", + { des_bpch, "BpCh#O/#V/#R", "Bandpass Chebyshev filter, order #O, passband ripple #VdB, -3.01dB frequencies #R" }, - { des_bsch, "BsCh#O/#V/#R", + { des_bsch, "BsCh#O/#V/#R", "Bandstop Chebyshev filter, order #O, passband ripple #VdB, -3.01dB frequencies #R" }, { des_lpbez, "LpBeZ#O/#F", "Lowpass Bessel filter, matched z-transform, order #O, -3.01dB frequency #F" }, @@ -1333,12 +1478,12 @@ static struct { // typedef struct Spec Spec; -static char* parse_spec(Spec*); +static char* parse_spec(Spec*); static FidFilter *auto_adjust_single(Spec *sp, double rate, double f0); static FidFilter *auto_adjust_dual(Spec *sp, double rate, double f0, double f1); struct Spec { #define MAXARG 10 - char *spec; + const char *spec; double in_f0, in_f1; int in_adj; double argarr[MAXARG]; @@ -1382,9 +1527,9 @@ fid_design(const char *spec, double rate, double freq0, double freq1, int f_adj, rv= filter[sp.fi].rout(rate, f0, f1, sp.order, sp.n_arg, sp.argarr); else if (strstr(filter[sp.fi].fmt, "#R")) rv= auto_adjust_dual(&sp, rate, f0, f1); - else + else rv= auto_adjust_single(&sp, rate, f0); - + // Generate a long description if required if (descp) { char *fmt= filter[sp.fi].txt; @@ -1394,13 +1539,13 @@ fid_design(const char *spec, double rate, double freq0, double freq1, int f_adj, char ch; double *arg= sp.argarr; int n_arg= sp.n_arg; - + while ((ch= *fmt++)) { if (ch != '#') { *p++= ch; continue; } - + switch (*fmt++) { case 'O': p += sprintf(p, "%d", sp.order); @@ -1412,7 +1557,7 @@ fid_design(const char *spec, double rate, double freq0, double freq1, int f_adj, p += sprintf(p, "%g-%g", f0*rate, f1*rate); break; case 'V': - if (n_arg <= 0) + if (n_arg <= 0) error("Internal error -- disagreement between filter short-spec\n" " and long-description over number of arguments"); n_arg--; @@ -1462,11 +1607,11 @@ auto_adjust_single(Spec *sp, double rate, double f0) { } incr= r2 > r0; - if (a0 > a2) { + if (a0 > a2) { a1= a0; a0= a2; a2= a1; incr= !incr; } - + // Binary search while (1) { a1= 0.5 * (a0 + a2); @@ -1475,7 +1620,7 @@ auto_adjust_single(Spec *sp, double rate, double f0) { if (resp >= 0.9999995 * M301DB && resp < 1.0000005 * M301DB) break; if (incr == (resp > M301DB)) a2= a1; - else + else a0= a1; } @@ -1519,7 +1664,7 @@ auto_adjust_dual(Spec *sp, double rate, double f0, double f1) { DESIGN(mid, wid); bpass= (fid_response(rv, 0) < 0.5); delta= wid * 0.5; - + // Try delta changes until we get there for (cnt= 0; 1; cnt++, delta *= 0.51) { DESIGN(mid, wid); // I know -- this is redundant @@ -1529,13 +1674,13 @@ auto_adjust_dual(Spec *sp, double rate, double f0, double f1) { wid0= wid; mid1= mid + (INC_MID ? delta : -delta); wid1= wid + (INC_WID ? delta : -delta); - + if (mid0 - wid1 > 0.0 && mid0 + wid1 < 0.5) { DESIGN(mid0, wid1); if (MATCH) break; if (PERR < perr) { perr= PERR; mid= mid0; wid= wid1; } } - + if (mid1 - wid0 > 0.0 && mid1 + wid0 < 0.5) { DESIGN(mid1, wid0); if (MATCH) break; @@ -1567,13 +1712,13 @@ auto_adjust_dual(Spec *sp, double rate, double f0, double f1) { // space, drops dead // -static void +static void expand_spec(char *buf, char *bufend, char *str) { int ch; char *p= buf; while ((ch= *str++)) { - if (p + 10 >= bufend) + if (p + 10 >= bufend) error("Buffer overflow in fidlib expand_spec()"); if (ch == '#') { switch (*str++) { @@ -1610,8 +1755,8 @@ expand_spec(char *buf, char *bufend, char *str) { // 'n_coef' argument provides a partial safeguard. // -double -fid_design_coef(double *coef, int n_coef, const char *spec, double rate, +double +fid_design_coef(double *coef, int n_coef, const char *spec, double rate, double freq0, double freq1, int adj) { FidFilter *filt= fid_design(spec, rate, freq0, freq1, adj, 0); FidFilter *ff= filt; @@ -1660,13 +1805,13 @@ fid_design_coef(double *coef, int n_coef, const char *spec, double rate, len= n_fir > n_iir ? n_fir : n_iir; for (a= len-1; a>=0; a--) { // Output IIR if present and non-const - if (a < n_iir && a>0 && + if (a < n_iir && a>0 && !(iir_cbm & (1<<(a<15?a:15)))) { if (cnt++ < n_coef) *coef++= iir_adj * iir[a]; } // Output FIR if present and non-const - if (a < n_fir && + if (a < n_fir && !(fir_cbm & (1<<(a<15?a:15)))) { if (cnt++ < n_coef) *coef++= fir[a]; } @@ -1677,16 +1822,16 @@ fid_design_coef(double *coef, int n_coef, const char *spec, double rate, error("fid_design_coef called with the wrong number of coefficients.\n" " Given %d, expecting %d: (\"%s\",%g,%g,%g,%d)", n_coef, cnt, spec, rate, freq0, freq1, adj); - + free(filt); return gain; } - + // // List all the known filters to the given file handle // -void +void fid_list_filters(FILE *out) { int a; @@ -1704,7 +1849,7 @@ fid_list_filters(FILE *out) { // NUL-terminated; returns 1 okay, 0 not enough space // -int +int fid_list_filters_buf(char *buf, char *bufend) { int a, cnt; char tmp[4096]; @@ -1764,11 +1909,11 @@ fid_flatten(FidFilter *filt) { m_iir += ff->len-1; else if (ff->typ == 'F') m_fir += ff->len-1; - else + else error("fid_flatten doesn't know about type %d", ff->typ); ff= FFNEXT(ff); } - + // Setup the output array rv= FFALLOC(2, m_iir + m_fir); rv->typ= 'I'; @@ -1785,16 +1930,16 @@ fid_flatten(FidFilter *filt) { // Do the convolution ff= filt; while (ff->len) { - if (ff->typ == 'I') + if (ff->typ == 'I') n_iir= convolve(iir, n_iir, ff->val, ff->len); - else + else n_fir= convolve(fir, n_fir, ff->val, ff->len); ff= FFNEXT(ff); } // Sanity check if (n_iir != m_iir || - n_fir != m_fir) + n_fir != m_fir) error("Internal error in fid_combine() -- array under/overflow"); // Fix iir[0] @@ -1819,14 +1964,14 @@ parse_spec(Spec *sp) { sp->n_arg= 0; sp->order= 0; sp->f0= 0; - sp->f1= 0; + sp->f1= 0; sp->adj= 0; sp->minlen= -1; sp->n_freq= 0; - + for (a= 0; 1; a++) { char *fmt= filter[a].fmt; - char *p= sp->spec; + const char *p= sp->spec; char ch, *q; if (!fmt) return strdupf("Spec-string \"%s\" matches no known format", sp->spec); @@ -1842,7 +1987,7 @@ parse_spec(Spec *sp) { // Handling a format character switch (ch= *fmt++) { default: - return strdupf("Internal error: Unknown format #%c in format: %s", + return strdupf("Internal error: Unknown format #%c in format: %s", fmt[-1], filter[a].fmt); case 'o': case 'O': @@ -1851,13 +1996,13 @@ parse_spec(Spec *sp) { if (ch == 'O') goto bad; sp->order= 1; } - if (sp->order <= 0) + if (sp->order <= 0) return strdupf("Bad order %d in spec-string \"%s\"", sp->order, sp->spec); p= q; break; case 'V': - sp->n_arg++; + sp->n_arg++; *arg++= strtod(p, &q); - if (p == q) goto bad; + if (p == q) goto bad; p= q; break; case 'F': sp->minlen= p-1-sp->spec; @@ -1866,7 +2011,7 @@ parse_spec(Spec *sp) { if (sp->adj) p++; sp->f0= strtod(p, &q); sp->f1= 0; - if (p == q) goto bad; + if (p == q) goto bad; p= q; break; case 'R': sp->minlen= p-1-sp->spec; @@ -1874,12 +2019,12 @@ parse_spec(Spec *sp) { sp->adj= (p[0] == '='); if (sp->adj) p++; sp->f0= strtod(p, &q); - if (p == q) goto bad; + if (p == q) goto bad; p= q; if (*p++ != '-') goto bad; sp->f1= strtod(p, &q); - if (p == q) goto bad; - if (sp->f0 > sp->f1) + if (p == q) goto bad; + if (sp->f0 > sp->f1) return strdupf("Backwards frequency range in spec-string \"%s\"", sp->spec); p= q; break; } @@ -1890,7 +2035,7 @@ parse_spec(Spec *sp) { if (fmt[0] == '/' && fmt[1] == '#' && fmt[2] == 'F') { sp->minlen= p-sp->spec; sp->n_freq= 1; - if (sp->in_f0 < 0.0) + if (sp->in_f0 < 0.0) return strdupf("Frequency omitted from filter-spec, and no default provided"); sp->f0= sp->in_f0; sp->f1= 0; @@ -1910,22 +2055,22 @@ parse_spec(Spec *sp) { // Check for trailing unmatched format characters if (*fmt) { bad: - return strdupf("Bad match of spec-string \"%s\" to format \"%s\"", + return strdupf("Bad match of spec-string \"%s\" to format \"%s\"", sp->spec, filter[a].fmt); } - if (sp->n_arg > MAXARG) + if (sp->n_arg > MAXARG) return strdupf("Internal error -- maximum arguments exceeded"); - + // Set the minlen to the whole string if unset if (sp->minlen < 0) sp->minlen= p-sp->spec; - + // Save values, return sp->fi= a; return 0; } return 0; } - + // // Parse a filter-spec and freq0/freq1 arguments and rewrite them @@ -1937,9 +2082,9 @@ parse_spec(Spec *sp) { // spec-string is not generated. // -void +void fid_rewrite_spec(const char *spec, double freq0, double freq1, int adj, - char **spec1p, + char **spec1p, char **spec2p, double *freq0p, double *freq1p, int *adjp) { Spec sp; char *err; @@ -1985,11 +2130,11 @@ fid_rewrite_spec(const char *spec, double freq0, double freq1, int adj, // // This is really just a convenience function, allowing a filter // to be conveniently dumped to C source code and then -// reconstructed. +// reconstructed. // // Note that for more general filter generation, FidFilter // instances can be created simply by allocating the memory and -// filling them in (see fidlib.h). +// filling them in (see fidlib.h). // FidFilter * @@ -2004,7 +2149,7 @@ fid_cv_array(double *arr) { int len, typ; typ= (int)(*dp++); - if (typ != 'F' && typ != 'I') + if (typ != 'F' && typ != 'I') error("Bad type in array passed to fid_cv_array: %g", dp[-1]); len= (int)(*dp++); @@ -2043,7 +2188,7 @@ fid_cv_array(double *arr) { // free'd once read; otherwise they are left untouched. The // newly allocated resultant filter is returned, which should be // released with free() when finished with. -// +// FidFilter * fid_cat(int freeme, ...) { @@ -2085,7 +2230,7 @@ fid_cat(int freeme, ...) { // // Skip white space (including comments) -static void +static void skipWS(char **pp) { char *p= *pp; @@ -2103,11 +2248,11 @@ skipWS(char **pp) { // Grab a word from the input into the given buffer. Returns 0: end // of file or error, else 1: success. Error is indicated when the // word doesn't fit in the buffer. -static int +static int grabWord(char **pp, char *buf, int buflen) { char *p, *q; - int len; - + int len; + skipWS(pp); p= *pp; if (!*p) return 0; @@ -2116,16 +2261,16 @@ grabWord(char **pp, char *buf, int buflen) { if (*q == ',' || *q == ';' || *q == ')' || *q == ']' || *q == '}') { q++; } else { - while (*q && *q != '#' && !isspace(*q) && + while (*q && *q != '#' && !isspace(*q) && (*q != ',' && *q != ';' && *q != ')' && *q != ']' && *q != '}')) q++; } len= q-p; if (len >= buflen) return 0; - + memcpy(buf, p, len); buf[len]= 0; - + *pp= q; return 1; } @@ -2163,7 +2308,7 @@ fid_parse(double rate, char **pp, FidFilter **ffp) { #define INCBUF { tmp= (char*)realloc(rv, (rvend-rv) * 2); if (!tmp) error("Out of memory"); \ rvend= (rvend-rv) * 2 + tmp; rvp= (rvp-rv) + tmp; \ curr= (FidFilter*)(((char*)curr) - rv + tmp); rv= tmp; } - + while (1) { rew= p; if (!grabWord(&p, buf, sizeof(buf))) { @@ -2218,7 +2363,7 @@ fid_parse(double rate, char **pp, FidFilter **ffp) { if ((err= parse_spec(&sp))) ERR(rew, err); f0= sp.f0; f1= sp.f1; - + // Adjust frequencies to range 0-0.5, and check them f0 /= rate; if (f0 > 0.5) ERR(rew, strdupf("Frequency of %gHz out of range with " @@ -2226,16 +2371,16 @@ fid_parse(double rate, char **pp, FidFilter **ffp) { f1 /= rate; if (f1 > 0.5) ERR(rew, strdupf("Frequency of %gHz out of range with " "sampling rate of %gHz", f1*rate, rate)); - + // Okay we now have a successful spec-match to filter[sp.fi], and sp.n_arg // args are now in sp.argarr[] - + // Generate the filter if (!sp.adj) ff= filter[sp.fi].rout(rate, f0, f1, sp.order, sp.n_arg, sp.argarr); else if (strstr(filter[sp.fi].fmt, "#R")) ff= auto_adjust_dual(&sp, rate, f0, f1); - else + else ff= auto_adjust_single(&sp, rate, f0); // Append it to our FidFilter to return diff --git a/lib/fidlib-0.9.10/fidlib.h b/lib/fidlib-0.9.10/fidlib.h index 48950e4dba81..e84130f1e75c 100644 --- a/lib/fidlib-0.9.10/fidlib.h +++ b/lib/fidlib-0.9.10/fidlib.h @@ -36,7 +36,7 @@ typedef double (FidFunc)(void*, double); // // Prototypes // -#ifdef MIXXX +#ifdef __cplusplus extern "C" { #endif @@ -71,7 +71,7 @@ extern void fid_run_zapbuf(void *buf); extern void fid_run_freebuf(void *runbuf); extern void fid_run_free(void *run); -#ifdef MIXXX +#ifdef __cplusplus } #endif #endif diff --git a/lib/fidlib-0.9.10/fidrf_cmdlist.h b/lib/fidlib-0.9.10/fidrf_cmdlist.h index 7df1171c5694..f45ee296e84c 100644 --- a/lib/fidlib-0.9.10/fidrf_cmdlist.h +++ b/lib/fidlib-0.9.10/fidrf_cmdlist.h @@ -28,7 +28,7 @@ typedef struct RunBuf { double *coef; char *cmd; int mov_cnt; // Number of bytes to memmove - double buf[0]; + double buf[1]; // is resized in fid_run_newbuf() } RunBuf; @@ -76,9 +76,9 @@ typedef unsigned char uchar; static double filter_step(void *fbuf, double iir) { double *coef= ((RunBuf*)fbuf)->coef; - uchar *cmd= ((RunBuf*)fbuf)->cmd; + char *cmd= ((RunBuf*)fbuf)->cmd; double *buf= &((RunBuf*)fbuf)->buf[0]; - uchar ch; + char ch; double fir= 0; double tmp= buf[0]; int cnt; @@ -393,11 +393,11 @@ fid_run_newbuf(void *run) { if (rr->magic != 0x64966325) error("Bad handle passed to fid_run_newbuf()"); - siz= rr->buf_size ? rr->buf_size : 1; // Minimum one element to avoid problems + siz= rr->buf_size > 0 ? rr->buf_size - 1 : 0; // Fist element is part of sizeof(RunBuf) rb= (RunBuf*)Alloc(sizeof(RunBuf) + siz * sizeof(double)); rb->coef= rr->coef; rb->cmd= rr->cmd; - rb->mov_cnt= (siz-1) * sizeof(double); + rb->mov_cnt= siz * sizeof(double); // rb->buf[] already zerod return rb; diff --git a/lib/gmock-1.7.0/include/gmock/gmock-spec-builders.h b/lib/gmock-1.7.0/include/gmock/gmock-spec-builders.h index 312fbe87050b..bf08a715de97 100644 --- a/lib/gmock-1.7.0/include/gmock/gmock-spec-builders.h +++ b/lib/gmock-1.7.0/include/gmock/gmock-spec-builders.h @@ -1381,7 +1381,7 @@ class ActionResultHolder : public UntypedActionResultHolderBase { const typename Function::ArgumentTuple& args, const string& call_description) { func_mocker->PerformDefaultAction(args, call_description); - return NULL; + return new ActionResultHolder(); } // Performs the given action and returns NULL. @@ -1390,7 +1390,7 @@ class ActionResultHolder : public UntypedActionResultHolderBase { const Action& action, const typename Function::ArgumentTuple& args) { action.Perform(args); - return NULL; + return new ActionResultHolder(); } }; diff --git a/lib/hidapi-0.8.0-rc1/windows/hid.c b/lib/hidapi-0.8.0-rc1/windows/hid.c index 3dee05bf7fcd..6b02447e77ea 100755 --- a/lib/hidapi-0.8.0-rc1/windows/hid.c +++ b/lib/hidapi-0.8.0-rc1/windows/hid.c @@ -219,9 +219,7 @@ static HANDLE open_device(const char *path, BOOL enumerate) { HANDLE handle; DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); - DWORD share_mode = (enumerate)? - FILE_SHARE_READ|FILE_SHARE_WRITE: - FILE_SHARE_READ; + DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; handle = CreateFileA(path, desired_access, diff --git a/lib/libebur128-1.1.0/.gitignore b/lib/libebur128-1.1.0/.gitignore new file mode 100644 index 000000000000..567609b1234a --- /dev/null +++ b/lib/libebur128-1.1.0/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/lib/libebur128-1.1.0/CMakeLists.txt b/lib/libebur128-1.1.0/CMakeLists.txt new file mode 100644 index 000000000000..e2816f299be1 --- /dev/null +++ b/lib/libebur128-1.1.0/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) +project(libebur128 C) + +set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) +set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}) + +include(utils) +include(GNUInstallDirs) + +add_subdirectory(ebur128) +add_subdirectory(test) + +to_yes_no(SUMMARY_HAS_QUEUE SUMMARY_SPEEXDSP_FOUND) +to_yes_no(DISABLE_SPEEXDSP) + +if(ENABLE_INTERNAL_QUEUE_H) + set(USE_QUEUE "using own copy of queue.h") +else() + set(USE_QUEUE "using system copy of queue.h") +endif() + +##### Print status +message(STATUS "Status found / disabled --") +message(STATUS "queue.h: ${SUMMARY_HAS_QUEUE}" " ${USE_QUEUE}") +message(STATUS "speexdsp: ${SUMMARY_SPEEXDSP_FOUND}" " ${DISABLE_SPEEXDSP}") + +if(BUILD_STATIC_LIBS) + message(STATUS "build static library and shared library!") +else() + message(STATUS "not building static library, set BUILD_STATIC_LIBS to ON to enable") +endif() + +if(NOT SUMMARY_HAS_QUEUE AND NOT ENABLE_INTERNAL_QUEUE_H) + message(FATAL_ERROR "queue.h not found, please set ENABLE_INTERNAL_QUEUE_H to ON") +endif() + +if(ENABLE_TESTS) + message(STATUS "building tests!") +else() + message(STATUS "not building tests, set ENABLE_TESTS to ON to enable") +endif() diff --git a/lib/libebur128-1.1.0/COPYING b/lib/libebur128-1.1.0/COPYING new file mode 100644 index 000000000000..e3cebca683fc --- /dev/null +++ b/lib/libebur128-1.1.0/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2011 Jan Kokemüller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/libebur128-1.1.0/README.md b/lib/libebur128-1.1.0/README.md new file mode 100644 index 000000000000..7dfd6aa883dc --- /dev/null +++ b/lib/libebur128-1.1.0/README.md @@ -0,0 +1,64 @@ +libebur128 +========== + +libebur128 is a library that implements the EBU R 128 standard for loudness +normalisation. + +All source code is licensed under the MIT license. See COPYING file for +details. + +See also [loudness-scanner tool](https://github.com/jiixyj/loudness-scanner). + +News +---- + +v1.1.0 released: + + * Add `ebur128_relative_threshold()` + * Add channel definitions from ITU R-REC-BS 1770-4 to channel enum + * Fix some minor build issues + +v1.0.3 released: + + * Fix build with recent speexdsp + * Correct license file name + * CMake option to disable static library + * minimal-example.c: do not hard code program name in usage + +Features +-------- + +* Portable ANSI C code +* Implements M, S and I modes +* Implements loudness range measurement (EBU - TECH 3342) +* True peak scanning +* Supports all samplerates by recalculation of the filter coefficients + +Requirements +------------ + +* [libspeexdsp](http://www.speex.org/) - Needed for `ebur128_true_peak`. + +Installation +------------ + +In the root folder, type: + + mkdir build + cd build + cmake .. + make + +If you want the git version, run simply: + + git clone git://github.com/jiixyj/libebur128.git + +Usage +----- + +Library usage should be pretty straightforward. All exported symbols are +documented in the ebur128.h header file. For a usage example, see +minimal-example.c in the tests folder. + +On some operating systems, static libraries should be compiled as position +independent code. You can enable that by turning on `WITH_STATIC_PIC`. diff --git a/lib/libebur128-1.1.0/cmake/utils.cmake b/lib/libebur128-1.1.0/cmake/utils.cmake new file mode 100644 index 000000000000..b27c57bd5141 --- /dev/null +++ b/lib/libebur128-1.1.0/cmake/utils.cmake @@ -0,0 +1,55 @@ +macro(to_yes_no vars) + foreach(var ${ARGV}) + if(${var}) + set(${var} "yes") + else() + set(${var} "no ") + endif() + endforeach() +endmacro() + +macro(if_empty_print_missing vars) + foreach(var ${ARGV}) + if(NOT ${var}) + set(${var} "") + endif() + endforeach() +endmacro() + +function(to_space_list sc_list) + set(ret) + foreach(val ${${sc_list}}) + set(ret "${ret} ${val}") + endforeach() + if(ret) + string(STRIP ${ret} ret) + set(${sc_list} "${ret}" PARENT_SCOPE) + endif() +endfunction() + +macro(find_pkg_config prefix pkgname) + find_package(PkgConfig ${ARGV2}) + if(PKG_CONFIG_FOUND) + pkg_check_modules(${prefix}_PKGCONF ${ARGV2} ${pkgname}) + if(${${prefix}_PKGCONF_FOUND}) + message(STATUS "${pkgname} library dirs: ${${prefix}_PKGCONF_LIBRARY_DIRS}") + message(STATUS "${pkgname} cflags: ${${prefix}_PKGCONF_CFLAGS_OTHER}") + message(STATUS "${pkgname} include dirs: ${${prefix}_PKGCONF_INCLUDE_DIRS}") + message(STATUS "${pkgname} libraries: ${${prefix}_PKGCONF_LIBRARIES}") + message(STATUS "${pkgname} ldflags: ${${prefix}_PKGCONF_LDFLAGS_OTHER}") + + set(${prefix}_FOUND ${${prefix}_PKGCONF_FOUND}) + set(${prefix}_CFLAGS ${${prefix}_PKGCONF_CFLAGS_OTHER}) + to_space_list(${prefix}_CFLAGS) + set(${prefix}_INCLUDE_DIRS ${${prefix}_PKGCONF_INCLUDE_DIRS}) + foreach(lib ${${prefix}_PKGCONF_LIBRARIES}) + string(TOUPPER ${lib} LIB) + find_library(${prefix}_${LIB}_LIBRARY ${lib} + HINTS ${${prefix}_PKGCONF_LIBRARY_DIRS}) + mark_as_advanced(${prefix}_${LIB}_LIBRARY) + list(APPEND ${prefix}_LIBRARIES ${${prefix}_${LIB}_LIBRARY}) + endforeach() + list(APPEND ${prefix}_LIBRARIES ${${prefix}_PKGCONF_LDFLAGS_OTHER}) + endif() + endif() +endmacro() diff --git a/lib/libebur128-1.1.0/doc/license/R128Scan.txt b/lib/libebur128-1.1.0/doc/license/R128Scan.txt new file mode 100644 index 000000000000..305b5e1d8516 --- /dev/null +++ b/lib/libebur128-1.1.0/doc/license/R128Scan.txt @@ -0,0 +1,23 @@ +EBU R128 Gain processor. + +Copyright (C) 2011 Chris Moeller + +Portions copyright (c) 2011 Jan Kokemüller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE." diff --git a/lib/libebur128-1.1.0/doc/license/queue.txt b/lib/libebur128-1.1.0/doc/license/queue.txt new file mode 100644 index 000000000000..87fb4d13bafa --- /dev/null +++ b/lib/libebur128-1.1.0/doc/license/queue.txt @@ -0,0 +1,26 @@ +Copyright (c) 1991, 1993 + The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR 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. diff --git a/lib/libebur128-1.1.0/ebur128/CMakeLists.txt b/lib/libebur128-1.1.0/ebur128/CMakeLists.txt new file mode 100644 index 000000000000..f84febc02524 --- /dev/null +++ b/lib/libebur128-1.1.0/ebur128/CMakeLists.txt @@ -0,0 +1,75 @@ +set(BUILD_STATIC_LIBS ON CACHE BOOL "Build static library") +set(WITH_STATIC_PIC OFF CACHE BOOL "Compile static library with -fPIC flag") +set(ENABLE_INTERNAL_QUEUE_H OFF CACHE BOOL "Use own queue.h") +set(DISABLE_SPEEXDSP OFF CACHE BOOL "Don't build with speexdsp") + +#### queue.h +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/queuetest.c +"#include \nLIST_HEAD(listhead, entry) head;\nint main() { return 0; }") +try_compile(HAS_QUEUE ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/queuetest.c) + +set(SUMMARY_HAS_QUEUE ${HAS_QUEUE} CACHE INTERNAL "") + +if(ENABLE_INTERNAL_QUEUE_H) + include_directories(SYSTEM queue) +endif() + + +if(MSVC) + add_definitions(-D_USE_MATH_DEFINES) +endif() + + +set(EBUR128_VERSION_MAJOR 1) +set(EBUR128_VERSION 1.1.0) + +#### static +if(BUILD_STATIC_LIBS) + add_library(ebur128_static STATIC ebur128.c) + set_property(TARGET ebur128_static PROPERTY OUTPUT_NAME ebur128) +endif() + +if(WITH_STATIC_PIC) + set_property(TARGET ebur128_static PROPERTY POSITION_INDEPENDENT_CODE ON) +endif() + +#### shared +add_library(ebur128 SHARED ebur128.c) +set_target_properties(ebur128 PROPERTIES + SOVERSION ${EBUR128_VERSION_MAJOR} + VERSION ${EBUR128_VERSION}) + +#### speexdsp +if(NOT DISABLE_SPEEXDSP) + find_pkg_config(SPEEXDSP speexdsp) + if(SPEEXDSP_FOUND) + target_include_directories(ebur128 PRIVATE + ${SPEEXDSP_INCLUDE_DIRS}) + target_compile_definitions(ebur128 PRIVATE + -DUSE_SPEEX_RESAMPLER + -DHAVE_STDINT_H) + endif() +endif() + +if(UNIX) + target_link_libraries(ebur128 m) +endif() + +if(SPEEXDSP_FOUND AND NOT DISABLE_SPEEXDSP) + if(BUILD_STATIC_LIBS) + target_compile_options(ebur128_static PRIVATE ${SPEEXDSP_CFLAGS}) + endif() + target_compile_options(ebur128 PRIVATE ${SPEEXDSP_CFLAGS}) + target_link_libraries(ebur128 ${SPEEXDSP_LIBRARIES}) +endif() + +set(SUMMARY_SPEEXDSP_FOUND ${SPEEXDSP_FOUND} CACHE INTERNAL "") +set(EBUR128_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "") + +install(FILES ebur128.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +if(BUILD_STATIC_LIBS) + install(TARGETS ebur128 ebur128_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) +else() + install(TARGETS ebur128 DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endif() diff --git a/lib/libebur128-1.1.0/ebur128/ebur128.c b/lib/libebur128-1.1.0/ebur128/ebur128.c new file mode 100644 index 000000000000..3b88662ae116 --- /dev/null +++ b/lib/libebur128-1.1.0/ebur128/ebur128.c @@ -0,0 +1,1036 @@ +/* See COPYING file for copyright and license details. */ + +#include "ebur128.h" + +#include +#include +#include /* You may have to define _USE_MATH_DEFINES if you use MSVC */ +#include +#include + +/* This can be replaced by any BSD-like queue implementation. */ +#include + +#ifdef USE_SPEEX_RESAMPLER + #include +#endif + +#define CHECK_ERROR(condition, errorcode, goto_point) \ + if ((condition)) { \ + errcode = (errorcode); \ + goto goto_point; \ + } + +SLIST_HEAD(ebur128_double_queue, ebur128_dq_entry); +struct ebur128_dq_entry { + double z; + SLIST_ENTRY(ebur128_dq_entry) entries; +}; + +struct ebur128_state_internal { + /** Filtered audio data (used as ring buffer). */ + double* audio_data; + /** Size of audio_data array. */ + size_t audio_data_frames; + /** Current index for audio_data. */ + size_t audio_data_index; + /** How many frames are needed for a gating block. Will correspond to 400ms + * of audio at initialization, and 100ms after the first block (75% overlap + * as specified in the 2011 revision of BS1770). */ + unsigned long needed_frames; + /** The channel map. Has as many elements as there are channels. */ + int* channel_map; + /** How many samples fit in 100ms (rounded). */ + unsigned long samples_in_100ms; + /** BS.1770 filter coefficients (nominator). */ + double b[5]; + /** BS.1770 filter coefficients (denominator). */ + double a[5]; + /** BS.1770 filter state. */ + double v[5][5]; + /** Linked list of block energies. */ + struct ebur128_double_queue block_list; + /** Linked list of 3s-block energies, used to calculate LRA. */ + struct ebur128_double_queue short_term_block_list; + int use_histogram; + unsigned long *block_energy_histogram; + unsigned long *short_term_block_energy_histogram; + /** Keeps track of when a new short term block is needed. */ + size_t short_term_frame_counter; + /** Maximum sample peak, one per channel */ + double* sample_peak; + /** Maximum true peak, one per channel */ + double* true_peak; +#ifdef USE_SPEEX_RESAMPLER + SpeexResamplerState* resampler; +#endif + size_t oversample_factor; + float* resampler_buffer_input; + size_t resampler_buffer_input_frames; + float* resampler_buffer_output; + size_t resampler_buffer_output_frames; +}; + +static double relative_gate = -10.0; + +/* Those will be calculated when initializing the library */ +static double relative_gate_factor; +static double minus_twenty_decibels; +static double histogram_energies[1000]; +static double histogram_energy_boundaries[1001]; + +static void ebur128_init_filter(ebur128_state* st) { + int i, j; + + double f0 = 1681.974450955533; + double G = 3.999843853973347; + double Q = 0.7071752369554196; + + double K = tan(M_PI * f0 / (double) st->samplerate); + double Vh = pow(10.0, G / 20.0); + double Vb = pow(Vh, 0.4996667741545416); + + double pb[3] = {0.0, 0.0, 0.0}; + double pa[3] = {1.0, 0.0, 0.0}; + double rb[3] = {1.0, -2.0, 1.0}; + double ra[3] = {1.0, 0.0, 0.0}; + + double a0 = 1.0 + K / Q + K * K ; + pb[0] = (Vh + Vb * K / Q + K * K) / a0; + pb[1] = 2.0 * (K * K - Vh) / a0; + pb[2] = (Vh - Vb * K / Q + K * K) / a0; + pa[1] = 2.0 * (K * K - 1.0) / a0; + pa[2] = (1.0 - K / Q + K * K) / a0; + + /* fprintf(stderr, "%.14f %.14f %.14f %.14f %.14f\n", + b1[0], b1[1], b1[2], a1[1], a1[2]); */ + + f0 = 38.13547087602444; + Q = 0.5003270373238773; + K = tan(M_PI * f0 / (double) st->samplerate); + + ra[1] = 2.0 * (K * K - 1.0) / (1.0 + K / Q + K * K); + ra[2] = (1.0 - K / Q + K * K) / (1.0 + K / Q + K * K); + + /* fprintf(stderr, "%.14f %.14f\n", a2[1], a2[2]); */ + + st->d->b[0] = pb[0] * rb[0]; + st->d->b[1] = pb[0] * rb[1] + pb[1] * rb[0]; + st->d->b[2] = pb[0] * rb[2] + pb[1] * rb[1] + pb[2] * rb[0]; + st->d->b[3] = pb[1] * rb[2] + pb[2] * rb[1]; + st->d->b[4] = pb[2] * rb[2]; + + st->d->a[0] = pa[0] * ra[0]; + st->d->a[1] = pa[0] * ra[1] + pa[1] * ra[0]; + st->d->a[2] = pa[0] * ra[2] + pa[1] * ra[1] + pa[2] * ra[0]; + st->d->a[3] = pa[1] * ra[2] + pa[2] * ra[1]; + st->d->a[4] = pa[2] * ra[2]; + + for (i = 0; i < 5; ++i) { + for (j = 0; j < 5; ++j) { + st->d->v[i][j] = 0.0; + } + } +} + +static int ebur128_init_channel_map(ebur128_state* st) { + size_t i; + st->d->channel_map = (int*) malloc(st->channels * sizeof(int)); + if (!st->d->channel_map) return EBUR128_ERROR_NOMEM; + if (st->channels == 4) { + st->d->channel_map[0] = EBUR128_LEFT; + st->d->channel_map[1] = EBUR128_RIGHT; + st->d->channel_map[2] = EBUR128_LEFT_SURROUND; + st->d->channel_map[3] = EBUR128_RIGHT_SURROUND; + } else if (st->channels == 5) { + st->d->channel_map[0] = EBUR128_LEFT; + st->d->channel_map[1] = EBUR128_RIGHT; + st->d->channel_map[2] = EBUR128_CENTER; + st->d->channel_map[3] = EBUR128_LEFT_SURROUND; + st->d->channel_map[4] = EBUR128_RIGHT_SURROUND; + } else { + for (i = 0; i < st->channels; ++i) { + switch (i) { + case 0: st->d->channel_map[i] = EBUR128_LEFT; break; + case 1: st->d->channel_map[i] = EBUR128_RIGHT; break; + case 2: st->d->channel_map[i] = EBUR128_CENTER; break; + case 3: st->d->channel_map[i] = EBUR128_UNUSED; break; + case 4: st->d->channel_map[i] = EBUR128_LEFT_SURROUND; break; + case 5: st->d->channel_map[i] = EBUR128_RIGHT_SURROUND; break; + default: st->d->channel_map[i] = EBUR128_UNUSED; break; + } + } + } + return EBUR128_SUCCESS; +} + +#ifdef USE_SPEEX_RESAMPLER +static int ebur128_init_resampler(ebur128_state* st) { + int errcode = EBUR128_SUCCESS; + + if (st->samplerate < 96000) { + st->d->oversample_factor = 4; + } else if (st->samplerate < 192000) { + st->d->oversample_factor = 2; + } else { + st->d->oversample_factor = 1; + st->d->resampler_buffer_input = NULL; + st->d->resampler_buffer_output = NULL; + st->d->resampler = NULL; + } + + st->d->resampler_buffer_input_frames = st->d->samples_in_100ms * 4; + st->d->resampler_buffer_input = malloc(st->d->resampler_buffer_input_frames * + st->channels * + sizeof(float)); + CHECK_ERROR(!st->d->resampler_buffer_input, EBUR128_ERROR_NOMEM, exit) + + st->d->resampler_buffer_output_frames = + st->d->resampler_buffer_input_frames * + st->d->oversample_factor; + st->d->resampler_buffer_output = malloc + (st->d->resampler_buffer_output_frames * + st->channels * + sizeof(float)); + CHECK_ERROR(!st->d->resampler_buffer_output, EBUR128_ERROR_NOMEM, free_input) + + st->d->resampler = speex_resampler_init + ((spx_uint32_t) st->channels, + (spx_uint32_t) st->samplerate, + (spx_uint32_t) (st->samplerate * st->d->oversample_factor), + 8, NULL); + CHECK_ERROR(!st->d->resampler, EBUR128_ERROR_NOMEM, free_output) + + return errcode; + +free_output: + free(st->d->resampler_buffer_output); + st->d->resampler_buffer_output = NULL; +free_input: + free(st->d->resampler_buffer_input); + st->d->resampler_buffer_input = NULL; +exit: + return errcode; +} + +static void ebur128_destroy_resampler(ebur128_state* st) { + free(st->d->resampler_buffer_input); + st->d->resampler_buffer_input = NULL; + free(st->d->resampler_buffer_output); + st->d->resampler_buffer_output = NULL; + speex_resampler_destroy(st->d->resampler); + st->d->resampler = NULL; +} +#endif + +void ebur128_get_version(int* major, int* minor, int* patch) { + *major = EBUR128_VERSION_MAJOR; + *minor = EBUR128_VERSION_MINOR; + *patch = EBUR128_VERSION_PATCH; +} + +ebur128_state* ebur128_init(unsigned int channels, + unsigned long samplerate, + int mode) { + int errcode, result; + ebur128_state* st; + unsigned int i; + + st = (ebur128_state*) malloc(sizeof(ebur128_state)); + CHECK_ERROR(!st, 0, exit) + st->d = (struct ebur128_state_internal*) + malloc(sizeof(struct ebur128_state_internal)); + CHECK_ERROR(!st->d, 0, free_state) + st->channels = channels; + errcode = ebur128_init_channel_map(st); + CHECK_ERROR(errcode, 0, free_internal) + + st->d->sample_peak = (double*) malloc(channels * sizeof(double)); + CHECK_ERROR(!st->d->sample_peak, 0, free_channel_map) + st->d->true_peak = (double*) malloc(channels * sizeof(double)); + CHECK_ERROR(!st->d->true_peak, 0, free_sample_peak) + for (i = 0; i < channels; ++i) { + st->d->sample_peak[i] = 0.0; + st->d->true_peak[i] = 0.0; + } + + st->d->use_histogram = mode & EBUR128_MODE_HISTOGRAM ? 1 : 0; + + st->samplerate = samplerate; + st->d->samples_in_100ms = (st->samplerate + 5) / 10; + st->mode = mode; + if ((mode & EBUR128_MODE_S) == EBUR128_MODE_S) { + st->d->audio_data_frames = st->d->samples_in_100ms * 30; + } else if ((mode & EBUR128_MODE_M) == EBUR128_MODE_M) { + st->d->audio_data_frames = st->d->samples_in_100ms * 4; + } else { + goto free_true_peak; + } + st->d->audio_data = (double*) malloc(st->d->audio_data_frames * + st->channels * + sizeof(double)); + CHECK_ERROR(!st->d->audio_data, 0, free_true_peak) + ebur128_init_filter(st); + + if (st->d->use_histogram) { + st->d->block_energy_histogram = malloc(1000 * sizeof(unsigned long)); + CHECK_ERROR(!st->d->block_energy_histogram, 0, free_audio_data) + for (i = 0; i < 1000; ++i) { + st->d->block_energy_histogram[i] = 0; + } + } else { + st->d->block_energy_histogram = NULL; + } + if (st->d->use_histogram) { + st->d->short_term_block_energy_histogram = malloc(1000 * sizeof(unsigned long)); + CHECK_ERROR(!st->d->short_term_block_energy_histogram, 0, free_block_energy_histogram) + for (i = 0; i < 1000; ++i) { + st->d->short_term_block_energy_histogram[i] = 0; + } + } else { + st->d->short_term_block_energy_histogram = NULL; + } + SLIST_INIT(&st->d->block_list); + SLIST_INIT(&st->d->short_term_block_list); + st->d->short_term_frame_counter = 0; + +#ifdef USE_SPEEX_RESAMPLER + result = ebur128_init_resampler(st); + CHECK_ERROR(result, 0, free_short_term_block_energy_histogram) +#endif + + /* the first block needs 400ms of audio data */ + st->d->needed_frames = st->d->samples_in_100ms * 4; + /* start at the beginning of the buffer */ + st->d->audio_data_index = 0; + + /* initialize static constants */ + relative_gate_factor = pow(10.0, relative_gate / 10.0); + minus_twenty_decibels = pow(10.0, -20.0 / 10.0); + histogram_energy_boundaries[0] = pow(10.0, (-70.0 + 0.691) / 10.0); + if (st->d->use_histogram) { + for (i = 0; i < 1000; ++i) { + histogram_energies[i] = pow(10.0, ((double) i / 10.0 - 69.95 + 0.691) / 10.0); + } + for (i = 1; i < 1001; ++i) { + histogram_energy_boundaries[i] = pow(10.0, ((double) i / 10.0 - 70.0 + 0.691) / 10.0); + } + } + + return st; + +free_short_term_block_energy_histogram: + free(st->d->short_term_block_energy_histogram); +free_block_energy_histogram: + free(st->d->block_energy_histogram); +free_audio_data: + free(st->d->audio_data); +free_true_peak: + free(st->d->true_peak); +free_sample_peak: + free(st->d->sample_peak); +free_channel_map: + free(st->d->channel_map); +free_internal: + free(st->d); +free_state: + free(st); +exit: + return NULL; +} + +void ebur128_destroy(ebur128_state** st) { + struct ebur128_dq_entry* entry; + free((*st)->d->block_energy_histogram); + free((*st)->d->short_term_block_energy_histogram); + free((*st)->d->audio_data); + free((*st)->d->channel_map); + free((*st)->d->sample_peak); + free((*st)->d->true_peak); + while (!SLIST_EMPTY(&(*st)->d->block_list)) { + entry = SLIST_FIRST(&(*st)->d->block_list); + SLIST_REMOVE_HEAD(&(*st)->d->block_list, entries); + free(entry); + } + while (!SLIST_EMPTY(&(*st)->d->short_term_block_list)) { + entry = SLIST_FIRST(&(*st)->d->short_term_block_list); + SLIST_REMOVE_HEAD(&(*st)->d->short_term_block_list, entries); + free(entry); + } +#ifdef USE_SPEEX_RESAMPLER + ebur128_destroy_resampler(*st); +#endif + + free((*st)->d); + free(*st); + *st = NULL; +} + +static int ebur128_use_speex_resampler(ebur128_state* st) { +#ifdef USE_SPEEX_RESAMPLER + return ((st->mode & EBUR128_MODE_TRUE_PEAK) == EBUR128_MODE_TRUE_PEAK); +#else + (void) st; + return 0; +#endif +} + +static void ebur128_check_true_peak(ebur128_state* st, size_t frames) { +#ifdef USE_SPEEX_RESAMPLER + size_t c, i; + spx_uint32_t in_len = (spx_uint32_t) frames; + spx_uint32_t out_len = (spx_uint32_t) st->d->resampler_buffer_output_frames; + speex_resampler_process_interleaved_float( + st->d->resampler, + st->d->resampler_buffer_input, &in_len, + st->d->resampler_buffer_output, &out_len); + for (c = 0; c < st->channels; ++c) { + for (i = 0; i < out_len; ++i) { + if (st->d->resampler_buffer_output[i * st->channels + c] > + st->d->true_peak[c]) { + st->d->true_peak[c] = + st->d->resampler_buffer_output[i * st->channels + c]; + } else if (-st->d->resampler_buffer_output[i * st->channels + c] > + st->d->true_peak[c]) { + st->d->true_peak[c] = + -st->d->resampler_buffer_output[i * st->channels + c]; + } + } + } +#else + (void) st; (void) frames; +#endif +} + +#ifdef __SSE2_MATH__ +#include +#define TURN_ON_FTZ \ + unsigned int mxcsr = _mm_getcsr(); \ + _mm_setcsr(mxcsr | _MM_FLUSH_ZERO_ON); +#define TURN_OFF_FTZ _mm_setcsr(mxcsr); +#define FLUSH_MANUALLY +#else +#pragma message ( "warning: manual FTZ is being used, please enable SSE2 (-msse2 -mfpmath=sse)" ) +#define TURN_ON_FTZ +#define TURN_OFF_FTZ +#define FLUSH_MANUALLY \ + st->d->v[ci][4] = fabs(st->d->v[ci][4]) < DBL_MIN ? 0.0 : st->d->v[ci][4]; \ + st->d->v[ci][3] = fabs(st->d->v[ci][3]) < DBL_MIN ? 0.0 : st->d->v[ci][3]; \ + st->d->v[ci][2] = fabs(st->d->v[ci][2]) < DBL_MIN ? 0.0 : st->d->v[ci][2]; \ + st->d->v[ci][1] = fabs(st->d->v[ci][1]) < DBL_MIN ? 0.0 : st->d->v[ci][1]; +#endif + +#define EBUR128_FILTER(type, min_scale, max_scale) \ +static void ebur128_filter_##type(ebur128_state* st, const type* src, \ + size_t frames) { \ + static double scaling_factor = -((double) min_scale) > (double) max_scale ? \ + -((double) min_scale) : (double) max_scale; \ + double* audio_data = st->d->audio_data + st->d->audio_data_index; \ + size_t i, c; \ + \ + TURN_ON_FTZ \ + \ + if ((st->mode & EBUR128_MODE_SAMPLE_PEAK) == EBUR128_MODE_SAMPLE_PEAK) { \ + for (c = 0; c < st->channels; ++c) { \ + double max = 0.0; \ + for (i = 0; i < frames; ++i) { \ + if (src[i * st->channels + c] > max) { \ + max = src[i * st->channels + c]; \ + } else if (-src[i * st->channels + c] > max) { \ + max = -1.0 * src[i * st->channels + c]; \ + } \ + } \ + max /= scaling_factor; \ + if (max > st->d->sample_peak[c]) st->d->sample_peak[c] = max; \ + } \ + } \ + if (ebur128_use_speex_resampler(st)) { \ + for (c = 0; c < st->channels; ++c) { \ + for (i = 0; i < frames; ++i) { \ + st->d->resampler_buffer_input[i * st->channels + c] = \ + (float) (src[i * st->channels + c] / scaling_factor); \ + } \ + } \ + ebur128_check_true_peak(st, frames); \ + } \ + for (c = 0; c < st->channels; ++c) { \ + int ci = st->d->channel_map[c] - 1; \ + if (ci < 0) continue; \ + else if (ci == EBUR128_DUAL_MONO - 1) ci = 0; /*dual mono */ \ + for (i = 0; i < frames; ++i) { \ + st->d->v[ci][0] = (double) (src[i * st->channels + c] / scaling_factor) \ + - st->d->a[1] * st->d->v[ci][1] \ + - st->d->a[2] * st->d->v[ci][2] \ + - st->d->a[3] * st->d->v[ci][3] \ + - st->d->a[4] * st->d->v[ci][4]; \ + audio_data[i * st->channels + c] = \ + st->d->b[0] * st->d->v[ci][0] \ + + st->d->b[1] * st->d->v[ci][1] \ + + st->d->b[2] * st->d->v[ci][2] \ + + st->d->b[3] * st->d->v[ci][3] \ + + st->d->b[4] * st->d->v[ci][4]; \ + st->d->v[ci][4] = st->d->v[ci][3]; \ + st->d->v[ci][3] = st->d->v[ci][2]; \ + st->d->v[ci][2] = st->d->v[ci][1]; \ + st->d->v[ci][1] = st->d->v[ci][0]; \ + } \ + FLUSH_MANUALLY \ + } \ + TURN_OFF_FTZ \ +} +EBUR128_FILTER(short, SHRT_MIN, SHRT_MAX) +EBUR128_FILTER(int, INT_MIN, INT_MAX) +EBUR128_FILTER(float, -1.0f, 1.0f) +EBUR128_FILTER(double, -1.0, 1.0) + +static double ebur128_energy_to_loudness(double energy) { + return 10 * (log(energy) / log(10.0)) - 0.691; +} + +static size_t find_histogram_index(double energy) { + size_t index_min = 0; + size_t index_max = 1000; + size_t index_mid; + + do { + index_mid = (index_min + index_max) / 2; + if (energy >= histogram_energy_boundaries[index_mid]) { + index_min = index_mid; + } else { + index_max = index_mid; + } + } while (index_max - index_min != 1); + + return index_min; +} + +static int ebur128_calc_gating_block(ebur128_state* st, size_t frames_per_block, + double* optional_output) { + size_t i, c; + double sum = 0.0; + double channel_sum; + for (c = 0; c < st->channels; ++c) { + if (st->d->channel_map[c] == EBUR128_UNUSED) continue; + channel_sum = 0.0; + if (st->d->audio_data_index < frames_per_block * st->channels) { + for (i = 0; i < st->d->audio_data_index / st->channels; ++i) { + channel_sum += st->d->audio_data[i * st->channels + c] * + st->d->audio_data[i * st->channels + c]; + } + for (i = st->d->audio_data_frames - + (frames_per_block - + st->d->audio_data_index / st->channels); + i < st->d->audio_data_frames; ++i) { + channel_sum += st->d->audio_data[i * st->channels + c] * + st->d->audio_data[i * st->channels + c]; + } + } else { + for (i = st->d->audio_data_index / st->channels - frames_per_block; + i < st->d->audio_data_index / st->channels; + ++i) { + channel_sum += st->d->audio_data[i * st->channels + c] * + st->d->audio_data[i * st->channels + c]; + } + } + if (st->d->channel_map[c] == EBUR128_Mp110 || + st->d->channel_map[c] == EBUR128_Mm110 || + st->d->channel_map[c] == EBUR128_Mp060 || + st->d->channel_map[c] == EBUR128_Mm060 || + st->d->channel_map[c] == EBUR128_Mp090 || + st->d->channel_map[c] == EBUR128_Mm090) { + channel_sum *= 1.41; + } else if (st->d->channel_map[c] == EBUR128_DUAL_MONO) { + channel_sum *= 2.0; + } + sum += channel_sum; + } + sum /= (double) frames_per_block; + if (optional_output) { + *optional_output = sum; + return EBUR128_SUCCESS; + } else if (sum >= histogram_energy_boundaries[0]) { + if (st->d->use_histogram) { + ++st->d->block_energy_histogram[find_histogram_index(sum)]; + } else { + struct ebur128_dq_entry* block; + block = (struct ebur128_dq_entry*) malloc(sizeof(struct ebur128_dq_entry)); + if (!block) return EBUR128_ERROR_NOMEM; + block->z = sum; + SLIST_INSERT_HEAD(&st->d->block_list, block, entries); + } + return EBUR128_SUCCESS; + } else { + return EBUR128_SUCCESS; + } +} + +int ebur128_set_channel(ebur128_state* st, + unsigned int channel_number, + int value) { + if (channel_number >= st->channels) { + return 1; + } + if (value == EBUR128_DUAL_MONO && + (st->channels != 1 || channel_number != 0)) { + fprintf(stderr, "EBUR128_DUAL_MONO only works with mono files!\n"); + return 1; + } + st->d->channel_map[channel_number] = value; + return 0; +} + +int ebur128_change_parameters(ebur128_state* st, + unsigned int channels, + unsigned long samplerate) { + int errcode; + if (channels == st->channels && + samplerate == st->samplerate) { + return 2; + } + free(st->d->audio_data); + st->d->audio_data = NULL; + + if (channels != st->channels) { + unsigned int i; + + free(st->d->channel_map); st->d->channel_map = NULL; + free(st->d->sample_peak); st->d->sample_peak = NULL; + free(st->d->true_peak); st->d->true_peak = NULL; + st->channels = channels; + +#ifdef USE_SPEEX_RESAMPLER + ebur128_destroy_resampler(st); + ebur128_init_resampler(st); +#endif + + errcode = ebur128_init_channel_map(st); + CHECK_ERROR(errcode, EBUR128_ERROR_NOMEM, exit) + + st->d->sample_peak = (double*) malloc(channels * sizeof(double)); + CHECK_ERROR(!st->d->sample_peak, EBUR128_ERROR_NOMEM, exit) + st->d->true_peak = (double*) malloc(channels * sizeof(double)); + CHECK_ERROR(!st->d->true_peak, EBUR128_ERROR_NOMEM, exit) + for (i = 0; i < channels; ++i) { + st->d->sample_peak[i] = 0.0; + st->d->true_peak[i] = 0.0; + } + } + if (samplerate != st->samplerate) { + st->samplerate = samplerate; + ebur128_init_filter(st); + } + if ((st->mode & EBUR128_MODE_S) == EBUR128_MODE_S) { + st->d->audio_data_frames = st->d->samples_in_100ms * 30; + } else if ((st->mode & EBUR128_MODE_M) == EBUR128_MODE_M) { + st->d->audio_data_frames = st->d->samples_in_100ms * 4; + } else { + return 1; + } + st->d->audio_data = (double*) malloc(st->d->audio_data_frames * + st->channels * + sizeof(double)); + CHECK_ERROR(!st->d->audio_data, EBUR128_ERROR_NOMEM, exit) + + /* the first block needs 400ms of audio data */ + st->d->needed_frames = st->d->samples_in_100ms * 4; + /* start at the beginning of the buffer */ + st->d->audio_data_index = 0; + /* reset short term frame counter */ + st->d->short_term_frame_counter = 0; + + return 0; + +exit: + return 1; +} + + +static int ebur128_energy_shortterm(ebur128_state* st, double* out); +#define EBUR128_ADD_FRAMES(type) \ +int ebur128_add_frames_##type(ebur128_state* st, \ + const type* src, size_t frames) { \ + size_t src_index = 0; \ + while (frames > 0) { \ + if (frames >= st->d->needed_frames) { \ + ebur128_filter_##type(st, src + src_index, st->d->needed_frames); \ + src_index += st->d->needed_frames * st->channels; \ + frames -= st->d->needed_frames; \ + st->d->audio_data_index += st->d->needed_frames * st->channels; \ + /* calculate the new gating block */ \ + if ((st->mode & EBUR128_MODE_I) == EBUR128_MODE_I) { \ + if (ebur128_calc_gating_block(st, st->d->samples_in_100ms * 4, NULL)) {\ + return EBUR128_ERROR_NOMEM; \ + } \ + } \ + if ((st->mode & EBUR128_MODE_LRA) == EBUR128_MODE_LRA) { \ + st->d->short_term_frame_counter += st->d->needed_frames; \ + if (st->d->short_term_frame_counter == st->d->samples_in_100ms * 30) { \ + struct ebur128_dq_entry* block; \ + double st_energy; \ + ebur128_energy_shortterm(st, &st_energy); \ + if (st_energy >= histogram_energy_boundaries[0]) { \ + if (st->d->use_histogram) { \ + ++st->d->short_term_block_energy_histogram[ \ + find_histogram_index(st_energy)];\ + } else { \ + block = (struct ebur128_dq_entry*) \ + malloc(sizeof(struct ebur128_dq_entry)); \ + if (!block) return EBUR128_ERROR_NOMEM; \ + block->z = st_energy; \ + SLIST_INSERT_HEAD(&st->d->short_term_block_list, block, entries);\ + } \ + } \ + st->d->short_term_frame_counter = st->d->samples_in_100ms * 20; \ + } \ + } \ + /* 100ms are needed for all blocks besides the first one */ \ + st->d->needed_frames = st->d->samples_in_100ms; \ + /* reset audio_data_index when buffer full */ \ + if (st->d->audio_data_index == st->d->audio_data_frames * st->channels) {\ + st->d->audio_data_index = 0; \ + } \ + } else { \ + ebur128_filter_##type(st, src + src_index, frames); \ + st->d->audio_data_index += frames * st->channels; \ + if ((st->mode & EBUR128_MODE_LRA) == EBUR128_MODE_LRA) { \ + st->d->short_term_frame_counter += frames; \ + } \ + st->d->needed_frames -= frames; \ + frames = 0; \ + } \ + } \ + return EBUR128_SUCCESS; \ +} +EBUR128_ADD_FRAMES(short) +EBUR128_ADD_FRAMES(int) +EBUR128_ADD_FRAMES(float) +EBUR128_ADD_FRAMES(double) + +static int ebur128_calc_relative_threshold(ebur128_state* st, + size_t* above_thresh_counter, + double* relative_threshold) { + struct ebur128_dq_entry* it; + size_t i; + *relative_threshold = 0.0; + *above_thresh_counter = 0; + + if (st->d->use_histogram) { + for (i = 0; i < 1000; ++i) { + *relative_threshold += st->d->block_energy_histogram[i] * + histogram_energies[i]; + *above_thresh_counter += st->d->block_energy_histogram[i]; + } + } else { + SLIST_FOREACH(it, &st->d->block_list, entries) { + ++*above_thresh_counter; + *relative_threshold += it->z; + } + } + + if (*above_thresh_counter != 0) { + *relative_threshold /= (double) *above_thresh_counter; + *relative_threshold *= relative_gate_factor; + } + + return EBUR128_SUCCESS; +} + +static int ebur128_gated_loudness(ebur128_state** sts, size_t size, + double* out) { + struct ebur128_dq_entry* it; + double gated_loudness = 0.0; + double relative_threshold; + size_t above_thresh_counter; + size_t i, j, start_index; + + for (i = 0; i < size; i++) { + if (sts[i] && (sts[i]->mode & EBUR128_MODE_I) != EBUR128_MODE_I) { + return EBUR128_ERROR_INVALID_MODE; + } + } + + for (i = 0; i < size; i++) { + if (!sts[i]) continue; + ebur128_calc_relative_threshold(sts[i], &above_thresh_counter, &relative_threshold); + } + if (!above_thresh_counter) { + *out = -HUGE_VAL; + return EBUR128_SUCCESS; + } + + above_thresh_counter = 0; + if (relative_threshold < histogram_energy_boundaries[0]) { + start_index = 0; + } else { + start_index = find_histogram_index(relative_threshold); + if (relative_threshold > histogram_energies[start_index]) { + ++start_index; + } + } + for (i = 0; i < size; i++) { + if (!sts[i]) continue; + if (sts[i]->d->use_histogram) { + for (j = start_index; j < 1000; ++j) { + gated_loudness += sts[i]->d->block_energy_histogram[j] * + histogram_energies[j]; + above_thresh_counter += sts[i]->d->block_energy_histogram[j]; + } + } else { + SLIST_FOREACH(it, &sts[i]->d->block_list, entries) { + if (it->z >= relative_threshold) { + ++above_thresh_counter; + gated_loudness += it->z; + } + } + } + } + if (!above_thresh_counter) { + *out = -HUGE_VAL; + return EBUR128_SUCCESS; + } + gated_loudness /= (double) above_thresh_counter; + *out = ebur128_energy_to_loudness(gated_loudness); + return EBUR128_SUCCESS; +} + +int ebur128_relative_threshold(ebur128_state* st, double* out) { + double relative_threshold; + size_t above_thresh_counter; + + if (st && (st->mode & EBUR128_MODE_I) != EBUR128_MODE_I) + return EBUR128_ERROR_INVALID_MODE; + + ebur128_calc_relative_threshold(st, &above_thresh_counter, &relative_threshold); + + if (!above_thresh_counter) { + *out = -70.0; + return EBUR128_SUCCESS; + } + + *out = ebur128_energy_to_loudness(relative_threshold); + return EBUR128_SUCCESS; +} + +int ebur128_loudness_global(ebur128_state* st, double* out) { + return ebur128_gated_loudness(&st, 1, out); +} + +int ebur128_loudness_global_multiple(ebur128_state** sts, size_t size, + double* out) { + return ebur128_gated_loudness(sts, size, out); +} + +static int ebur128_energy_in_interval(ebur128_state* st, + size_t interval_frames, + double* out) { + if (interval_frames > st->d->audio_data_frames) { + return EBUR128_ERROR_INVALID_MODE; + } + ebur128_calc_gating_block(st, interval_frames, out); + return EBUR128_SUCCESS; +} + +static int ebur128_energy_shortterm(ebur128_state* st, double* out) { + return ebur128_energy_in_interval(st, st->d->samples_in_100ms * 30, out); +} + +int ebur128_loudness_momentary(ebur128_state* st, double* out) { + double energy; + int error = ebur128_energy_in_interval(st, st->d->samples_in_100ms * 4, + &energy); + if (error) { + return error; + } else if (energy <= 0.0) { + *out = -HUGE_VAL; + return EBUR128_SUCCESS; + } + *out = ebur128_energy_to_loudness(energy); + return EBUR128_SUCCESS; +} + +int ebur128_loudness_shortterm(ebur128_state* st, double* out) { + double energy; + int error = ebur128_energy_shortterm(st, &energy); + if (error) { + return error; + } else if (energy <= 0.0) { + *out = -HUGE_VAL; + return EBUR128_SUCCESS; + } + *out = ebur128_energy_to_loudness(energy); + return EBUR128_SUCCESS; +} + +static int ebur128_double_cmp(const void *p1, const void *p2) { + const double* d1 = (const double*) p1; + const double* d2 = (const double*) p2; + return (*d1 > *d2) - (*d1 < *d2); +} + +/* EBU - TECH 3342 */ +int ebur128_loudness_range_multiple(ebur128_state** sts, size_t size, + double* out) { + size_t i, j; + struct ebur128_dq_entry* it; + double* stl_vector; + size_t stl_size; + double* stl_relgated; + size_t stl_relgated_size; + double stl_power, stl_integrated; + /* High and low percentile energy */ + double h_en, l_en; + int use_histogram = 0; + + for (i = 0; i < size; ++i) { + if (sts[i]) { + if ((sts[i]->mode & EBUR128_MODE_LRA) != EBUR128_MODE_LRA) { + return EBUR128_ERROR_INVALID_MODE; + } + if (i == 0 && sts[i]->mode & EBUR128_MODE_HISTOGRAM) { + use_histogram = 1; + } else if (use_histogram != !!(sts[i]->mode & EBUR128_MODE_HISTOGRAM)) { + return EBUR128_ERROR_INVALID_MODE; + } + } + } + + if (use_histogram) { + unsigned long hist[1000] = { 0 }; + size_t percentile_low, percentile_high; + size_t index; + + stl_size = 0; + stl_power = 0.0; + for (i = 0; i < size; ++i) { + if (!sts[i]) continue; + for (j = 0; j < 1000; ++j) { + hist[j] += sts[i]->d->short_term_block_energy_histogram[j]; + stl_size += sts[i]->d->short_term_block_energy_histogram[j]; + stl_power += sts[i]->d->short_term_block_energy_histogram[j] + * histogram_energies[j]; + } + } + if (!stl_size) { + *out = 0.0; + return EBUR128_SUCCESS; + } + + stl_power /= stl_size; + stl_integrated = minus_twenty_decibels * stl_power; + + if (stl_integrated < histogram_energy_boundaries[0]) { + index = 0; + } else { + index = find_histogram_index(stl_integrated); + if (stl_integrated > histogram_energies[index]) { + ++index; + } + } + stl_size = 0; + for (j = index; j < 1000; ++j) { + stl_size += hist[j]; + } + if (!stl_size) { + *out = 0.0; + return EBUR128_SUCCESS; + } + + percentile_low = (size_t) ((stl_size - 1) * 0.1 + 0.5); + percentile_high = (size_t) ((stl_size - 1) * 0.95 + 0.5); + + stl_size = 0; + j = index; + while (stl_size <= percentile_low) { + stl_size += hist[j++]; + } + l_en = histogram_energies[j - 1]; + while (stl_size <= percentile_high) { + stl_size += hist[j++]; + } + h_en = histogram_energies[j - 1]; + *out = ebur128_energy_to_loudness(h_en) - ebur128_energy_to_loudness(l_en); + return EBUR128_SUCCESS; + + } else { + stl_size = 0; + for (i = 0; i < size; ++i) { + if (!sts[i]) continue; + SLIST_FOREACH(it, &sts[i]->d->short_term_block_list, entries) { + ++stl_size; + } + } + if (!stl_size) { + *out = 0.0; + return EBUR128_SUCCESS; + } + stl_vector = (double*) malloc(stl_size * sizeof(double)); + if (!stl_vector) + return EBUR128_ERROR_NOMEM; + + for (j = 0, i = 0; i < size; ++i) { + if (!sts[i]) continue; + SLIST_FOREACH(it, &sts[i]->d->short_term_block_list, entries) { + stl_vector[j] = it->z; + ++j; + } + } + qsort(stl_vector, stl_size, sizeof(double), ebur128_double_cmp); + stl_power = 0.0; + for (i = 0; i < stl_size; ++i) { + stl_power += stl_vector[i]; + } + stl_power /= (double) stl_size; + stl_integrated = minus_twenty_decibels * stl_power; + + stl_relgated = stl_vector; + stl_relgated_size = stl_size; + while (stl_relgated_size > 0 && *stl_relgated < stl_integrated) { + ++stl_relgated; + --stl_relgated_size; + } + + if (stl_relgated_size) { + h_en = stl_relgated[(size_t) ((stl_relgated_size - 1) * 0.95 + 0.5)]; + l_en = stl_relgated[(size_t) ((stl_relgated_size - 1) * 0.1 + 0.5)]; + free(stl_vector); + *out = ebur128_energy_to_loudness(h_en) - ebur128_energy_to_loudness(l_en); + return EBUR128_SUCCESS; + } else { + free(stl_vector); + *out = 0.0; + return EBUR128_SUCCESS; + } + } +} + +int ebur128_loudness_range(ebur128_state* st, double* out) { + return ebur128_loudness_range_multiple(&st, 1, out); +} + +int ebur128_sample_peak(ebur128_state* st, + unsigned int channel_number, + double* out) { + if ((st->mode & EBUR128_MODE_SAMPLE_PEAK) != EBUR128_MODE_SAMPLE_PEAK) { + return EBUR128_ERROR_INVALID_MODE; + } else if (channel_number >= st->channels) { + return EBUR128_ERROR_INVALID_CHANNEL_INDEX; + } + *out = st->d->sample_peak[channel_number]; + return EBUR128_SUCCESS; +} + +#ifdef USE_SPEEX_RESAMPLER +int ebur128_true_peak(ebur128_state* st, + unsigned int channel_number, + double* out) { + if ((st->mode & EBUR128_MODE_TRUE_PEAK) != EBUR128_MODE_TRUE_PEAK) { + return EBUR128_ERROR_INVALID_MODE; + } else if (channel_number >= st->channels) { + return EBUR128_ERROR_INVALID_CHANNEL_INDEX; + } + *out = st->d->true_peak[channel_number] > st->d->sample_peak[channel_number] + ? st->d->true_peak[channel_number] + : st->d->sample_peak[channel_number]; + return EBUR128_SUCCESS; +} +#endif diff --git a/lib/libebur128-1.1.0/ebur128/ebur128.h b/lib/libebur128-1.1.0/ebur128/ebur128.h new file mode 100644 index 000000000000..b5898449593a --- /dev/null +++ b/lib/libebur128-1.1.0/ebur128/ebur128.h @@ -0,0 +1,330 @@ +/* See COPYING file for copyright and license details. */ + +#ifndef EBUR128_H_ +#define EBUR128_H_ + +/** \file ebur128.h + * \brief libebur128 - a library for loudness measurement according to + * the EBU R128 standard. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define EBUR128_VERSION_MAJOR 1 +#define EBUR128_VERSION_MINOR 1 +#define EBUR128_VERSION_PATCH 0 + +#include /* for size_t */ + +/** \enum channel + * Use these values when setting the channel map with ebur128_set_channel(). + * See definitions in ITU R-REC-BS 1770-4 + */ +enum channel { + EBUR128_UNUSED = 0, /**< unused channel (for example LFE channel) */ + EBUR128_LEFT, + EBUR128_Mp030 = 1, /**< itu M+030 */ + EBUR128_RIGHT, + EBUR128_Mm030 = 2, /**< itu M-030 */ + EBUR128_CENTER, + EBUR128_Mp000 = 3, /**< itu M+000 */ + EBUR128_LEFT_SURROUND, + EBUR128_Mp110 = 4, /**< itu M+110 */ + EBUR128_RIGHT_SURROUND, + EBUR128_Mm110 = 5, /**< itu M-110 */ + EBUR128_DUAL_MONO, /**< a channel that is counted twice */ + EBUR128_MpSC, /**< itu M+SC */ + EBUR128_MmSC, /**< itu M-SC */ + EBUR128_Mp060, /**< itu M+060 */ + EBUR128_Mm060, /**< itu M-060 */ + EBUR128_Mp090, /**< itu M+090 */ + EBUR128_Mm090, /**< itu M-090 */ + EBUR128_Mp135, /**< itu M+135 */ + EBUR128_Mm135, /**< itu M-135 */ + EBUR128_Mp180, /**< itu M+180 */ + EBUR128_Up000, /**< itu U+000 */ + EBUR128_Up030, /**< itu U+030 */ + EBUR128_Um030, /**< itu U-030 */ + EBUR128_Up045, /**< itu U+045 */ + EBUR128_Um045, /**< itu U-030 */ + EBUR128_Up090, /**< itu U+090 */ + EBUR128_Um090, /**< itu U-090 */ + EBUR128_Up110, /**< itu U+110 */ + EBUR128_Um110, /**< itu U-110 */ + EBUR128_Up135, /**< itu U+135 */ + EBUR128_Um135, /**< itu U-135 */ + EBUR128_Up180, /**< itu U+180 */ + EBUR128_Tp000, /**< itu T+000 */ + EBUR128_Bp000, /**< itu B+000 */ + EBUR128_Bp045, /**< itu B+045 */ + EBUR128_Bm045 /**< itu B-045 */ +}; + +/** \enum error + * Error return values. + */ +enum error { + EBUR128_SUCCESS = 0, + EBUR128_ERROR_NOMEM, + EBUR128_ERROR_INVALID_MODE, + EBUR128_ERROR_INVALID_CHANNEL_INDEX, + EBUR128_ERROR_NO_CHANGE +}; + +/** \enum mode + * Use these values in ebur128_init (or'ed). Try to use the lowest possible + * modes that suit your needs, as performance will be better. + */ +enum mode { + /** can call ebur128_loudness_momentary */ + EBUR128_MODE_M = (1 << 0), + /** can call ebur128_loudness_shortterm */ + EBUR128_MODE_S = (1 << 1) | EBUR128_MODE_M, + /** can call ebur128_loudness_global_* and ebur128_relative_threshold */ + EBUR128_MODE_I = (1 << 2) | EBUR128_MODE_M, + /** can call ebur128_loudness_range */ + EBUR128_MODE_LRA = (1 << 3) | EBUR128_MODE_S, + /** can call ebur128_sample_peak */ + EBUR128_MODE_SAMPLE_PEAK = (1 << 4) | EBUR128_MODE_M, + /** can call ebur128_true_peak */ + EBUR128_MODE_TRUE_PEAK = (1 << 5) | EBUR128_MODE_M + | EBUR128_MODE_SAMPLE_PEAK, + /** uses histogram algorithm to calculate loudness */ + EBUR128_MODE_HISTOGRAM = (1 << 6) +}; + +/** forward declaration of ebur128_state_internal */ +struct ebur128_state_internal; + +/** \brief Contains information about the state of a loudness measurement. + * + * You should not need to modify this struct directly. + */ +typedef struct { + int mode; /**< The current mode. */ + unsigned int channels; /**< The number of channels. */ + unsigned long samplerate; /**< The sample rate. */ + struct ebur128_state_internal* d; /**< Internal state. */ +} ebur128_state; + +/** \brief Get library version number. Do not pass null pointers here. + * + * @param major major version number of library + * @param minor minor version number of library + * @param patch patch version number of library + */ +void ebur128_get_version(int* major, int* minor, int* patch); + +/** \brief Initialize library state. + * + * @param channels the number of channels. + * @param samplerate the sample rate. + * @param mode see the mode enum for possible values. + * @return an initialized library state. + */ +ebur128_state* ebur128_init(unsigned int channels, + unsigned long samplerate, + int mode); + +/** \brief Destroy library state. + * + * @param st pointer to a library state. + */ +void ebur128_destroy(ebur128_state** st); + +/** \brief Set channel type. + * + * The default is: + * - 0 -> EBUR128_LEFT + * - 1 -> EBUR128_RIGHT + * - 2 -> EBUR128_CENTER + * - 3 -> EBUR128_UNUSED + * - 4 -> EBUR128_LEFT_SURROUND + * - 5 -> EBUR128_RIGHT_SURROUND + * + * @param st library state. + * @param channel_number zero based channel index. + * @param value channel type from the "channel" enum. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_CHANNEL_INDEX if invalid channel index. + */ +int ebur128_set_channel(ebur128_state* st, + unsigned int channel_number, + int value); + +/** \brief Change library parameters. + * + * Note that the channel map will be reset when setting a different number of + * channels. The current unfinished block will be lost. + * + * @param st library state. + * @param channels new number of channels. + * @param samplerate new sample rate. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_NOMEM on memory allocation error. The state will be + * invalid and must be destroyed. + * - EBUR128_ERROR_NO_CHANGE if channels and sample rate were not changed. + */ +int ebur128_change_parameters(ebur128_state* st, + unsigned int channels, + unsigned long samplerate); + +/** \brief Add frames to be processed. + * + * @param st library state. + * @param src array of source frames. Channels must be interleaved. + * @param frames number of frames. Not number of samples! + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_NOMEM on memory allocation error. + */ +int ebur128_add_frames_short(ebur128_state* st, + const short* src, + size_t frames); +/** \brief See \ref ebur128_add_frames_short */ +int ebur128_add_frames_int(ebur128_state* st, + const int* src, + size_t frames); +/** \brief See \ref ebur128_add_frames_short */ +int ebur128_add_frames_float(ebur128_state* st, + const float* src, + size_t frames); +/** \brief See \ref ebur128_add_frames_short */ +int ebur128_add_frames_double(ebur128_state* st, + const double* src, + size_t frames); + +/** \brief Get global integrated loudness in LUFS. + * + * @param st library state. + * @param out integrated loudness in LUFS. -HUGE_VAL if result is negative + * infinity. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_I" has not been set. + */ +int ebur128_loudness_global(ebur128_state* st, double* out); +/** \brief Get global integrated loudness in LUFS across multiple instances. + * + * @param sts array of library states. + * @param size length of sts + * @param out integrated loudness in LUFS. -HUGE_VAL if result is negative + * infinity. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_I" has not been set. + */ +int ebur128_loudness_global_multiple(ebur128_state** sts, + size_t size, + double* out); + +/** \brief Get momentary loudness (last 400ms) in LUFS. + * + * @param st library state. + * @param out momentary loudness in LUFS. -HUGE_VAL if result is negative + * infinity. + * @return + * - EBUR128_SUCCESS on success. + */ +int ebur128_loudness_momentary(ebur128_state* st, double* out); +/** \brief Get short-term loudness (last 3s) in LUFS. + * + * @param st library state. + * @param out short-term loudness in LUFS. -HUGE_VAL if result is negative + * infinity. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_S" has not been set. + */ +int ebur128_loudness_shortterm(ebur128_state* st, double* out); + +/** \brief Get loudness range (LRA) of programme in LU. + * + * Calculates loudness range according to EBU 3342. + * + * @param st library state. + * @param out loudness range (LRA) in LU. Will not be changed in case of + * error. EBUR128_ERROR_NOMEM or EBUR128_ERROR_INVALID_MODE will be + * returned in this case. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_NOMEM in case of memory allocation error. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_LRA" has not been set. + */ +int ebur128_loudness_range(ebur128_state* st, double* out); +/** \brief Get loudness range (LRA) in LU across multiple instances. + * + * Calculates loudness range according to EBU 3342. + * + * @param sts array of library states. + * @param size length of sts + * @param out loudness range (LRA) in LU. Will not be changed in case of + * error. EBUR128_ERROR_NOMEM or EBUR128_ERROR_INVALID_MODE will be + * returned in this case. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_NOMEM in case of memory allocation error. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_LRA" has not been set. + */ +int ebur128_loudness_range_multiple(ebur128_state** sts, + size_t size, + double* out); + +/** \brief Get maximum sample peak of selected channel in float format. + * + * @param st library state + * @param channel_number channel to analyse + * @param out maximum sample peak in float format (1.0 is 0 dBFS) + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_SAMPLE_PEAK" has not + * been set. + * - EBUR128_ERROR_INVALID_CHANNEL_INDEX if invalid channel index. + */ +int ebur128_sample_peak(ebur128_state* st, + unsigned int channel_number, + double* out); + +/** \brief Get maximum true peak of selected channel in float format. + * + * Uses an implementation defined algorithm to calculate the true peak. Do not + * try to compare resulting values across different versions of the library, + * as the algorithm may change. + * + * The current implementation uses the Speex resampler with quality level 8 to + * calculate true peak. Will oversample 4x for sample rates < 96000 Hz, 2x for + * sample rates < 192000 Hz and leave the signal unchanged for 192000 Hz. + * + * @param st library state + * @param channel_number channel to analyse + * @param out maximum true peak in float format (1.0 is 0 dBFS) + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_TRUE_PEAK" has not + * been set. + * - EBUR128_ERROR_INVALID_CHANNEL_INDEX if invalid channel index. + */ +int ebur128_true_peak(ebur128_state* st, + unsigned int channel_number, + double* out); + +/** \brief Get relative threshold in LUFS. + * + * @param st library state + * @param out relative threshold in LUFS. + * @return + * - EBUR128_SUCCESS on success. + * - EBUR128_ERROR_INVALID_MODE if mode "EBUR128_MODE_I" has not + * been set. + */ +int ebur128_relative_threshold(ebur128_state* st, double* out); + +#ifdef __cplusplus +} +#endif + +#endif /* EBUR128_H_ */ diff --git a/lib/libebur128-1.1.0/ebur128/queue/sys/queue.h b/lib/libebur128-1.1.0/ebur128/queue/sys/queue.h new file mode 100644 index 000000000000..daf4553d33e9 --- /dev/null +++ b/lib/libebur128-1.1.0/ebur128/queue/sys/queue.h @@ -0,0 +1,574 @@ +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR 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. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * lists, simple queues, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The + * elements are singly linked for minimum space and pointer manipulation + * overhead at the expense of O(n) removal for arbitrary elements. New + * elements can be added to the list after an existing element or at the + * head of the list. Elements being removed from the head of the list + * should use the explicit macro for this purpose for optimum + * efficiency. A singly-linked list may only be traversed in the forward + * direction. Singly-linked lists are ideal for applications with large + * datasets and few or no removals or for implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +/* + * List definitions. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#define LIST_INIT(head) do { \ + (head)->lh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (/*CONSTCOND*/0) + +#define LIST_REMOVE(elm, field) do { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = ((head)->lh_first); \ + (var); \ + (var) = ((var)->field.le_next)) + +/* + * List access methods. + */ +#define LIST_EMPTY(head) ((head)->lh_first == NULL) +#define LIST_FIRST(head) ((head)->lh_first) +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + + +/* + * Singly-linked List definitions. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define SLIST_INIT(head) do { \ + (head)->slh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (/*CONSTCOND*/0) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while(curelm->field.sle_next != (elm)) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + +/* + * Singly-linked List access methods. + */ +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) +#define SLIST_FIRST(head) ((head)->slh_first) +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first; /* first element */ \ + struct type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_INIT(head) do { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (listelm)->field.stqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (/*CONSTCOND*/0) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + if ((head)->stqh_first == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->stqh_first; \ + while (curelm->field.stqe_next != (elm)) \ + curelm = curelm->field.stqe_next; \ + if ((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define STAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->stqh_first); \ + (var); \ + (var) = ((var)->field.stqe_next)) + +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * Singly-linked Tail queue access methods. + */ +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) +#define STAILQ_FIRST(head) ((head)->stqh_first) +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + + +/* + * Simple queue definitions. + */ +#define SIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define SIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue functions. + */ +#define SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ + if ((head)->sqh_first == (elm)) { \ + SIMPLEQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->sqh_first; \ + while (curelm->field.sqe_next != (elm)) \ + curelm = curelm->field.sqe_next; \ + if ((curelm->field.sqe_next = \ + curelm->field.sqe_next->field.sqe_next) == NULL) \ + (head)->sqh_last = &(curelm)->field.sqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->sqh_first); \ + (var); \ + (var) = ((var)->field.sqe_next)) + +/* + * Simple queue access methods. + */ +#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) +#define SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + + +/* + * Tail queue definitions. + */ +#define _TAILQ_HEAD(name, type, qual) \ +struct name { \ + qual type *tqh_first; /* first element */ \ + qual type *qual *tqh_last; /* addr of last next element */ \ +} +#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define _TAILQ_ENTRY(type, qual) \ +struct { \ + qual type *tqe_next; /* next element */ \ + qual type *qual *tqe_prev; /* address of previous next element */\ +} +#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) + +/* + * Tail queue functions. + */ +#define TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->tqh_first); \ + (var); \ + (var) = ((var)->field.tqe_next)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ + (var); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +/* + * Tail queue access methods. + */ +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) +#define TAILQ_FIRST(head) ((head)->tqh_first) +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + + +/* + * Circular queue definitions. + */ +#define CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define CIRCLEQ_HEAD_INITIALIZER(head) \ + { (void *)&head, (void *)&head } + +#define CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = (void *)(head); \ + (head)->cqh_last = (void *)(head); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = (void *)(head); \ + if ((head)->cqh_last == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.cqe_next = (void *)(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_REMOVE(head, elm, field) do { \ + if ((elm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} while (/*CONSTCOND*/0) + +#define CIRCLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->cqh_first); \ + (var) != (const void *)(head); \ + (var) = ((var)->field.cqe_next)) + +#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for ((var) = ((head)->cqh_last); \ + (var) != (const void *)(head); \ + (var) = ((var)->field.cqe_prev)) + +/* + * Circular queue access methods. + */ +#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) +#define CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define CIRCLEQ_LAST(head) ((head)->cqh_last) +#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) +#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) + +#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ + (((elm)->field.cqe_next == (void *)(head)) \ + ? ((head)->cqh_first) \ + : (elm->field.cqe_next)) +#define CIRCLEQ_LOOP_PREV(head, elm, field) \ + (((elm)->field.cqe_prev == (void *)(head)) \ + ? ((head)->cqh_last) \ + : (elm->field.cqe_prev)) + +#endif /* sys/queue.h */ diff --git a/lib/libebur128-1.1.0/test/CMakeLists.txt b/lib/libebur128-1.1.0/test/CMakeLists.txt new file mode 100644 index 000000000000..c988bcb189b6 --- /dev/null +++ b/lib/libebur128-1.1.0/test/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 2.8.9) + +set(ENABLE_TESTS OFF CACHE BOOL "Build test binaries, needs libsndfile") + +if(ENABLE_TESTS) + find_package(PkgConfig REQUIRED) + find_pkg_config(SNDFILE sndfile REQUIRED) + + include_directories(${EBUR128_INCLUDE_DIR}) + include_directories(SYSTEM ${SNDFILE_INCLUDE_DIRS}) + + add_executable(r128-test-library tests) + add_executable(minimal-example minimal-example) + set_property(TARGET r128-test-library APPEND_STRING PROPERTY + COMPILE_FLAGS " ${SNDFILE_CFLAGS}") + set_property(TARGET minimal-example APPEND_STRING PROPERTY + COMPILE_FLAGS " ${SNDFILE_CFLAGS}") + target_link_libraries(r128-test-library ebur128 ${SNDFILE_LIBRARIES}) + target_link_libraries(minimal-example ebur128 ${SNDFILE_LIBRARIES}) +endif() diff --git a/lib/libebur128-1.1.0/test/minimal-example.c b/lib/libebur128-1.1.0/test/minimal-example.c new file mode 100644 index 000000000000..499fe09a9557 --- /dev/null +++ b/lib/libebur128-1.1.0/test/minimal-example.c @@ -0,0 +1,71 @@ +/* See COPYING file for copyright and license details. */ + +#include +#include +#include + +#include "ebur128.h" + + +int main(int ac, const char* av[]) { + SF_INFO file_info; + SNDFILE* file; + sf_count_t nr_frames_read; + ebur128_state** sts = NULL; + double* buffer; + double loudness; + int i; + + if (ac < 2) { + fprintf(stderr, "usage: %s FILENAME...\n", av[0]); + exit(1); + } + + sts = malloc((size_t) (ac - 1) * sizeof(ebur128_state*)); + + for (i = 0; i < ac - 1; ++i) { + memset(&file_info, '\0', sizeof(file_info)); + file = sf_open(av[i + 1], SFM_READ, &file_info); + + sts[i] = ebur128_init((unsigned) file_info.channels, + (unsigned) file_info.samplerate, + EBUR128_MODE_I); + + /* example: set channel map (note: see ebur128.h for the default map) */ + if (file_info.channels == 5) { + ebur128_set_channel(sts[i], 0, EBUR128_LEFT); + ebur128_set_channel(sts[i], 1, EBUR128_RIGHT); + ebur128_set_channel(sts[i], 2, EBUR128_CENTER); + ebur128_set_channel(sts[i], 3, EBUR128_LEFT_SURROUND); + ebur128_set_channel(sts[i], 4, EBUR128_RIGHT_SURROUND); + } + + buffer = (double*) malloc(sts[i]->samplerate * sts[i]->channels * sizeof(double)); + while ((nr_frames_read = sf_readf_double(file, buffer, + (sf_count_t) sts[i]->samplerate))) { + ebur128_add_frames_double(sts[i], buffer, (size_t) nr_frames_read); + } + + ebur128_loudness_global(sts[i], &loudness); + fprintf(stderr, "%.2f LUFS, %s\n", loudness, av[i + 1]); + + + free(buffer); + buffer = NULL; + + if (sf_close(file)) { + fprintf(stderr, "Could not close input file!\n"); + } + } + + ebur128_loudness_global_multiple(sts, (size_t) ac - 1, &loudness); + fprintf(stderr, "-----------\n%.2f LUFS\n", loudness); + + /* clean up */ + for (i = 0; i < ac - 1; ++i) { + ebur128_destroy(&sts[i]); + } + free(sts); + + return 0; +} diff --git a/lib/libebur128-1.1.0/test/tests.c b/lib/libebur128-1.1.0/test/tests.c new file mode 100644 index 000000000000..1024077dd7d1 --- /dev/null +++ b/lib/libebur128-1.1.0/test/tests.c @@ -0,0 +1,218 @@ +/* See COPYING file for copyright and license details. */ + +#include +#include +#include +#include + +#include "ebur128.h" + +double test_global_loudness(const char* filename) { + SF_INFO file_info; + SNDFILE* file; + sf_count_t nr_frames_read; + + ebur128_state* st = NULL; + double gated_loudness; + double* buffer; + + memset(&file_info, '\0', sizeof(file_info)); + file = sf_open(filename, SFM_READ, &file_info); + if (!file) { + fprintf(stderr, "Could not open file %s!\n", filename); + return 0.0; + } + st = ebur128_init((size_t) file_info.channels, + (size_t) file_info.samplerate, + EBUR128_MODE_I); + if (file_info.channels == 5) { + ebur128_set_channel(st, 0, EBUR128_LEFT); + ebur128_set_channel(st, 1, EBUR128_RIGHT); + ebur128_set_channel(st, 2, EBUR128_CENTER); + ebur128_set_channel(st, 3, EBUR128_LEFT_SURROUND); + ebur128_set_channel(st, 4, EBUR128_RIGHT_SURROUND); + } + buffer = (double*) malloc(st->samplerate * st->channels * sizeof(double)); + while ((nr_frames_read = sf_readf_double(file, buffer, + (sf_count_t) st->samplerate))) { + ebur128_add_frames_double(st, buffer, (size_t) nr_frames_read); + } + + ebur128_loudness_global(st, &gated_loudness); + + /* clean up */ + ebur128_destroy(&st); + + free(buffer); + buffer = NULL; + if (sf_close(file)) { + fprintf(stderr, "Could not close input file!\n"); + } + return gated_loudness; +} + +double test_loudness_range(const char* filename) { + SF_INFO file_info; + SNDFILE* file; + sf_count_t nr_frames_read; + + ebur128_state* st = NULL; + double loudness_range; + double* buffer; + + memset(&file_info, '\0', sizeof(file_info)); + file = sf_open(filename, SFM_READ, &file_info); + if (!file) { + fprintf(stderr, "Could not open file %s!\n", filename); + return 0.0; + } + st = ebur128_init((size_t) file_info.channels, + (size_t) file_info.samplerate, + EBUR128_MODE_LRA); + if (file_info.channels == 5) { + ebur128_set_channel(st, 0, EBUR128_LEFT); + ebur128_set_channel(st, 1, EBUR128_RIGHT); + ebur128_set_channel(st, 2, EBUR128_CENTER); + ebur128_set_channel(st, 3, EBUR128_LEFT_SURROUND); + ebur128_set_channel(st, 4, EBUR128_RIGHT_SURROUND); + } + buffer = (double*) malloc(st->samplerate * st->channels * sizeof(double)); + while ((nr_frames_read = sf_readf_double(file, buffer, + (sf_count_t) st->samplerate))) { + ebur128_add_frames_double(st, buffer, (size_t) nr_frames_read); + } + + ebur128_loudness_range(st, &loudness_range); + + /* clean up */ + ebur128_destroy(&st); + + free(buffer); + buffer = NULL; + if (sf_close(file)) { + fprintf(stderr, "Could not close input file!\n"); + } + return loudness_range; +} + +double test_true_peak(const char* filename) { + SF_INFO file_info; + SNDFILE* file; + sf_count_t nr_frames_read; + + ebur128_state* st = NULL; + double true_peak; + double* buffer; + + memset(&file_info, '\0', sizeof(file_info)); + file = sf_open(filename, SFM_READ, &file_info); + if (!file) { + fprintf(stderr, "Could not open file %s!\n", filename); + return 0.0; + } + st = ebur128_init((size_t) file_info.channels, + (size_t) file_info.samplerate, + EBUR128_MODE_LRA); + if (file_info.channels == 5) { + ebur128_set_channel(st, 0, EBUR128_LEFT); + ebur128_set_channel(st, 1, EBUR128_RIGHT); + ebur128_set_channel(st, 2, EBUR128_CENTER); + ebur128_set_channel(st, 3, EBUR128_LEFT_SURROUND); + ebur128_set_channel(st, 4, EBUR128_RIGHT_SURROUND); + } + buffer = (double*) malloc(st->samplerate * st->channels * sizeof(double)); + while ((nr_frames_read = sf_readf_double(file, buffer, + (sf_count_t) st->samplerate))) { + ebur128_add_frames_double(st, buffer, (size_t) nr_frames_read); + } + + ebur128_loudness_range(st, &true_peak); + + /* clean up */ + ebur128_destroy(&st); + + free(buffer); + buffer = NULL; + if (sf_close(file)) { + fprintf(stderr, "Could not close input file!\n"); + } + return true_peak; +} + +double gr[] = {-23.0, + -33.0, + -23.0, + -23.0, + -23.0, + -23.0, + -23.0, + -23.0, + -23.0}; +double gre[] = {-2.2953556442089987e+01, + -3.2959860397340044e+01, + -2.2995899818255047e+01, + -2.3035918615414182e+01, + -2.2949997446096436e+01, + -2.3017157781104373e+01, + -2.3017157781104373e+01, + -2.2980242495081757e+01, + -2.3009077718930545e+01}; +double lra[] = {10.0, + 5.0, + 20.0, + 15.0, + 5.0, + 15.0}; +double lrae[] = {1.0001105488329134e+01, + 4.9993734051522178e+00, + 1.9995064067783115e+01, + 1.4999273937723455e+01, + 4.9747585878473721e+00, + 1.4993650849123316e+01}; + + +int main() { + double result; + + fprintf(stderr, "Note: the tests do not have to pass with EXACT_PASSED.\n" + "Passing these tests does not mean that the library is " + "100%% EBU R 128 compliant!\n\n"); + +#define TEST_GLOBAL_LOUDNESS(filename, i) \ + result = test_global_loudness(filename); \ + if (result == result) { \ + printf("%s, %s - %s: %1.16e\n", \ + (result <= gr[i] + 0.1 && result >= gr[i] - 0.1) ? "PASSED" : "FAILED", \ + (result == gre[i]) ? "EXACT_PASSED" : "EXACT_FAILED", \ + filename, result); \ + } + + TEST_GLOBAL_LOUDNESS("seq-3341-1-16bit.wav", 0) + TEST_GLOBAL_LOUDNESS("seq-3341-2-16bit.wav", 1) + TEST_GLOBAL_LOUDNESS("seq-3341-3-16bit-v02.wav", 2) + TEST_GLOBAL_LOUDNESS("seq-3341-4-16bit-v02.wav", 3) + TEST_GLOBAL_LOUDNESS("seq-3341-5-16bit-v02.wav", 4) + TEST_GLOBAL_LOUDNESS("seq-3341-6-5channels-16bit.wav", 5) + TEST_GLOBAL_LOUDNESS("seq-3341-6-6channels-WAVEEX-16bit.wav", 6) + TEST_GLOBAL_LOUDNESS("seq-3341-7_seq-3342-5-24bit.wav", 7) + TEST_GLOBAL_LOUDNESS("seq-3341-2011-8_seq-3342-6-24bit-v02.wav", 8) + + +#define TEST_LRA(filename, i) \ + result = test_loudness_range(filename); \ + if (result == result) { \ + printf("%s, %s - %s: %1.16e\n", \ + (result <= lra[i] + 1 && result >= lra[i] - 1) ? "PASSED" : "FAILED", \ + (result == lrae[i]) ? "EXACT_PASSED" : "EXACT_FAILED", \ + filename, result); \ + } + + TEST_LRA("seq-3342-1-16bit.wav", 0) + TEST_LRA("seq-3342-2-16bit.wav", 1) + TEST_LRA("seq-3342-3-16bit.wav", 2) + TEST_LRA("seq-3342-4-16bit.wav", 3) + TEST_LRA("seq-3341-7_seq-3342-5-24bit.wav", 4) + TEST_LRA("seq-3341-2011-8_seq-3342-6-24bit-v02.wav", 5) + + return 0; +} diff --git a/lib/portaudio/LICENSE.txt b/lib/portaudio/LICENSE.txt new file mode 100644 index 000000000000..e0ac4e8a0c01 --- /dev/null +++ b/lib/portaudio/LICENSE.txt @@ -0,0 +1,81 @@ +Portable header file to contain: +>>>>> +/* + * PortAudio Portable Real-Time Audio Library + * PortAudio API Header File + * Latest version available at: http://www.portaudio.com + * + * Copyright (c) 1999-2006 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ +<<<<< + + +Implementation files to contain: +>>>>> +/* + * PortAudio Portable Real-Time Audio Library + * Latest version at: http://www.portaudio.com + * Implementation + * Copyright (c) 1999-2000 + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the + * license above. + */ +<<<<< \ No newline at end of file diff --git a/src/util/pa_memorybarrier.h b/lib/portaudio/pa_memorybarrier.h similarity index 100% rename from src/util/pa_memorybarrier.h rename to lib/portaudio/pa_memorybarrier.h diff --git a/src/util/pa_ringbuffer.c b/lib/portaudio/pa_ringbuffer.c similarity index 98% rename from src/util/pa_ringbuffer.c rename to lib/portaudio/pa_ringbuffer.c index ca6e1e47efea..93b3e430a510 100644 --- a/src/util/pa_ringbuffer.c +++ b/lib/portaudio/pa_ringbuffer.c @@ -1,5 +1,5 @@ /* - * $Id: pa_ringbuffer.c 1738 2011-08-18 11:47:28Z rossb $ + * $Id$ * Portable Audio I/O Library * Ring Buffer utility. * @@ -7,7 +7,7 @@ * modified for SMP safety on Mac OS X by Bjorn Roche * modified for SMP safety on Linux by Leland Lucius * also, allowed for const where possible - * modified for multiple-byte-sized data elements by Sven Fischer + * modified for multiple-byte-sized data elements by Sven Fischer * * Note that this is safe only for a single-thread reader and a * single-thread writer. @@ -37,13 +37,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that - * they can be incorporated into the canonical version. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -55,10 +55,9 @@ #include #include #include +#include "pa_ringbuffer.h" #include - -#include "util/pa_memorybarrier.h" -#include "util/pa_ringbuffer.h" +#include "pa_memorybarrier.h" /*************************************************************************** * Initialize FIFO. @@ -139,7 +138,7 @@ ring_buffer_size_t PaUtil_GetRingBufferWriteRegions( PaUtilRingBuffer *rbuf, rin */ ring_buffer_size_t PaUtil_AdvanceRingBufferWriteIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) { - /* ensure that previous writes are seen before we update the write index + /* ensure that previous writes are seen before we update the write index (write after write) */ PaUtil_WriteMemoryBarrier(); @@ -177,7 +176,7 @@ ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring *dataPtr2 = NULL; *sizePtr2 = 0; } - + if( available ) PaUtil_ReadMemoryBarrier(); /* (read-after-read) => read barrier */ @@ -187,7 +186,7 @@ ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring */ ring_buffer_size_t PaUtil_AdvanceRingBufferReadIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) { - /* ensure that previous reads (copies out of the ring buffer) are always completed before updating (writing) the read index. + /* ensure that previous reads (copies out of the ring buffer) are always completed before updating (writing) the read index. (write-after-read) => full barrier */ PaUtil_FullMemoryBarrier(); diff --git a/src/util/pa_ringbuffer.h b/lib/portaudio/pa_ringbuffer.h similarity index 97% rename from src/util/pa_ringbuffer.h rename to lib/portaudio/pa_ringbuffer.h index 51577f070768..9edba0dd6579 100644 --- a/src/util/pa_ringbuffer.h +++ b/lib/portaudio/pa_ringbuffer.h @@ -1,7 +1,7 @@ #ifndef PA_RINGBUFFER_H #define PA_RINGBUFFER_H /* - * $Id: pa_ringbuffer.h 1734 2011-08-18 11:19:36Z rossb $ + * $Id$ * Portable Audio I/O Library * Ring Buffer utility. * @@ -65,6 +65,9 @@ The memory area used to store the buffer elements must be allocated by the client prior to calling PaUtil_InitializeRingBuffer() and must outlive the use of the ring buffer. + + @note The ring buffer functions are not normally exposed in the PortAudio libraries. + If you want to call them then you will need to add pa_ringbuffer.c to your application source code. */ #if defined(__APPLE__) diff --git a/lib/reverb/Reverb.cc b/lib/reverb/Reverb.cc index 787e80a5af11..99c04d867c69 100644 --- a/lib/reverb/Reverb.cc +++ b/lib/reverb/Reverb.cc @@ -1,10 +1,7 @@ /* Reverb.cc - Copyright 2002-13 Tim Goetze - - Port from LADSPA to Mixxx 2014 by Owen Williams , - Mostly just deleting excess code. + Copyright 2002-14 Tim Goetze http://quitte.de/dsp/ @@ -45,7 +42,144 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA or point your web browser to http://www.gnu.org. */ + +#include "basics.h" + #include "Reverb.h" +//#include "Descriptor.h" + +#if 0 +int JVRev_length[9] = { 4199, 4999, 5399, 5801, 1051, 337, 113, 573, 487 }; + +void +JVRev::init() +{ + double s = fs/44100.; + + for (int i = 0; i < 9; ++i) + { + int v = (int) (s * JVRev_length[i]); + v |= 1; + while (!DSP::isprime(v)) + v += 2; + length[i] = v; + } + + for (int i = 0; i < 4; ++i) + comb[i].init (length[i]); + + for (int i = 0; i < 3; ++i) + allpass[i].init (length[i+4]); + + left.init (length[7]); + right.init (length[8]); + + /* such a simple number, yet I couldn't find a better one. */ + apc = .7; +} + +void +JVRev::set_t60 (sample_t t) +{ + t60 = t; + + t = max(.00001, t); + t = -3/(t*fs); + + for (int i=0; i<4; ++i) + comb[i].c = pow (10, t*length[i]); +} + +void +JVRev::activate() +{ + bandwidth.reset(); + tone.reset(); + + for (int i=0; i<3; ++i) + allpass[i].reset(); + + for (int i=0; i<4; ++i) + comb[i].reset(); + + left.reset(); + right.reset(); + + set_t60(getport(1)); + tone.set_f(1800*over_fs); +} + +void +JVRev::cycle (uint frames) +{ + sample_t bw = .005 + .994*getport(0); + bandwidth.set(exp(-M_PI*(1. - bw))); + + if (t60 != *ports[1]) + set_t60(getport(1)); + + double wet = getport(2); + wet = .38*wet*wet; + double dry = 1 - wet; + + sample_t * s = ports[3]; + + sample_t * dl = ports[4]; + sample_t * dr = ports[5]; + + for (uint i = 0; i < frames; ++i) + { + sample_t x = s[i], a = x + normal; + + a = bandwidth.process(a); + x *= dry; + + /* diffusors */ + a = allpass[0].process(a,-apc); + a = allpass[1].process(a,-apc); + a = allpass[2].process(a,-apc); + + /* tank */ + sample_t t = 0; + a -= normal; + + for (int j=0; j<4; ++j) + t += comb[j].process(a); + + t = tone.process(t); + + dl[i] = x + wet*left.putget(t); + dr[i] = x + wet*right.putget(t); + } +} + +/* //////////////////////////////////////////////////////////////////////// */ + +PortInfo +JVRev::port_info [] = +{ + { "bandwidth", INPUT | CONTROL, {DEFAULT_MID, 0, 1} }, + { "t60 (s)", INPUT | CONTROL | GROUP, {DEFAULT_MID, 0, 5.6} }, + { "blend", INPUT | CONTROL, {DEFAULT_LOW, 0, 1} }, + + { "in", INPUT | AUDIO }, + { "out.l", OUTPUT | AUDIO }, + { "out.r", OUTPUT | AUDIO } +}; + +template <> void +Descriptor::setup() +{ + Label = "JVRev"; + + Name = CAPS "JVRev - Stanford-style reverb from STK"; + Maker = "Tim Goetze "; + Copyright = "2004-12"; + + /* fill port info and vtable */ + autogen(); +} +#endif /* //////////////////////////////////////////////////////////////////////// */ @@ -53,8 +187,6 @@ void PlateStub::init() { f_lfo = -1; - // TODO(owilliams): use actual sample rate. - fs = 44100; # define L(i) ((int) (l[i] * fs)) static float l[] = { @@ -159,3 +291,170 @@ PlateStub::process (sample_t x, sample_t decay, sample_t * _xl, sample_t * _xr) *_xl = xl; *_xr = xr; } + +/* //////////////////////////////////////////////////////////////////////// */ +#if 0 +void +Plate::cycle (uint frames) +{ + sample_t bw = .005 + .994*getport(0); + input.bandwidth.set (exp (-M_PI * (1. - bw))); + + sample_t decay = .749*getport(1); + + double damp = exp (-M_PI * (.0005+.9995*getport(2))); + tank.damping[0].set (damp); + tank.damping[1].set (damp); + + sample_t blend = getport(3); + blend = pow (blend, 1.6); /* linear is not a good choice for this pot */ + sample_t dry = 1 - blend; + + sample_t * s = ports[4]; + + sample_t * dl = ports[5]; + sample_t * dr = ports[6]; + + /* modulated lattice interpolation needs float truncation */ + DSP::FPTruncateMode _truncate; + + for (uint i = 0; i < frames; ++i) + { + normal = -normal; + sample_t x = s[i] + normal; + + sample_t xl, xr; + + PlateStub::process (x, decay, &xl, &xr); + + x = dry * s[i]; + + dl[i] = x + blend*xl; + dr[i] = x + blend*xr; + } +} + +/* //////////////////////////////////////////////////////////////////////// */ + +PortInfo +Plate::port_info [] = +{ + {"bandwidth", INPUT | CONTROL, {DEFAULT_HIGH, 0, 1} /* .9995 */ }, + {"tail", INPUT | CONTROL | GROUP, {DEFAULT_MID, 0, 1} /* .5 */ }, + {"damping", INPUT | CONTROL, {DEFAULT_LOW, 0, 1} /* .0005 */ }, + {"blend", INPUT | CONTROL | GROUP, {DEFAULT_LOW, 0, 1} }, + + {"in", INPUT | AUDIO}, + {"out.l", OUTPUT | AUDIO}, + {"out.r", OUTPUT | AUDIO} +}; + +template <> void +Descriptor::setup() +{ + Label = "Plate"; + + Name = CAPS "Plate - Versatile plate reverb"; + Maker = "Tim Goetze "; + Copyright = "2004-11"; + + /* fill port info and vtable */ + autogen(); +} + +/* //////////////////////////////////////////////////////////////////////// */ + +void +PlateX2::cycle (uint frames) +{ + sample_t bw = .005 + .994*getport(0); + input.bandwidth.set (exp (-M_PI * (1. - bw))); + + sample_t decay = .749*getport(1); + + double damp = exp (-M_PI * (.0005+.9995*getport(2))); + tank.damping[0].set (damp); + tank.damping[1].set (damp); + + sample_t blend = getport(3); + blend = pow (blend, 1.53); + sample_t dry = 1 - blend; + + sample_t * sl = ports[4]; + sample_t * sr = ports[5]; + sample_t * dl = ports[6]; + sample_t * dr = ports[7]; + + /* the modulated lattices interpolate, which needs truncated float */ + DSP::FPTruncateMode _truncate; + + for (uint i = 0; i < frames; ++i) + { + normal = -normal; + sample_t x = (sl[i] + sr[i] + normal) * .5; + + sample_t xl, xr; + PlateStub::process (x, decay, &xl, &xr); + + dl[i] = blend*xl + dry*sl[i]; + dr[i] = blend*xr + dry*sr[i]; + } +} + +/* //////////////////////////////////////////////////////////////////////// */ +PortInfo +PlateX2::port_info [] = +{ + {"bandwidth", INPUT | CONTROL, {DEFAULT_HIGH, 0, 1} /* .9995 */ }, + {"tail", INPUT | CONTROL | GROUP, {DEFAULT_MID, 0, 1} /* .5 */ }, + {"damping", INPUT | CONTROL, {DEFAULT_LOW, 0, 1} /* .0005 */ }, + {"blend", INPUT | CONTROL | GROUP, {DEFAULT_LOW, 0, 1} }, + + {"in.l", INPUT | AUDIO}, + {"in.r", INPUT | AUDIO}, + {"out.l", OUTPUT | AUDIO}, + {"out.r", OUTPUT | AUDIO} +}; + +template <> void +Descriptor::setup() +{ + Label = "PlateX2"; + + Name = CAPS "PlateX2 - Versatile plate reverb, stereo inputs"; + Maker = "Tim Goetze "; + Copyright = "2004-11"; + + /* fill port info and vtable */ + autogen(); +} +#endif + + + +// (timrae) we have our left / right samples interleaved in the same array, so use slightly modified version of PlateX2::cycle +void MixxxPlateX2::processBuffer(const sample_t* in, sample_t* out, const uint frames, const sample_t bandwidthParam, + const sample_t decayParam, const sample_t dampingParam, const sample_t blendParam) { + // set bandwidth + input.bandwidth.set(exp(-M_PI * (1. - (.005 + .994*bandwidthParam)))); + // set decay + sample_t decay = .749*decayParam; + // set damping + double damp = exp(-M_PI * (.0005+.9995*dampingParam)); + tank.damping[0].set(damp); + tank.damping[1].set(damp); + // set blend + sample_t blend = pow(blendParam, 1.53); + + // the modulated lattices interpolate, which needs truncated float + DSP::FPTruncateMode _truncate; + + // loop through the buffer, processing each sample + for (uint i = 0; i + 1 < frames; i += 2) { + sample_t mono_sample = blend * (in[i] + in[i + 1]) / 2; + sample_t xl, xr; + PlateStub::process(mono_sample, decay, &xl, &xr); + out[i] = xl + in[i]; + out[i + 1] = xr + in[i + 1]; + } +} diff --git a/lib/reverb/Reverb.h b/lib/reverb/Reverb.h index 5a341e683516..ae9591905f44 100644 --- a/lib/reverb/Reverb.h +++ b/lib/reverb/Reverb.h @@ -44,14 +44,14 @@ 02111-1307, USA or point your web browser to http://www.gnu.org. */ -#ifndef _REVERB_H_ -#define _REVERB_H_ +#ifndef REVERB_H +#define REVERB_H #include #include "basics.h" #include "dsp/Delay.h" -#include "dsp/OnePole.h" +#include "dsp/IIR1.h" #include "dsp/Sine.h" #include "dsp/util.h" @@ -60,16 +60,59 @@ class Lattice : public DSP::Delay { public: - inline sample_t - process (sample_t x, double d) + sample_t process (sample_t x, double d) { sample_t y = get(); - x -= d * y; - put (x); - return d * x + y; + x -= d*y; + put(x); + return d*x + y; } }; +/* helper for JVRev */ +#if 0 +class JVComb +: public DSP::Delay +{ + public: + float c; + + sample_t process (sample_t x) + { + x += c*get(); + put(x); + return x; + } +}; + +class JVRev +: public Plugin +{ + public: + DSP::LP1 bandwidth, tone; + + sample_t t60; + + int length[9]; + + Lattice allpass[3]; + JVComb comb[4]; + + DSP::Delay left, right; + + double apc; + + void cycle (uint frames); + + void set_t60 (sample_t t); + + public: + static PortInfo port_info []; + + void init(); + void activate(); +}; +#endif /* /////////////////////////////////////////////////////////////////////// */ class ModLattice @@ -103,14 +146,14 @@ class ModLattice }; class PlateStub + { public: sample_t f_lfo; - sample_t indiff1, indiff2, dediff1, dediff2; struct { - DSP::OnePoleLP bandwidth; + DSP::LP1 bandwidth; Lattice lattice[4]; } input; @@ -118,7 +161,7 @@ class PlateStub ModLattice mlattice[2]; Lattice lattice[2]; DSP::Delay delay[4]; - DSP::OnePoleLP damping[2]; + DSP::LP1 damping[2]; int taps[12]; } tank; @@ -145,30 +188,49 @@ class PlateStub tank.mlattice[1].lfo.set_f (1.2, fs, .5 * M_PI); } - // Process a single mono sample, returning a left and right reverbed - // sample. void process (sample_t x, sample_t decay, - sample_t * xl, sample_t * xr); + sample_t * xl, sample_t * xr); + protected: + float fs = 44100; // (timrae) define sample rate +}; + +/* /////////////////////////////////////////////////////////////////////// */ +/// (timrae) Disable the default classes as we use our own interface for Mixxx +#if 0 +class Plate +: public PlateStub +{ + public: + void cycle (uint frames); - private: - float fs; // sameple rate; + public: + static PortInfo port_info []; +}; + +/* /////////////////////////////////////////////////////////////////////// */ + +class PlateX2 +: public PlateStub +{ + public: + void cycle (uint frames); + + public: + static PortInfo port_info []; }; +#endif +/// (timrae) Define our own interface instead of using the original LADSPA plugin interface class MixxxPlateX2 : public PlateStub { - public: - void setBandwidth(double bandwidth) { - input.bandwidth.set(exp(-M_PI * (1. - bandwidth))); - } - - void setDecay(double decay_control) { - double damp = exp(-M_PI * decay_control); - tank.damping[0].set(damp); - tank.damping[1].set(damp); - } - - void process(sample_t x, sample_t decay, sample_t * xl, sample_t * xr) { - PlateStub::process(x, decay, xl, xr); - } + public: + void processBuffer(const sample_t* in, sample_t* out, const uint frames, const sample_t bandwidthParam, + const sample_t decayParam, const sample_t dampingParam, const sample_t blendParam); + + void init(float sampleRate) { + fs = sampleRate; + PlateStub::init(); + PlateStub::activate(); + } }; -#endif /* _REVERB_H_ */ +#endif /* REVERB_H */ diff --git a/lib/reverb/basics.h b/lib/reverb/basics.h index 36275ae7963d..8fe92b68faf7 100644 --- a/lib/reverb/basics.h +++ b/lib/reverb/basics.h @@ -29,8 +29,8 @@ 02111-1307, USA or point your web browser to http://www.gnu.org. */ -#ifndef _BASICS_H_ -#define _BASICS_H_ +#ifndef BASICS_H +#define BASICS_H // NOTE(rryan): 3/2014 Added for MSVC support. (missing M_PI) #define _USE_MATH_DEFINES @@ -59,9 +59,9 @@ typedef quint32 uint32; typedef qint64 int64; typedef quint64 uint64; -#define MIN_GAIN .000001 /* -120 dB */ +#define MIN_GAIN 1e-6 /* -120 dB */ /* smallest non-denormal 32 bit IEEE float is 1.18e-38 */ -#define NOISE_FLOOR .00000000000005 /* -266 dB */ +#define NOISE_FLOOR 1e-20 /* -400 dB */ /* //////////////////////////////////////////////////////////////////////// */ @@ -71,29 +71,9 @@ typedef unsigned long ulong; /* prototype that takes a sample and yields a sample */ typedef CSAMPLE (*clip_func_t) (CSAMPLE); -/* flavours for sample store functions run() and run_adding() */ -typedef void (*yield_func_t) (CSAMPLE *, uint, CSAMPLE, CSAMPLE); - -inline void -adding_func (CSAMPLE * s, uint i, CSAMPLE x, CSAMPLE gain) -{ - s[i] += gain * x; -} - #ifndef max - -template -X min (X x, Y y) -{ - return x < y ? x : (X) y; -} - -template -X max (X x, Y y) -{ - return x > y ? x : (X) y; -} - +template X min (X x, Y y) { return x < (X)y ? x : (X)y; } +template X max (X x, Y y) { return x > (X)y ? x : (X)y; } #endif /* ! max */ template @@ -104,11 +84,8 @@ T clamp (T value, T lower, T upper) return value; } -static inline float -frandom() -{ - return (float) rand() / (float) RAND_MAX; -} +// (timrae) change random() to rand() for MSVC support +static inline float frandom() { return (float) rand() / (float) RAND_MAX; } /* NB: also true if 0 */ inline bool @@ -144,18 +121,9 @@ next_power_of_2 (uint n) return ++n; } -inline double -db2lin (double db) -{ - return pow(10, db*.05); -} - -inline double -lin2db (double lin) -{ - return 20*log10(lin); -} +inline double db2lin (double db) { return pow(10, .05*db); } +inline double lin2db (double lin) { return 20*log10(lin); } /* //////////////////////////////////////////////////////////////////////// */ -#endif /* _BASICS_H_ */ +#endif /* BASICS_H */ diff --git a/lib/reverb/dsp/OnePole.h b/lib/reverb/dsp/IIR1.h similarity index 79% rename from lib/reverb/dsp/OnePole.h rename to lib/reverb/dsp/IIR1.h index 95262f9dc8f5..0d945b3ffc67 100644 --- a/lib/reverb/dsp/OnePole.h +++ b/lib/reverb/dsp/IIR1.h @@ -1,11 +1,11 @@ /* dsp/OnePole.h - - Copyright 2003-13 Tim Goetze - + + Copyright 2003-14 Tim Goetze + http://quitte.de/dsp/ - one pole (or one zero, or one zero, one pole) hi- and lo-pass filters. + first-order IIR hi- and lo-pass filters. */ /* @@ -25,63 +25,59 @@ 02111-1307, USA or point your web browser to http://www.gnu.org. */ -#ifndef _ONE_POLE_H_ -#define _ONE_POLE_H_ +#ifndef IIR1_H +#define IIR1_H namespace DSP { - + template -class OnePoleLP +class LP1 { public: T a0, b1, y1; - OnePoleLP (double d = 1.) + LP1 (double d = 1.) { set (d); y1 = 0.; } - inline void reset() + sample_t last() {return y1;} + inline void reset() { y1 = 0.; } + + inline void decay (T d) { - y1 = 0.; + a0 *= d; + b1 = 1. - a0; } inline void set_f (T fc) { set (1 - exp(-2*M_PI*fc)); } - inline void set (T d) { a0 = d; b1 = 1 - d; } - inline T process (T x) - { - return y1 = a0*x + b1*y1; - } - - inline void decay (T d) - { - a0 *= d; - b1 = 1. - a0; - } + inline T process (T x) { return y1 = a0*x + b1*y1; } }; template -class OnePoleHP +class HP1 { public: T a0, a1, b1, x1, y1; - OnePoleHP (T d = 1.) + HP1 (T d = 1.) { set (d); - x1 = y1 = 0.; + reset(); } + sample_t last() {return y1;} + void set_f (T f) { set (exp (-2*M_PI*f)); @@ -115,4 +111,4 @@ class OnePoleHP } /* namespace DSP */ -#endif /* _ONE_POLE_H_ */ +#endif /* IIR1 */ diff --git a/lib/reverb/dsp/Sine.h b/lib/reverb/dsp/Sine.h index 86c3a47c3bef..93ef2cdf0066 100644 --- a/lib/reverb/dsp/Sine.h +++ b/lib/reverb/dsp/Sine.h @@ -1,11 +1,11 @@ /* dsp/Sine.h - - Copyright 2003-13 Tim Goetze - + + Copyright 2003-14 Tim Goetze + http://quitte.de/dsp/ - Direct form I recursive sin() generator. Utilising doubles + Direct form I recursive sin() generator. Utilising doubles for stability. */ @@ -26,11 +26,11 @@ 02111-1307, USA or point your web browser to http://www.gnu.org. */ -#ifndef _DSP_SINE_H_ -#define _DSP_SINE_H_ +#ifndef DSP_SINE_H +#define DSP_SINE_H namespace DSP { - + class Sine { public: @@ -40,7 +40,7 @@ class Sine public: Sine() - { + { b = 0; y[0] = y[1] = 0; z = 0; @@ -63,16 +63,16 @@ class Sine inline void set_f (double w, double phase) { - b = 2 * cos (w); + b = 2*cos(w); y[0] = sin (phase - w); - y[1] = sin (phase - w * 2); + y[1] = sin (phase - 2*w); z = 0; } /* advance and return 1 sample */ inline double get() { - register double s = b * y[z]; + register double s = b*y[z]; z ^= 1; s -= y[z]; return y[z] = s; @@ -80,14 +80,11 @@ class Sine double get_phase() { - double x0 = y[z], x1 = b * y[z] - y[z^1]; - double phi = asin (x0); - - /* slope is falling, we're into the 2nd half. */ - if (x1 < x0) - return M_PI - phi; - - return phi; + double x0 = y[z], x1 = b*y[z] - y[z^1]; + double phi = asin(x0); + + /* slope is falling: into the 2nd half. */ + return x1 < x0 ? M_PI - phi : phi; } }; @@ -104,7 +101,7 @@ class DampedSine inline double get() { - register double s = b * y[z]; + register double s = b * y[z]; z ^= 1; s -= d * y[z]; return y[z] = d * s; @@ -113,4 +110,4 @@ class DampedSine } /* namespace DSP */ -#endif /* _DSP_SINE_H_ */ +#endif /* DSP_SINE_H */ diff --git a/lib/soundtouch-1.8.0/AAFilter.cpp b/lib/soundtouch-1.9.2/AAFilter.cpp similarity index 95% rename from lib/soundtouch-1.8.0/AAFilter.cpp rename to lib/soundtouch-1.9.2/AAFilter.cpp index a942859a370a..c69f356f6869 100644 --- a/lib/soundtouch-1.8.0/AAFilter.cpp +++ b/lib/soundtouch-1.9.2/AAFilter.cpp @@ -12,7 +12,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-05 16:40:22 -0500 (Sun, 05 Jan 2014) $ +// Last changed : $Date: 2014-01-05 23:40:22 +0200 (Sun, 05 Jan 2014) $ // File revision : $Revision: 4 $ // // $Id: AAFilter.cpp 177 2014-01-05 21:40:22Z oparviai $ diff --git a/lib/soundtouch-1.8.0/AAFilter.h b/lib/soundtouch-1.9.2/AAFilter.h similarity index 95% rename from lib/soundtouch-1.8.0/AAFilter.h rename to lib/soundtouch-1.9.2/AAFilter.h index 72f5b8a96870..33e96948ec42 100644 --- a/lib/soundtouch-1.8.0/AAFilter.h +++ b/lib/soundtouch-1.9.2/AAFilter.h @@ -13,7 +13,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-07 14:41:23 -0500 (Tue, 07 Jan 2014) $ +// Last changed : $Date: 2014-01-07 21:41:23 +0200 (Tue, 07 Jan 2014) $ // File revision : $Revision: 4 $ // // $Id: AAFilter.h 187 2014-01-07 19:41:23Z oparviai $ diff --git a/lib/soundtouch-1.8.0/BPMDetect.cpp b/lib/soundtouch-1.9.2/BPMDetect.cpp similarity index 95% rename from lib/soundtouch-1.8.0/BPMDetect.cpp rename to lib/soundtouch-1.9.2/BPMDetect.cpp index 0cee95716c3f..39dae837610b 100644 --- a/lib/soundtouch-1.8.0/BPMDetect.cpp +++ b/lib/soundtouch-1.9.2/BPMDetect.cpp @@ -26,10 +26,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2012-08-30 15:45:25 -0400 (Thu, 30 Aug 2012) $ +// Last changed : $Date: 2015-02-21 23:24:29 +0200 (Sat, 21 Feb 2015) $ // File revision : $Revision: 4 $ // -// $Id: BPMDetect.cpp 149 2012-08-30 19:45:25Z oparviai $ +// $Id: BPMDetect.cpp 202 2015-02-21 21:24:29Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -226,6 +226,7 @@ void BPMDetect::updateXCorr(int process_samples) assert(buffer->numSamples() >= (uint)(process_samples + windowLen)); pBuffer = buffer->ptrBegin(); + #pragma omp parallel for for (offs = windowStart; offs < windowLen; offs ++) { LONG_SAMPLETYPE sum; diff --git a/lib/soundtouch-1.8.0/BPMDetect.h b/lib/soundtouch-1.9.2/BPMDetect.h similarity index 96% rename from lib/soundtouch-1.8.0/BPMDetect.h rename to lib/soundtouch-1.9.2/BPMDetect.h index f21890adf9ce..69d98143a7f7 100644 --- a/lib/soundtouch-1.8.0/BPMDetect.h +++ b/lib/soundtouch-1.9.2/BPMDetect.h @@ -26,7 +26,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2012-08-30 15:53:44 -0400 (Thu, 30 Aug 2012) $ +// Last changed : $Date: 2012-08-30 22:53:44 +0300 (Thu, 30 Aug 2012) $ // File revision : $Revision: 4 $ // // $Id: BPMDetect.h 150 2012-08-30 19:53:44Z oparviai $ diff --git a/lib/soundtouch-1.8.0/COPYING.TXT b/lib/soundtouch-1.9.2/COPYING.TXT similarity index 100% rename from lib/soundtouch-1.8.0/COPYING.TXT rename to lib/soundtouch-1.9.2/COPYING.TXT diff --git a/lib/soundtouch-1.8.0/FIFOSampleBuffer.cpp b/lib/soundtouch-1.9.2/FIFOSampleBuffer.cpp similarity index 96% rename from lib/soundtouch-1.8.0/FIFOSampleBuffer.cpp rename to lib/soundtouch-1.9.2/FIFOSampleBuffer.cpp index a8bf164d5324..5f5ec4b7db0d 100644 --- a/lib/soundtouch-1.8.0/FIFOSampleBuffer.cpp +++ b/lib/soundtouch-1.9.2/FIFOSampleBuffer.cpp @@ -15,7 +15,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2012-11-08 13:53:01 -0500 (Thu, 08 Nov 2012) $ +// Last changed : $Date: 2012-11-08 20:53:01 +0200 (Thu, 08 Nov 2012) $ // File revision : $Revision: 4 $ // // $Id: FIFOSampleBuffer.cpp 160 2012-11-08 18:53:01Z oparviai $ diff --git a/lib/soundtouch-1.8.0/FIFOSampleBuffer.h b/lib/soundtouch-1.9.2/FIFOSampleBuffer.h similarity index 96% rename from lib/soundtouch-1.8.0/FIFOSampleBuffer.h rename to lib/soundtouch-1.9.2/FIFOSampleBuffer.h index ee4d66db39a8..6f33df3daaa8 100644 --- a/lib/soundtouch-1.8.0/FIFOSampleBuffer.h +++ b/lib/soundtouch-1.9.2/FIFOSampleBuffer.h @@ -15,7 +15,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-05 16:40:22 -0500 (Sun, 05 Jan 2014) $ +// Last changed : $Date: 2014-01-05 23:40:22 +0200 (Sun, 05 Jan 2014) $ // File revision : $Revision: 4 $ // // $Id: FIFOSampleBuffer.h 177 2014-01-05 21:40:22Z oparviai $ diff --git a/lib/soundtouch-1.8.0/FIFOSamplePipe.h b/lib/soundtouch-1.9.2/FIFOSamplePipe.h similarity index 96% rename from lib/soundtouch-1.8.0/FIFOSamplePipe.h rename to lib/soundtouch-1.9.2/FIFOSamplePipe.h index 22b3d7fe5424..6e3105970ba2 100644 --- a/lib/soundtouch-1.8.0/FIFOSamplePipe.h +++ b/lib/soundtouch-1.9.2/FIFOSamplePipe.h @@ -17,7 +17,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2012-06-13 15:29:53 -0400 (Wed, 13 Jun 2012) $ +// Last changed : $Date: 2012-06-13 22:29:53 +0300 (Wed, 13 Jun 2012) $ // File revision : $Revision: 4 $ // // $Id: FIFOSamplePipe.h 143 2012-06-13 19:29:53Z oparviai $ diff --git a/lib/soundtouch-1.8.0/FIRFilter.cpp b/lib/soundtouch-1.9.2/FIRFilter.cpp similarity index 86% rename from lib/soundtouch-1.8.0/FIRFilter.cpp rename to lib/soundtouch-1.9.2/FIRFilter.cpp index 0a7e07a9e955..e56969b0537c 100644 --- a/lib/soundtouch-1.8.0/FIRFilter.cpp +++ b/lib/soundtouch-1.9.2/FIRFilter.cpp @@ -11,10 +11,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-10-08 11:26:57 -0400 (Wed, 08 Oct 2014) $ +// Last changed : $Date: 2015-02-21 23:24:29 +0200 (Sat, 21 Feb 2015) $ // File revision : $Revision: 4 $ // -// $Id: FIRFilter.cpp 201 2014-10-08 15:26:57Z oparviai $ +// $Id: FIRFilter.cpp 202 2015-02-21 21:24:29Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -61,22 +61,18 @@ FIRFilter::FIRFilter() length = 0; lengthDiv8 = 0; filterCoeffs = NULL; - sum = NULL; - sumsize = 0; } FIRFilter::~FIRFilter() { delete[] filterCoeffs; - delete[] sum; } // Usual C-version of the filter routine for stereo sound uint FIRFilter::evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const { - uint i, j, end; - LONG_SAMPLETYPE suml, sumr; + int j, end; #ifdef SOUNDTOUCH_FLOAT_SAMPLES // when using floating point samples, use a scaler instead of a divider // because division is much slower operation than multiplying. @@ -90,9 +86,12 @@ uint FIRFilter::evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, ui end = 2 * (numSamples - length); + #pragma omp parallel for for (j = 0; j < end; j += 2) { const SAMPLETYPE *ptr; + LONG_SAMPLETYPE suml, sumr; + uint i; suml = sumr = 0; ptr = src + j; @@ -133,28 +132,31 @@ uint FIRFilter::evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, ui // Usual C-version of the filter routine for mono sound uint FIRFilter::evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const { - uint i, j, end; - LONG_SAMPLETYPE sum; + int j, end; #ifdef SOUNDTOUCH_FLOAT_SAMPLES // when using floating point samples, use a scaler instead of a divider // because division is much slower operation than multiplying. double dScaler = 1.0 / (double)resultDivider; #endif - assert(length != 0); end = numSamples - length; + #pragma omp parallel for for (j = 0; j < end; j ++) { + const SAMPLETYPE *pSrc = src + j; + LONG_SAMPLETYPE sum; + uint i; + sum = 0; for (i = 0; i < length; i += 4) { // loop is unrolled by factor of 4 here for efficiency - sum += src[i + 0] * filterCoeffs[i + 0] + - src[i + 1] * filterCoeffs[i + 1] + - src[i + 2] * filterCoeffs[i + 2] + - src[i + 3] * filterCoeffs[i + 3]; + sum += pSrc[i + 0] * filterCoeffs[i + 0] + + pSrc[i + 1] * filterCoeffs[i + 1] + + pSrc[i + 2] * filterCoeffs[i + 2] + + pSrc[i + 3] * filterCoeffs[i + 3]; } #ifdef SOUNDTOUCH_INTEGER_SAMPLES sum >>= resultDivFactor; @@ -164,7 +166,6 @@ uint FIRFilter::evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint sum *= dScaler; #endif // SOUNDTOUCH_INTEGER_SAMPLES dest[j] = (SAMPLETYPE)sum; - src ++; } return end; } @@ -172,15 +173,7 @@ uint FIRFilter::evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) { - uint i, j, end, c; - - if (sumsize < numChannels) - { - // allocate large enough array for keeping sums - sumsize = numChannels; - delete[] sum; - sum = new LONG_SAMPLETYPE[numChannels]; - } + int j, end; #ifdef SOUNDTOUCH_FLOAT_SAMPLES // when using floating point samples, use a scaler instead of a divider @@ -192,17 +185,21 @@ uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uin assert(src != NULL); assert(dest != NULL); assert(filterCoeffs != NULL); + assert(numChannels < 16); end = numChannels * (numSamples - length); - for (c = 0; c < numChannels; c ++) - { - sum[c] = 0; - } - + #pragma omp parallel for for (j = 0; j < end; j += numChannels) { const SAMPLETYPE *ptr; + LONG_SAMPLETYPE sums[16]; + uint c, i; + + for (c = 0; c < numChannels; c ++) + { + sums[c] = 0; + } ptr = src + j; @@ -211,7 +208,7 @@ uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uin SAMPLETYPE coef=filterCoeffs[i]; for (c = 0; c < numChannels; c ++) { - sum[c] += ptr[0] * coef; + sums[c] += ptr[0] * coef; ptr ++; } } @@ -219,13 +216,11 @@ uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uin for (c = 0; c < numChannels; c ++) { #ifdef SOUNDTOUCH_INTEGER_SAMPLES - sum[c] >>= resultDivFactor; + sums[c] >>= resultDivFactor; #else - sum[c] *= dScaler; + sums[c] *= dScaler; #endif // SOUNDTOUCH_INTEGER_SAMPLES - *dest = (SAMPLETYPE)sum[c]; - dest++; - sum[c] = 0; + dest[j+c] = (SAMPLETYPE)sums[c]; } } return numSamples - length; diff --git a/lib/soundtouch-1.8.0/FIRFilter.h b/lib/soundtouch-1.9.2/FIRFilter.h similarity index 92% rename from lib/soundtouch-1.8.0/FIRFilter.h rename to lib/soundtouch-1.9.2/FIRFilter.h index 9bbfcd00b454..6b14238ce866 100644 --- a/lib/soundtouch-1.8.0/FIRFilter.h +++ b/lib/soundtouch-1.9.2/FIRFilter.h @@ -11,10 +11,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-10-08 11:26:57 -0400 (Wed, 08 Oct 2014) $ +// Last changed : $Date: 2015-02-21 23:24:29 +0200 (Sat, 21 Feb 2015) $ // File revision : $Revision: 4 $ // -// $Id: FIRFilter.h 201 2014-10-08 15:26:57Z oparviai $ +// $Id: FIRFilter.h 202 2015-02-21 21:24:29Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -65,10 +65,6 @@ class FIRFilter // Memory for filter coefficients SAMPLETYPE *filterCoeffs; - // Memory for keeping temporary sums in multichannel processing - LONG_SAMPLETYPE *sum; - uint sumsize; - virtual uint evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const; diff --git a/lib/soundtouch-1.8.0/InterpolateCubic.cpp b/lib/soundtouch-1.9.2/InterpolateCubic.cpp similarity index 100% rename from lib/soundtouch-1.8.0/InterpolateCubic.cpp rename to lib/soundtouch-1.9.2/InterpolateCubic.cpp diff --git a/lib/soundtouch-1.8.0/InterpolateCubic.h b/lib/soundtouch-1.9.2/InterpolateCubic.h similarity index 93% rename from lib/soundtouch-1.8.0/InterpolateCubic.h rename to lib/soundtouch-1.9.2/InterpolateCubic.h index 6c966669bca2..2f6b061a2172 100644 --- a/lib/soundtouch-1.8.0/InterpolateCubic.h +++ b/lib/soundtouch-1.9.2/InterpolateCubic.h @@ -8,7 +8,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// $Id: InterpolateCubic.h 179 2014-01-06 18:41:42Z oparviai $ +// $Id: InterpolateCubic.h 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -56,7 +56,7 @@ class InterpolateCubic : public TransposerBase const SAMPLETYPE *src, int &srcSamples); - float fract; + double fract; public: InterpolateCubic(); diff --git a/lib/soundtouch-1.8.0/InterpolateLinear.cpp b/lib/soundtouch-1.9.2/InterpolateLinear.cpp similarity index 92% rename from lib/soundtouch-1.8.0/InterpolateLinear.cpp rename to lib/soundtouch-1.9.2/InterpolateLinear.cpp index 792c22bf1f00..0f9a03e1b91d 100644 --- a/lib/soundtouch-1.8.0/InterpolateLinear.cpp +++ b/lib/soundtouch-1.9.2/InterpolateLinear.cpp @@ -8,7 +8,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// $Id: InterpolateLinear.cpp 180 2014-01-06 19:16:02Z oparviai $ +// $Id: InterpolateLinear.cpp 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -170,9 +170,9 @@ int InterpolateLinearInteger::transposeMulti(SAMPLETYPE *dest, const SAMPLETYPE // Sets new target iRate. Normal iRate = 1.0, smaller values represent slower // iRate, larger faster iRates. -void InterpolateLinearInteger::setRate(float newRate) +void InterpolateLinearInteger::setRate(double newRate) { - iRate = (int)(newRate * SCALE + 0.5f); + iRate = (int)(newRate * SCALE + 0.5); TransposerBase::setRate(newRate); } @@ -190,7 +190,7 @@ InterpolateLinearFloat::InterpolateLinearFloat() : TransposerBase() // Notice: use local function calling syntax for sake of clarity, // to indicate the fact that C++ constructor can't call virtual functions. resetRegisters(); - setRate(1.0f); + setRate(1.0); } @@ -275,12 +275,13 @@ int InterpolateLinearFloat::transposeMulti(SAMPLETYPE *dest, const SAMPLETYPE *s i = 0; while (srcCount < srcSampleEnd) { - float temp, vol1; + float temp, vol1, fract_float; - vol1 = (1.0f- fract); + vol1 = (float)(1.0 - fract); + fract_float = (float)fract; for (int c = 0; c < numChannels; c ++) { - temp = vol1 * src[c] + fract * src[c + numChannels]; + temp = vol1 * src[c] + fract_float * src[c + numChannels]; *dest = (SAMPLETYPE)temp; dest ++; } diff --git a/lib/soundtouch-1.8.0/InterpolateLinear.h b/lib/soundtouch-1.9.2/InterpolateLinear.h similarity index 92% rename from lib/soundtouch-1.8.0/InterpolateLinear.h rename to lib/soundtouch-1.9.2/InterpolateLinear.h index b1ae0bb3ca57..658330331c69 100644 --- a/lib/soundtouch-1.8.0/InterpolateLinear.h +++ b/lib/soundtouch-1.9.2/InterpolateLinear.h @@ -8,7 +8,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// $Id: InterpolateLinear.h 179 2014-01-06 18:41:42Z oparviai $ +// $Id: InterpolateLinear.h 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -63,7 +63,7 @@ class InterpolateLinearInteger : public TransposerBase /// Sets new target rate. Normal rate = 1.0, smaller values represent slower /// rate, larger faster rates. - virtual void setRate(float newRate); + virtual void setRate(double newRate); }; @@ -71,7 +71,7 @@ class InterpolateLinearInteger : public TransposerBase class InterpolateLinearFloat : public TransposerBase { protected: - float fract; + double fract; virtual void resetRegisters(); diff --git a/lib/soundtouch-1.8.0/InterpolateShannon.cpp b/lib/soundtouch-1.9.2/InterpolateShannon.cpp similarity index 100% rename from lib/soundtouch-1.8.0/InterpolateShannon.cpp rename to lib/soundtouch-1.9.2/InterpolateShannon.cpp diff --git a/lib/soundtouch-1.8.0/InterpolateShannon.h b/lib/soundtouch-1.9.2/InterpolateShannon.h similarity index 93% rename from lib/soundtouch-1.8.0/InterpolateShannon.h rename to lib/soundtouch-1.9.2/InterpolateShannon.h index cb2faac028b9..7f1e647130b3 100644 --- a/lib/soundtouch-1.8.0/InterpolateShannon.h +++ b/lib/soundtouch-1.9.2/InterpolateShannon.h @@ -13,7 +13,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// $Id: InterpolateShannon.h 179 2014-01-06 18:41:42Z oparviai $ +// $Id: InterpolateShannon.h 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -61,7 +61,7 @@ class InterpolateShannon : public TransposerBase const SAMPLETYPE *src, int &srcSamples); - float fract; + double fract; public: InterpolateShannon(); diff --git a/lib/soundtouch-1.8.0/PeakFinder.cpp b/lib/soundtouch-1.9.2/PeakFinder.cpp similarity index 90% rename from lib/soundtouch-1.8.0/PeakFinder.cpp rename to lib/soundtouch-1.9.2/PeakFinder.cpp index 6fb7518e0eca..111cc88bbd4e 100644 --- a/lib/soundtouch-1.8.0/PeakFinder.cpp +++ b/lib/soundtouch-1.9.2/PeakFinder.cpp @@ -11,10 +11,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2012-12-28 14:52:47 -0500 (Fri, 28 Dec 2012) $ +// Last changed : $Date: 2015-05-18 18:22:02 +0300 (Mon, 18 May 2015) $ // File revision : $Revision: 4 $ // -// $Id: PeakFinder.cpp 164 2012-12-28 19:52:47Z oparviai $ +// $Id: PeakFinder.cpp 213 2015-05-18 15:22:02Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -192,11 +192,21 @@ double PeakFinder::getPeakCenter(const float *data, int peakpos) const gp1 = findGround(data, peakpos, -1); gp2 = findGround(data, peakpos, 1); - groundLevel = 0.5f * (data[gp1] + data[gp2]); peakLevel = data[peakpos]; - // calculate 70%-level of the peak - cutLevel = 0.70f * peakLevel + 0.30f * groundLevel; + if (gp1 == gp2) + { + // avoid rounding errors when all are equal + assert(gp1 == peakpos); + cutLevel = groundLevel = peakLevel; + } else { + // get average of the ground levels + groundLevel = 0.5f * (data[gp1] + data[gp2]); + + // calculate 70%-level of the peak + cutLevel = 0.70f * peakLevel + 0.30f * groundLevel; + } + // find mid-level crossings crosspos1 = findCrossingLevel(data, cutLevel, peakpos, -1); crosspos2 = findCrossingLevel(data, cutLevel, peakpos, 1); diff --git a/lib/soundtouch-1.8.0/PeakFinder.h b/lib/soundtouch-1.9.2/PeakFinder.h similarity index 96% rename from lib/soundtouch-1.8.0/PeakFinder.h rename to lib/soundtouch-1.9.2/PeakFinder.h index 46cdf05c54fe..594f23088265 100644 --- a/lib/soundtouch-1.8.0/PeakFinder.h +++ b/lib/soundtouch-1.9.2/PeakFinder.h @@ -9,7 +9,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2011-12-30 15:33:46 -0500 (Fri, 30 Dec 2011) $ +// Last changed : $Date: 2011-12-30 22:33:46 +0200 (Fri, 30 Dec 2011) $ // File revision : $Revision: 4 $ // // $Id: PeakFinder.h 132 2011-12-30 20:33:46Z oparviai $ diff --git a/lib/soundtouch-1.8.0/RateTransposer.cpp b/lib/soundtouch-1.9.2/RateTransposer.cpp similarity index 91% rename from lib/soundtouch-1.8.0/RateTransposer.cpp rename to lib/soundtouch-1.9.2/RateTransposer.cpp index 94e1fb2f8169..95b9437a2460 100644 --- a/lib/soundtouch-1.8.0/RateTransposer.cpp +++ b/lib/soundtouch-1.9.2/RateTransposer.cpp @@ -10,10 +10,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-07-26 17:45:48 +0300 (Sun, 26 Jul 2015) $ // File revision : $Revision: 4 $ // -// $Id: RateTransposer.cpp 195 2014-04-06 15:57:21Z oparviai $ +// $Id: RateTransposer.cpp 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -97,20 +97,20 @@ AAFilter *RateTransposer::getAAFilter() // Sets new target iRate. Normal iRate = 1.0, smaller values represent slower // iRate, larger faster iRates. -void RateTransposer::setRate(float newRate) +void RateTransposer::setRate(double newRate) { double fCutoff; pTransposer->setRate(newRate); // design a new anti-alias filter - if (newRate > 1.0f) + if (newRate > 1.0) { - fCutoff = 0.5f / newRate; + fCutoff = 0.5 / newRate; } else { - fCutoff = 0.5f * newRate; + fCutoff = 0.5 * newRate; } pAAFilter->setCutoffFreq(fCutoff); } @@ -225,7 +225,7 @@ void TransposerBase::setAlgorithm(TransposerBase::ALGORITHM a) int TransposerBase::transpose(FIFOSampleBuffer &dest, FIFOSampleBuffer &src) { int numSrcSamples = src.numSamples(); - int sizeDemand = (int)((float)numSrcSamples / rate) + 8; + int sizeDemand = (int)((double)numSrcSamples / rate) + 8; int numOutput; SAMPLETYPE *psrc = src.ptrBegin(); SAMPLETYPE *pdest = dest.ptrEnd(sizeDemand); @@ -270,7 +270,7 @@ void TransposerBase::setChannels(int channels) } -void TransposerBase::setRate(float newRate) +void TransposerBase::setRate(double newRate) { rate = newRate; } diff --git a/lib/soundtouch-1.8.0/RateTransposer.h b/lib/soundtouch-1.9.2/RateTransposer.h similarity index 93% rename from lib/soundtouch-1.8.0/RateTransposer.h rename to lib/soundtouch-1.9.2/RateTransposer.h index 2fe2961cf52a..e9cedfac9c83 100644 --- a/lib/soundtouch-1.8.0/RateTransposer.h +++ b/lib/soundtouch-1.9.2/RateTransposer.h @@ -14,10 +14,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-07-26 17:45:48 +0300 (Sun, 26 Jul 2015) $ // File revision : $Revision: 4 $ // -// $Id: RateTransposer.h 195 2014-04-06 15:57:21Z oparviai $ +// $Id: RateTransposer.h 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -81,14 +81,14 @@ class TransposerBase static ALGORITHM algorithm; public: - float rate; + double rate; int numChannels; TransposerBase(); virtual ~TransposerBase(); virtual int transpose(FIFOSampleBuffer &dest, FIFOSampleBuffer &src); - virtual void setRate(float newRate); + virtual void setRate(double newRate); virtual void setChannels(int channels); // static factory function @@ -158,7 +158,7 @@ class RateTransposer : public FIFOProcessor /// Sets new target rate. Normal rate = 1.0, smaller values represent slower /// rate, larger faster rates. - virtual void setRate(float newRate); + virtual void setRate(double newRate); /// Sets the number of channels, 1 = mono, 2 = stereo void setChannels(int channels); diff --git a/lib/soundtouch-1.8.0/STTypes.h b/lib/soundtouch-1.9.2/STTypes.h similarity index 94% rename from lib/soundtouch-1.8.0/STTypes.h rename to lib/soundtouch-1.9.2/STTypes.h index cac0b3114c4e..268d84eeed27 100644 --- a/lib/soundtouch-1.8.0/STTypes.h +++ b/lib/soundtouch-1.9.2/STTypes.h @@ -8,10 +8,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-05-18 18:25:07 +0300 (Mon, 18 May 2015) $ // File revision : $Revision: 3 $ // -// $Id: STTypes.h 195 2014-04-06 15:57:21Z oparviai $ +// $Id: STTypes.h 215 2015-05-18 15:25:07Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -75,7 +75,7 @@ namespace soundtouch /// runtime performance so recommendation is to keep this off. // #define USE_MULTICH_ALWAYS - #if (defined(__SOFTFP__)) + #if (defined(__SOFTFP__) && defined(ANDROID)) // For Android compilation: Force use of Integer samples in case that // compilation uses soft-floating point emulation - soft-fp is way too slow #undef SOUNDTOUCH_FLOAT_SAMPLES @@ -172,6 +172,7 @@ namespace soundtouch #else // use c++ standard exceptions #include + #include #define ST_THROW_RT_ERROR(x) {throw std::runtime_error(x);} #endif diff --git a/lib/soundtouch-1.8.0/SoundTouch.cpp b/lib/soundtouch-1.9.2/SoundTouch.cpp similarity index 80% rename from lib/soundtouch-1.8.0/SoundTouch.cpp rename to lib/soundtouch-1.9.2/SoundTouch.cpp index fcdacf425c87..edccce238da1 100644 --- a/lib/soundtouch-1.8.0/SoundTouch.cpp +++ b/lib/soundtouch-1.9.2/SoundTouch.cpp @@ -41,10 +41,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-10-08 11:26:57 -0400 (Wed, 08 Oct 2014) $ +// Last changed : $Date: 2015-07-26 17:45:48 +0300 (Sun, 26 Jul 2015) $ // File revision : $Revision: 4 $ // -// $Id: SoundTouch.cpp 201 2014-10-08 15:26:57Z oparviai $ +// $Id: SoundTouch.cpp 225 2015-07-26 14:45:48Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -110,6 +110,9 @@ SoundTouch::SoundTouch() calcEffectiveRateAndTempo(); + samplesExpectedOut = 0; + samplesOutput = 0; + channels = 0; bSrateSet = false; } @@ -157,7 +160,7 @@ void SoundTouch::setChannels(uint numChannels) // Sets new rate control value. Normal rate = 1.0, smaller values // represent slower rate, larger faster rates. -void SoundTouch::setRate(float newRate) +void SoundTouch::setRate(double newRate) { virtualRate = newRate; calcEffectiveRateAndTempo(); @@ -167,9 +170,9 @@ void SoundTouch::setRate(float newRate) // Sets new rate control value as a difference in percents compared // to the original rate (-50 .. +100 %) -void SoundTouch::setRateChange(float newRate) +void SoundTouch::setRateChange(double newRate) { - virtualRate = 1.0f + 0.01f * newRate; + virtualRate = 1.0 + 0.01 * newRate; calcEffectiveRateAndTempo(); } @@ -177,7 +180,7 @@ void SoundTouch::setRateChange(float newRate) // Sets new tempo control value. Normal tempo = 1.0, smaller values // represent slower tempo, larger faster tempo. -void SoundTouch::setTempo(float newTempo) +void SoundTouch::setTempo(double newTempo) { virtualTempo = newTempo; calcEffectiveRateAndTempo(); @@ -187,9 +190,9 @@ void SoundTouch::setTempo(float newTempo) // Sets new tempo control value as a difference in percents compared // to the original tempo (-50 .. +100 %) -void SoundTouch::setTempoChange(float newTempo) +void SoundTouch::setTempoChange(double newTempo) { - virtualTempo = 1.0f + 0.01f * newTempo; + virtualTempo = 1.0 + 0.01 * newTempo; calcEffectiveRateAndTempo(); } @@ -197,7 +200,7 @@ void SoundTouch::setTempoChange(float newTempo) // Sets new pitch control value. Original pitch = 1.0, smaller values // represent lower pitches, larger values higher pitch. -void SoundTouch::setPitch(float newPitch) +void SoundTouch::setPitch(double newPitch) { virtualPitch = newPitch; calcEffectiveRateAndTempo(); @@ -207,9 +210,9 @@ void SoundTouch::setPitch(float newPitch) // Sets pitch change in octaves compared to the original pitch // (-1.00 .. +1.00) -void SoundTouch::setPitchOctaves(float newPitch) +void SoundTouch::setPitchOctaves(double newPitch) { - virtualPitch = (float)exp(0.69314718056f * newPitch); + virtualPitch = exp(0.69314718056 * newPitch); calcEffectiveRateAndTempo(); } @@ -219,14 +222,14 @@ void SoundTouch::setPitchOctaves(float newPitch) // (-12 .. +12) void SoundTouch::setPitchSemiTones(int newPitch) { - setPitchOctaves((float)newPitch / 12.0f); + setPitchOctaves((double)newPitch / 12.0); } -void SoundTouch::setPitchSemiTones(float newPitch) +void SoundTouch::setPitchSemiTones(double newPitch) { - setPitchOctaves(newPitch / 12.0f); + setPitchOctaves(newPitch / 12.0); } @@ -234,14 +237,14 @@ void SoundTouch::setPitchSemiTones(float newPitch) // nominal control values. void SoundTouch::calcEffectiveRateAndTempo() { - float oldTempo = tempo; - float oldRate = rate; + double oldTempo = tempo; + double oldRate = rate; - tempo = virtualTempo / virtualPitch; - rate = virtualPitch * virtualRate; + tempo = virtualTempo / virtualPitch; + rate = virtualPitch * virtualRate; if (!TEST_FLOAT_EQUAL(rate,oldRate)) pRateTransposer->setRate(rate); - if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo); + if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo); #ifndef SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER if (rate <= 1.0f) @@ -317,8 +320,13 @@ void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples) pTDStretch->putSamples(samples, nSamples); } */ + + // accumulate how many samples are expected out from processing, given the current + // processing setting + samplesExpectedOut += (double)nSamples / ((double)rate * (double)tempo); + #ifndef SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER - else if (rate <= 1.0f) + if (rate <= 1.0f) { // transpose the rate down, output the transposed sound to tempo changer buffer assert(output == pTDStretch); @@ -346,44 +354,30 @@ void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples) void SoundTouch::flush() { int i; - int nUnprocessed; - int nOut; - SAMPLETYPE *buff = new SAMPLETYPE[64 * channels]; - - // check how many samples still await processing, and scale - // that by tempo & rate to get expected output sample count - nUnprocessed = numUnprocessedSamples(); - nUnprocessed = (int)((double)nUnprocessed / (tempo * rate) + 0.5); + int numStillExpected; + SAMPLETYPE *buff = new SAMPLETYPE[128 * channels]; - nOut = numSamples(); // ready samples currently in buffer ... - nOut += nUnprocessed; // ... and how many we expect there to be in the end - - memset(buff, 0, 64 * channels * sizeof(SAMPLETYPE)); + // how many samples are still expected to output + numStillExpected = (int)((long)(samplesExpectedOut + 0.5) - samplesOutput); + + memset(buff, 0, 128 * channels * sizeof(SAMPLETYPE)); // "Push" the last active samples out from the processing pipeline by // feeding blank samples into the processing pipeline until new, // processed samples appear in the output (not however, more than - // 8ksamples in any case) - for (i = 0; i < 128; i ++) - { - putSamples(buff, 64); - if ((int)numSamples() >= nOut) - { - // Enough new samples have appeared into the output! - // As samples come from processing with bigger chunks, now truncate it - // back to maximum "nOut" samples to improve duration accuracy - adjustAmountOfSamples(nOut); + // 24ksamples in any case) + for (i = 0; (numStillExpected > (int)numSamples()) && (i < 200); i ++) + { + putSamples(buff, 128); + } - // finish - break; - } - } + adjustAmountOfSamples(numStillExpected); delete[] buff; - // Clear working buffers - pRateTransposer->clear(); + // Clear input buffers + // pRateTransposer->clearInput(); pTDStretch->clearInput(); - // yet leave the 'tempoChanger' output intouched as that's where the + // yet leave the output intouched as that's where the // flushed samples are! } @@ -482,6 +476,7 @@ int SoundTouch::getSetting(int settingId) const // buffers. void SoundTouch::clear() { + samplesExpectedOut = 0; pRateTransposer->clear(); pTDStretch->clear(); } @@ -502,3 +497,30 @@ uint SoundTouch::numUnprocessedSamples() const } return 0; } + + + +/// Output samples from beginning of the sample buffer. Copies requested samples to +/// output buffer and removes them from the sample buffer. If there are less than +/// 'numsample' samples in the buffer, returns all that available. +/// +/// \return Number of samples returned. +uint SoundTouch::receiveSamples(SAMPLETYPE *output, uint maxSamples) +{ + uint ret = FIFOProcessor::receiveSamples(output, maxSamples); + samplesOutput += (long)ret; + return ret; +} + + +/// Adjusts book-keeping so that given number of samples are removed from beginning of the +/// sample buffer without copying them anywhere. +/// +/// Used to reduce the number of samples in the buffer when accessing the sample buffer directly +/// with 'ptrBegin' function. +uint SoundTouch::receiveSamples(uint maxSamples) +{ + uint ret = FIFOProcessor::receiveSamples(maxSamples); + samplesOutput += (long)ret; + return ret; +} diff --git a/lib/soundtouch-1.8.0/SoundTouch.h b/lib/soundtouch-1.9.2/SoundTouch.h similarity index 83% rename from lib/soundtouch-1.8.0/SoundTouch.h rename to lib/soundtouch-1.9.2/SoundTouch.h index 1a4823bf21b0..24e8716e049d 100644 --- a/lib/soundtouch-1.8.0/SoundTouch.h +++ b/lib/soundtouch-1.9.2/SoundTouch.h @@ -41,10 +41,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-09-20 10:38:32 +0300 (Sun, 20 Sep 2015) $ // File revision : $Revision: 4 $ // -// $Id: SoundTouch.h 195 2014-04-06 15:57:21Z oparviai $ +// $Id: SoundTouch.h 230 2015-09-20 07:38:32Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -79,10 +79,10 @@ namespace soundtouch { /// Soundtouch library version string -#define SOUNDTOUCH_VERSION "1.8.0" +#define SOUNDTOUCH_VERSION "1.9.2" /// SoundTouch library version id -#define SOUNDTOUCH_VERSION_ID (10800) +#define SOUNDTOUCH_VERSION_ID (10902) // // Available setting IDs for the 'setSetting' & 'get_setting' functions: @@ -151,17 +151,24 @@ class SoundTouch : public FIFOProcessor class TDStretch *pTDStretch; /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters. - float virtualRate; + double virtualRate; /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters. - float virtualTempo; + double virtualTempo; /// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters. - float virtualPitch; + double virtualPitch; /// Flag: Has sample rate been set? bool bSrateSet; + /// Accumulator for how many samples in total will be expected as output vs. samples put in, + /// considering current processing settings. + double samplesExpectedOut; + + /// Accumulator for how many samples in total have been read out from the processing so far + long samplesOutput; + /// Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and /// 'virtualPitch' parameters. void calcEffectiveRateAndTempo(); @@ -171,10 +178,10 @@ protected : uint channels; /// Effective 'rate' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch' - float rate; + double rate; /// Effective 'tempo' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch' - float tempo; + double tempo; public: SoundTouch(); @@ -188,32 +195,32 @@ protected : /// Sets new rate control value. Normal rate = 1.0, smaller values /// represent slower rate, larger faster rates. - void setRate(float newRate); + void setRate(double newRate); /// Sets new tempo control value. Normal tempo = 1.0, smaller values /// represent slower tempo, larger faster tempo. - void setTempo(float newTempo); + void setTempo(double newTempo); /// Sets new rate control value as a difference in percents compared /// to the original rate (-50 .. +100 %) - void setRateChange(float newRate); + void setRateChange(double newRate); /// Sets new tempo control value as a difference in percents compared /// to the original tempo (-50 .. +100 %) - void setTempoChange(float newTempo); + void setTempoChange(double newTempo); /// Sets new pitch control value. Original pitch = 1.0, smaller values /// represent lower pitches, larger values higher pitch. - void setPitch(float newPitch); + void setPitch(double newPitch); /// Sets pitch change in octaves compared to the original pitch /// (-1.00 .. +1.00) - void setPitchOctaves(float newPitch); + void setPitchOctaves(double newPitch); /// Sets pitch change in semi-tones compared to the original pitch /// (-12 .. +12) void setPitchSemiTones(int newPitch); - void setPitchSemiTones(float newPitch); + void setPitchSemiTones(double newPitch); /// Sets the number of channels, 1 = mono, 2 = stereo void setChannels(uint numChannels); @@ -240,6 +247,23 @@ protected : ///< contains data for both channels. ); + /// Output samples from beginning of the sample buffer. Copies requested samples to + /// output buffer and removes them from the sample buffer. If there are less than + /// 'numsample' samples in the buffer, returns all that available. + /// + /// \return Number of samples returned. + virtual uint receiveSamples(SAMPLETYPE *output, ///< Buffer where to copy output samples. + uint maxSamples ///< How many samples to receive at max. + ); + + /// Adjusts book-keeping so that given number of samples are removed from beginning of the + /// sample buffer without copying them anywhere. + /// + /// Used to reduce the number of samples in the buffer when accessing the sample buffer directly + /// with 'ptrBegin' function. + virtual uint receiveSamples(uint maxSamples ///< Remove this many samples from the beginning of pipe. + ); + /// Clears all the samples in the object's output and internal processing /// buffers. virtual void clear(); diff --git a/lib/soundtouch-1.8.0/TDStretch.cpp b/lib/soundtouch-1.9.2/TDStretch.cpp similarity index 74% rename from lib/soundtouch-1.8.0/TDStretch.cpp rename to lib/soundtouch-1.9.2/TDStretch.cpp index e3ec950fbccb..bb473a9f633c 100644 --- a/lib/soundtouch-1.8.0/TDStretch.cpp +++ b/lib/soundtouch-1.9.2/TDStretch.cpp @@ -13,10 +13,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-08-09 00:00:15 +0300 (Sun, 09 Aug 2015) $ // File revision : $Revision: 1.12 $ // -// $Id: TDStretch.cpp 195 2014-04-06 15:57:21Z oparviai $ +// $Id: TDStretch.cpp 226 2015-08-08 21:00:15Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -63,7 +63,7 @@ using namespace soundtouch; *****************************************************************************/ // Table for the hierarchical mixing position seeking algorithm -static const short _scanOffsets[5][24]={ +const short _scanOffsets[5][24]={ { 124, 186, 248, 310, 372, 434, 496, 558, 620, 682, 744, 806, 868, 930, 992, 1054, 1116, 1178, 1240, 1302, 1364, 1426, 1488, 0}, {-100, -75, -50, -25, 25, 50, 75, 100, 0, 0, 0, 0, @@ -94,7 +94,9 @@ TDStretch::TDStretch() : FIFOProcessor(&outputBuffer) bAutoSeqSetting = true; bAutoSeekSetting = true; -// outDebt = 0; + maxnorm = 0; + maxnormf = 1e8; + skipFract = 0; tempo = 1.0f; @@ -250,7 +252,7 @@ int TDStretch::seekBestOverlapPosition(const SAMPLETYPE *refPos) if (bQuickSeek) { return seekBestOverlapPositionQuick(refPos); - } + } else { return seekBestOverlapPositionFull(refPos); @@ -282,7 +284,6 @@ inline void TDStretch::overlap(SAMPLETYPE *pOutput, const SAMPLETYPE *pInput, ui } - // Seeks for the optimal overlap-mixing position. The 'stereo' version of the // routine // @@ -292,9 +293,9 @@ inline void TDStretch::overlap(SAMPLETYPE *pOutput, const SAMPLETYPE *pInput, ui int TDStretch::seekBestOverlapPositionFull(const SAMPLETYPE *refPos) { int bestOffs; - double bestCorr, corr; - double norm; + double bestCorr; int i; + double norm; bestCorr = FLT_MIN; bestOffs = 0; @@ -302,14 +303,22 @@ int TDStretch::seekBestOverlapPositionFull(const SAMPLETYPE *refPos) // Scans for the best correlation value by testing each possible position // over the permitted range. bestCorr = calcCrossCorr(refPos, pMidBuffer, norm); + + #pragma omp parallel for for (i = 1; i < seekLength; i ++) { - // Calculates correlation value for the mixing position corresponding - // to 'i'. Now call "calcCrossCorrAccumulate" that is otherwise same as - // "calcCrossCorr", but saves time by reusing & updating previously stored + double corr; + // Calculates correlation value for the mixing position corresponding to 'i' +#ifdef _OPENMP + // in parallel OpenMP mode, can't use norm accumulator version as parallel executor won't + // iterate the loop in sequential order + corr = calcCrossCorr(refPos + channels * i, pMidBuffer, norm); +#else + // In non-parallel version call "calcCrossCorrAccumulate" that is otherwise same + // as "calcCrossCorr", but saves time by reusing & updating previously stored // "norm" value corr = calcCrossCorrAccumulate(refPos + channels * i, pMidBuffer, norm); - +#endif // heuristic rule to slightly favour values close to mid of the range double tmp = (double)(2 * i - seekLength) / (double)seekLength; corr = ((corr + 0.1) * (1.0 - 0.25 * tmp * tmp)); @@ -317,10 +326,22 @@ int TDStretch::seekBestOverlapPositionFull(const SAMPLETYPE *refPos) // Checks for the highest correlation value if (corr > bestCorr) { - bestCorr = corr; - bestOffs = i; + // For optimal performance, enter critical section only in case that best value found. + // in such case repeat 'if' condition as it's possible that parallel execution may have + // updated the bestCorr value in the mean time + #pragma omp critical + if (corr > bestCorr) + { + bestCorr = corr; + bestOffs = i; + } } } + +#ifdef SOUNDTOUCH_INTEGER_SAMPLES + adaptNormalizer(); +#endif + // clear cross correlation routine state if necessary (is so e.g. in MMX routines). clearCrossCorrState(); @@ -328,64 +349,161 @@ int TDStretch::seekBestOverlapPositionFull(const SAMPLETYPE *refPos) } -// Seeks for the optimal overlap-mixing position. The 'stereo' version of the -// routine +// Quick seek algorithm for improved runtime-performance: First roughly scans through the +// correlation area, and then scan surroundings of two best preliminary correlation candidates +// with improved precision // -// The best position is determined as the position where the two overlapped -// sample sequences are 'most alike', in terms of the highest cross-correlation -// value over the overlapping period -int TDStretch::seekBestOverlapPositionQuick(const SAMPLETYPE *refPos) +// Based on testing: +// - This algorithm gives on average 99% as good match as the full algorith +// - this quick seek algorithm finds the best match on ~90% of cases +// - on those 10% of cases when this algorithm doesn't find best match, +// it still finds on average ~90% match vs. the best possible match +int TDStretch::seekBestOverlapPositionQuick(const SAMPLETYPE *refPos) { - int j; +#define _MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define SCANSTEP 16 +#define SCANWIND 8 + int bestOffs; - double bestCorr, corr; - int scanCount, corrOffset, tempOffset; + int i; + int bestOffs2; + float bestCorr, corr; + float bestCorr2; + double norm; + + // note: 'float' types used in this function in case that the platform would need to use software-fp bestCorr = FLT_MIN; - bestOffs = _scanOffsets[0][0]; - corrOffset = 0; - tempOffset = 0; + bestOffs = SCANWIND; + bestCorr2 = FLT_MIN; + bestOffs2 = 0; + + int best = 0; - // Scans for the best correlation value using four-pass hierarchical search. + // Scans for the best correlation value by testing each possible position + // over the permitted range. Look for two best matches on the first pass to + // increase possibility of ideal match. // - // The look-up table 'scans' has hierarchical position adjusting steps. - // In first pass the routine searhes for the highest correlation with - // relatively coarse steps, then rescans the neighbourhood of the highest - // correlation with better resolution and so on. - for (scanCount = 0;scanCount < 4; scanCount ++) - { - j = 0; - while (_scanOffsets[scanCount][j]) + // Begin from "SCANSTEP" instead of SCANWIND to make the calculation + // catch the 'middlepoint' of seekLength vector as that's the a-priori + // expected best match position + // + // Roughly: + // - 15% of cases find best result directly on the first round, + // - 75% cases find better match on 2nd round around the best match from 1st round + // - 10% cases find better match on 2nd round around the 2nd-best-match from 1st round + for (i = SCANSTEP; i < seekLength - SCANWIND - 1; i += SCANSTEP) + { + // Calculates correlation value for the mixing position corresponding + // to 'i' + corr = (float)calcCrossCorr(refPos + channels*i, pMidBuffer, norm); + // heuristic rule to slightly favour values close to mid of the seek range + float tmp = (float)(2 * i - seekLength - 1) / (float)seekLength; + corr = ((corr + 0.1f) * (1.0f - 0.25f * tmp * tmp)); + + // Checks for the highest correlation value + if (corr > bestCorr) { - double norm; - tempOffset = corrOffset + _scanOffsets[scanCount][j]; - if (tempOffset >= seekLength) break; - - // Calculates correlation value for the mixing position corresponding - // to 'tempOffset' - corr = (double)calcCrossCorr(refPos + channels * tempOffset, pMidBuffer, norm); - // heuristic rule to slightly favour values close to mid of the range - double tmp = (double)(2 * tempOffset - seekLength) / seekLength; - corr = ((corr + 0.1) * (1.0 - 0.25 * tmp * tmp)); - - // Checks for the highest correlation value - if (corr > bestCorr) - { - bestCorr = corr; - bestOffs = tempOffset; - } - j ++; + // found new best match. keep the previous best as 2nd best match + bestCorr2 = bestCorr; + bestOffs2 = bestOffs; + bestCorr = corr; + bestOffs = i; + } + else if (corr > bestCorr2) + { + // not new best, but still new 2nd best match + bestCorr2 = corr; + bestOffs2 = i; } - corrOffset = bestOffs; } + + // Scans surroundings of the found best match with small stepping + int end = _MIN(bestOffs + SCANWIND + 1, seekLength); + for (i = bestOffs - SCANWIND; i < end; i++) + { + if (i == bestOffs) continue; // this offset already calculated, thus skip + + // Calculates correlation value for the mixing position corresponding + // to 'i' + corr = (float)calcCrossCorr(refPos + channels*i, pMidBuffer, norm); + // heuristic rule to slightly favour values close to mid of the range + float tmp = (float)(2 * i - seekLength - 1) / (float)seekLength; + corr = ((corr + 0.1f) * (1.0f - 0.25f * tmp * tmp)); + + // Checks for the highest correlation value + if (corr > bestCorr) + { + bestCorr = corr; + bestOffs = i; + best = 1; + } + } + + // Scans surroundings of the 2nd best match with small stepping + end = _MIN(bestOffs2 + SCANWIND + 1, seekLength); + for (i = bestOffs2 - SCANWIND; i < end; i++) + { + if (i == bestOffs2) continue; // this offset already calculated, thus skip + + // Calculates correlation value for the mixing position corresponding + // to 'i' + corr = (float)calcCrossCorr(refPos + channels*i, pMidBuffer, norm); + // heuristic rule to slightly favour values close to mid of the range + float tmp = (float)(2 * i - seekLength - 1) / (float)seekLength; + corr = ((corr + 0.1f) * (1.0f - 0.25f * tmp * tmp)); + + // Checks for the highest correlation value + if (corr > bestCorr) + { + bestCorr = corr; + bestOffs = i; + best = 2; + } + } + // clear cross correlation routine state if necessary (is so e.g. in MMX routines). clearCrossCorrState(); +#ifdef SOUNDTOUCH_INTEGER_SAMPLES + adaptNormalizer(); +#endif + return bestOffs; } + +/// For integer algorithm: adapt normalization factor divider with music so that +/// it'll not be pessimistically restrictive that can degrade quality on quieter sections +/// yet won't cause integer overflows either +void TDStretch::adaptNormalizer() +{ + // Do not adapt normalizer over too silent sequences to avoid averaging filter depleting to + // too low values during pauses in music + if ((maxnorm > 1000) || (maxnormf > 40000000)) + { + //norm averaging filter + maxnormf = 0.9f * maxnormf + 0.1f * (float)maxnorm; + + if ((maxnorm > 800000000) && (overlapDividerBitsNorm < 16)) + { + // large values, so increase divider + overlapDividerBitsNorm++; + if (maxnorm > 1600000000) overlapDividerBitsNorm++; // extra large value => extra increase + } + else if ((maxnormf < 1000000) && (overlapDividerBitsNorm > 0)) + { + // extra small values, decrease divider + overlapDividerBitsNorm--; + } + } + + maxnorm = 0; +} + + /// clear cross correlation routine state if necessary void TDStretch::clearCrossCorrState() { @@ -407,7 +525,7 @@ void TDStretch::calcSeqParameters() #define AUTOSEQ_K ((AUTOSEQ_AT_MAX - AUTOSEQ_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW)) #define AUTOSEQ_C (AUTOSEQ_AT_MIN - (AUTOSEQ_K) * (AUTOSEQ_TEMPO_LOW)) - // seek-window-ms setting values at above low & top tempo + // seek-window-ms setting values at above low & top tempoq #define AUTOSEEK_AT_MIN 25.0 #define AUTOSEEK_AT_MAX 15.0 #define AUTOSEEK_K ((AUTOSEEK_AT_MAX - AUTOSEEK_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW)) @@ -444,7 +562,7 @@ void TDStretch::calcSeqParameters() // Sets new target tempo. Normal tempo = 'SCALE', smaller values represent slower // tempo, larger faster tempo. -void TDStretch::setTempo(float newTempo) +void TDStretch::setTempo(double newTempo) { int intskip; @@ -455,7 +573,7 @@ void TDStretch::setTempo(float newTempo) // Calculate ideal skip length (according to tempo value) nominalSkip = tempo * (seekWindowLength - overlapLength); - intskip = (int)(nominalSkip + 0.5f); + intskip = (int)(nominalSkip + 0.5); // Calculate how many samples are needed in the 'inputBuffer' to // process another batch of samples @@ -721,13 +839,15 @@ void TDStretch::calculateOverlapLength(int aoverlapMs) // calculate overlap length so that it's power of 2 - thus it's easy to do // integer division by right-shifting. Term "-1" at end is to account for // the extra most significatnt bit left unused in result by signed multiplication - overlapDividerBits = _getClosest2Power((sampleRate * aoverlapMs) / 1000.0) - 1; - if (overlapDividerBits > 9) overlapDividerBits = 9; - if (overlapDividerBits < 3) overlapDividerBits = 3; - newOvl = (int)pow(2.0, (int)overlapDividerBits + 1); // +1 => account for -1 above + overlapDividerBitsPure = _getClosest2Power((sampleRate * aoverlapMs) / 1000.0) - 1; + if (overlapDividerBitsPure > 9) overlapDividerBitsPure = 9; + if (overlapDividerBitsPure < 3) overlapDividerBitsPure = 3; + newOvl = (int)pow(2.0, (int)overlapDividerBitsPure + 1); // +1 => account for -1 above acceptNewOverlapLength(newOvl); + overlapDividerBitsNorm = overlapDividerBitsPure; + // calculate sloping divider so that crosscorrelation operation won't // overflow 32-bit register. Max. sum of the crosscorrelation sum without // divider would be 2^30*(N^3-N)/3, where N = overlap length @@ -735,10 +855,10 @@ void TDStretch::calculateOverlapLength(int aoverlapMs) } -double TDStretch::calcCrossCorr(const short *mixingPos, const short *compare, double &norm) const +double TDStretch::calcCrossCorr(const short *mixingPos, const short *compare, double &norm) { long corr; - long lnorm; + unsigned long lnorm; int i; corr = lnorm = 0; @@ -748,15 +868,19 @@ double TDStretch::calcCrossCorr(const short *mixingPos, const short *compare, do for (i = 0; i < channels * overlapLength; i += 4) { corr += (mixingPos[i] * compare[i] + - mixingPos[i + 1] * compare[i + 1]) >> overlapDividerBits; // notice: do intermediate division here to avoid integer overflow + mixingPos[i + 1] * compare[i + 1]) >> overlapDividerBitsNorm; // notice: do intermediate division here to avoid integer overflow corr += (mixingPos[i + 2] * compare[i + 2] + - mixingPos[i + 3] * compare[i + 3]) >> overlapDividerBits; + mixingPos[i + 3] * compare[i + 3]) >> overlapDividerBitsNorm; lnorm += (mixingPos[i] * mixingPos[i] + - mixingPos[i + 1] * mixingPos[i + 1]) >> overlapDividerBits; // notice: do intermediate division here to avoid integer overflow + mixingPos[i + 1] * mixingPos[i + 1]) >> overlapDividerBitsNorm; // notice: do intermediate division here to avoid integer overflow lnorm += (mixingPos[i + 2] * mixingPos[i + 2] + - mixingPos[i + 3] * mixingPos[i + 3]) >> overlapDividerBits; + mixingPos[i + 3] * mixingPos[i + 3]) >> overlapDividerBitsNorm; } + if (lnorm > maxnorm) + { + maxnorm = lnorm; + } // Normalize result by dividing by sqrt(norm) - this step is easiest // done using floating point operation norm = (double)lnorm; @@ -765,17 +889,17 @@ double TDStretch::calcCrossCorr(const short *mixingPos, const short *compare, do /// Update cross-correlation by accumulating "norm" coefficient by previously calculated value -double TDStretch::calcCrossCorrAccumulate(const short *mixingPos, const short *compare, double &norm) const +double TDStretch::calcCrossCorrAccumulate(const short *mixingPos, const short *compare, double &norm) { long corr; - long lnorm; + unsigned long lnorm; int i; // cancel first normalizer tap from previous round lnorm = 0; for (i = 1; i <= channels; i ++) { - lnorm -= (mixingPos[-i] * mixingPos[-i]) >> overlapDividerBits; + lnorm -= (mixingPos[-i] * mixingPos[-i]) >> overlapDividerBitsNorm; } corr = 0; @@ -785,18 +909,23 @@ double TDStretch::calcCrossCorrAccumulate(const short *mixingPos, const short *c for (i = 0; i < channels * overlapLength; i += 4) { corr += (mixingPos[i] * compare[i] + - mixingPos[i + 1] * compare[i + 1]) >> overlapDividerBits; // notice: do intermediate division here to avoid integer overflow + mixingPos[i + 1] * compare[i + 1]) >> overlapDividerBitsNorm; // notice: do intermediate division here to avoid integer overflow corr += (mixingPos[i + 2] * compare[i + 2] + - mixingPos[i + 3] * compare[i + 3]) >> overlapDividerBits; + mixingPos[i + 3] * compare[i + 3]) >> overlapDividerBitsNorm; } // update normalizer with last samples of this round for (int j = 0; j < channels; j ++) { i --; - lnorm += (mixingPos[i] * mixingPos[i]) >> overlapDividerBits; + lnorm += (mixingPos[i] * mixingPos[i]) >> overlapDividerBitsNorm; } + norm += (double)lnorm; + if (norm > maxnorm) + { + maxnorm = (unsigned long)norm; + } // Normalize result by dividing by sqrt(norm) - this step is easiest // done using floating point operation @@ -881,9 +1010,10 @@ void TDStretch::calculateOverlapLength(int overlapInMsec) /// Calculate cross-correlation -double TDStretch::calcCrossCorr(const float *mixingPos, const float *compare, double &norm) const +double TDStretch::calcCrossCorr(const float *mixingPos, const float *compare, double &anorm) { double corr; + double norm; int i; corr = norm = 0; @@ -905,12 +1035,13 @@ double TDStretch::calcCrossCorr(const float *mixingPos, const float *compare, do mixingPos[i + 3] * mixingPos[i + 3]; } + anorm = norm; return corr / sqrt((norm < 1e-9 ? 1.0 : norm)); } /// Update cross-correlation by accumulating "norm" coefficient by previously calculated value -double TDStretch::calcCrossCorrAccumulate(const float *mixingPos, const float *compare, double &norm) const +double TDStretch::calcCrossCorrAccumulate(const float *mixingPos, const float *compare, double &norm) { double corr; int i; diff --git a/lib/soundtouch-1.8.0/TDStretch.h b/lib/soundtouch-1.9.2/TDStretch.h similarity index 91% rename from lib/soundtouch-1.8.0/TDStretch.h rename to lib/soundtouch-1.9.2/TDStretch.h index 15b45a266171..213304c982e4 100644 --- a/lib/soundtouch-1.8.0/TDStretch.h +++ b/lib/soundtouch-1.9.2/TDStretch.h @@ -13,10 +13,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-04-06 11:57:21 -0400 (Sun, 06 Apr 2014) $ +// Last changed : $Date: 2015-08-09 00:00:15 +0300 (Sun, 09 Aug 2015) $ // File revision : $Revision: 4 $ // -// $Id: TDStretch.h 195 2014-04-06 15:57:21Z oparviai $ +// $Id: TDStretch.h 226 2015-08-08 21:00:15Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -112,39 +112,46 @@ class TDStretch : public FIFOProcessor protected: int channels; int sampleReq; - float tempo; - SAMPLETYPE *pMidBuffer; - SAMPLETYPE *pMidBufferUnaligned; int overlapLength; int seekLength; int seekWindowLength; - int overlapDividerBits; + int overlapDividerBitsNorm; + int overlapDividerBitsPure; int slopingDivider; - float nominalSkip; - float skipFract; - FIFOSampleBuffer outputBuffer; - FIFOSampleBuffer inputBuffer; - bool bQuickSeek; - int sampleRate; int sequenceMs; int seekWindowMs; int overlapMs; + + unsigned long maxnorm; + float maxnormf; + + double tempo; + double nominalSkip; + double skipFract; + + bool bQuickSeek; bool bAutoSeqSetting; bool bAutoSeekSetting; + SAMPLETYPE *pMidBuffer; + SAMPLETYPE *pMidBufferUnaligned; + + FIFOSampleBuffer outputBuffer; + FIFOSampleBuffer inputBuffer; + void acceptNewOverlapLength(int newOverlapLength); virtual void clearCrossCorrState(); void calculateOverlapLength(int overlapMs); - virtual double calcCrossCorr(const SAMPLETYPE *mixingPos, const SAMPLETYPE *compare, double &norm) const; - virtual double calcCrossCorrAccumulate(const SAMPLETYPE *mixingPos, const SAMPLETYPE *compare, double &norm) const; + virtual double calcCrossCorr(const SAMPLETYPE *mixingPos, const SAMPLETYPE *compare, double &norm); + virtual double calcCrossCorrAccumulate(const SAMPLETYPE *mixingPos, const SAMPLETYPE *compare, double &norm); virtual int seekBestOverlapPositionFull(const SAMPLETYPE *refPos); virtual int seekBestOverlapPositionQuick(const SAMPLETYPE *refPos); - int seekBestOverlapPosition(const SAMPLETYPE *refPos); + virtual int seekBestOverlapPosition(const SAMPLETYPE *refPos); virtual void overlapStereo(SAMPLETYPE *output, const SAMPLETYPE *input) const; virtual void overlapMono(SAMPLETYPE *output, const SAMPLETYPE *input) const; @@ -154,6 +161,8 @@ class TDStretch : public FIFOProcessor void overlap(SAMPLETYPE *output, const SAMPLETYPE *input, uint ovlPos) const; void calcSeqParameters(); + void adaptNormalizer(); + /// Changes the tempo of the given sound samples. /// Returns amount of samples returned in the "output" buffer. @@ -182,7 +191,7 @@ class TDStretch : public FIFOProcessor /// Sets new target tempo. Normal tempo = 'SCALE', smaller values represent slower /// tempo, larger faster tempo. - void setTempo(float newTempo); + void setTempo(double newTempo); /// Returns nonzero if there aren't any samples available for outputting. virtual void clear(); @@ -249,8 +258,8 @@ class TDStretch : public FIFOProcessor class TDStretchMMX : public TDStretch { protected: - double calcCrossCorr(const short *mixingPos, const short *compare, double &norm) const; - double calcCrossCorrAccumulate(const short *mixingPos, const short *compare, double &norm) const; + double calcCrossCorr(const short *mixingPos, const short *compare, double &norm); + double calcCrossCorrAccumulate(const short *mixingPos, const short *compare, double &norm); virtual void overlapStereo(short *output, const short *input) const; virtual void clearCrossCorrState(); }; @@ -262,8 +271,8 @@ class TDStretch : public FIFOProcessor class TDStretchSSE : public TDStretch { protected: - double calcCrossCorr(const float *mixingPos, const float *compare, double &norm) const; - double calcCrossCorrAccumulate(const float *mixingPos, const float *compare, double &norm) const; + double calcCrossCorr(const float *mixingPos, const float *compare, double &norm); + double calcCrossCorrAccumulate(const float *mixingPos, const float *compare, double &norm); }; #endif /// SOUNDTOUCH_ALLOW_SSE diff --git a/lib/soundtouch-1.8.0/cpu_detect.h b/lib/soundtouch-1.9.2/cpu_detect.h similarity index 94% rename from lib/soundtouch-1.8.0/cpu_detect.h rename to lib/soundtouch-1.9.2/cpu_detect.h index 6b67861b40d3..025781dae1cd 100644 --- a/lib/soundtouch-1.8.0/cpu_detect.h +++ b/lib/soundtouch-1.9.2/cpu_detect.h @@ -12,7 +12,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2008-02-10 11:26:55 -0500 (Sun, 10 Feb 2008) $ +// Last changed : $Date: 2008-02-10 18:26:55 +0200 (Sun, 10 Feb 2008) $ // File revision : $Revision: 4 $ // // $Id: cpu_detect.h 11 2008-02-10 16:26:55Z oparviai $ diff --git a/lib/soundtouch-1.8.0/cpu_detect_x86.cpp b/lib/soundtouch-1.9.2/cpu_detect_x86.cpp similarity index 95% rename from lib/soundtouch-1.8.0/cpu_detect_x86.cpp rename to lib/soundtouch-1.9.2/cpu_detect_x86.cpp index 83179c97e1fd..5ef0246216dc 100644 --- a/lib/soundtouch-1.8.0/cpu_detect_x86.cpp +++ b/lib/soundtouch-1.9.2/cpu_detect_x86.cpp @@ -11,7 +11,7 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-07 13:24:28 -0500 (Tue, 07 Jan 2014) $ +// Last changed : $Date: 2014-01-07 20:24:28 +0200 (Tue, 07 Jan 2014) $ // File revision : $Revision: 4 $ // // $Id: cpu_detect_x86.cpp 183 2014-01-07 18:24:28Z oparviai $ diff --git a/lib/soundtouch-1.8.0/mmx_optimized.cpp b/lib/soundtouch-1.9.2/mmx_optimized.cpp similarity index 92% rename from lib/soundtouch-1.8.0/mmx_optimized.cpp rename to lib/soundtouch-1.9.2/mmx_optimized.cpp index e322009568b7..8ad2811b9a1b 100644 --- a/lib/soundtouch-1.8.0/mmx_optimized.cpp +++ b/lib/soundtouch-1.9.2/mmx_optimized.cpp @@ -20,10 +20,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-07 13:25:40 -0500 (Tue, 07 Jan 2014) $ +// Last changed : $Date: 2015-08-09 00:00:15 +0300 (Sun, 09 Aug 2015) $ // File revision : $Revision: 4 $ // -// $Id: mmx_optimized.cpp 184 2014-01-07 18:25:40Z oparviai $ +// $Id: mmx_optimized.cpp 226 2015-08-08 21:00:15Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -68,7 +68,7 @@ using namespace soundtouch; // Calculates cross correlation of two buffers -double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2, double &dnorm) const +double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2, double &dnorm) { const __m64 *pVec1, *pVec2; __m64 shifter; @@ -79,7 +79,7 @@ double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2, double &d pVec1 = (__m64*)pV1; pVec2 = (__m64*)pV2; - shifter = _m_from_int(overlapDividerBits); + shifter = _m_from_int(overlapDividerBitsNorm); normaccu = accu = _mm_setzero_si64(); // Process 4 parallel sets of 2 * stereo samples or 4 * mono samples @@ -123,6 +123,11 @@ double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2, double &d // Clear MMS state _m_empty(); + if (norm > (long)maxnorm) + { + maxnorm = norm; + } + // Normalize result by dividing by sqrt(norm) - this step is easiest // done using floating point operation dnorm = (double)norm; @@ -134,7 +139,7 @@ double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2, double &d /// Update cross-correlation by accumulating "norm" coefficient by previously calculated value -double TDStretchMMX::calcCrossCorrAccumulate(const short *pV1, const short *pV2, double &dnorm) const +double TDStretchMMX::calcCrossCorrAccumulate(const short *pV1, const short *pV2, double &dnorm) { const __m64 *pVec1, *pVec2; __m64 shifter; @@ -146,13 +151,13 @@ double TDStretchMMX::calcCrossCorrAccumulate(const short *pV1, const short *pV2, lnorm = 0; for (i = 1; i <= channels; i ++) { - lnorm -= (pV1[-i] * pV1[-i]) >> overlapDividerBits; + lnorm -= (pV1[-i] * pV1[-i]) >> overlapDividerBitsNorm; } pVec1 = (__m64*)pV1; pVec2 = (__m64*)pV2; - shifter = _m_from_int(overlapDividerBits); + shifter = _m_from_int(overlapDividerBitsNorm); accu = _mm_setzero_si64(); // Process 4 parallel sets of 2 * stereo samples or 4 * mono samples @@ -191,10 +196,15 @@ double TDStretchMMX::calcCrossCorrAccumulate(const short *pV1, const short *pV2, pV1 = (short *)pVec1; for (int j = 1; j <= channels; j ++) { - lnorm += (pV1[-j] * pV1[-j]) >> overlapDividerBits; + lnorm += (pV1[-j] * pV1[-j]) >> overlapDividerBitsNorm; } dnorm += (double)lnorm; + if (lnorm > (long)maxnorm) + { + maxnorm = lnorm; + } + // Normalize result by dividing by sqrt(norm) - this step is easiest // done using floating point operation return (double)corr / sqrt((dnorm < 1e-9) ? 1.0 : dnorm); @@ -233,7 +243,7 @@ void TDStretchMMX::overlapStereo(short *output, const short *input) const // Overlaplength-division by shifter. "+1" is to account for "-1" deduced in // overlapDividerBits calculation earlier. - shifter = _m_from_int(overlapDividerBits + 1); + shifter = _m_from_int(overlapDividerBitsPure + 1); for (i = 0; i < overlapLength / 4; i ++) { @@ -287,6 +297,7 @@ void TDStretchMMX::overlapStereo(short *output, const short *input) const FIRFilterMMX::FIRFilterMMX() : FIRFilter() { + filterCoeffsAlign = NULL; filterCoeffsUnalign = NULL; } diff --git a/lib/soundtouch-1.8.0/soundtouch_config.h b/lib/soundtouch-1.9.2/soundtouch_config.h similarity index 100% rename from lib/soundtouch-1.8.0/soundtouch_config.h rename to lib/soundtouch-1.9.2/soundtouch_config.h diff --git a/lib/soundtouch-1.8.0/sse_optimized.cpp b/lib/soundtouch-1.9.2/sse_optimized.cpp similarity index 93% rename from lib/soundtouch-1.8.0/sse_optimized.cpp rename to lib/soundtouch-1.9.2/sse_optimized.cpp index 095fa351a900..490d0d20809f 100644 --- a/lib/soundtouch-1.8.0/sse_optimized.cpp +++ b/lib/soundtouch-1.9.2/sse_optimized.cpp @@ -23,10 +23,10 @@ /// //////////////////////////////////////////////////////////////////////////////// // -// Last changed : $Date: 2014-01-07 13:25:40 -0500 (Tue, 07 Jan 2014) $ +// Last changed : $Date: 2015-08-09 00:00:15 +0300 (Sun, 09 Aug 2015) $ // File revision : $Revision: 4 $ // -// $Id: sse_optimized.cpp 184 2014-01-07 18:25:40Z oparviai $ +// $Id: sse_optimized.cpp 226 2015-08-08 21:00:15Z oparviai $ // //////////////////////////////////////////////////////////////////////////////// // @@ -71,7 +71,7 @@ using namespace soundtouch; #include // Calculates cross correlation of two buffers -double TDStretchSSE::calcCrossCorr(const float *pV1, const float *pV2, double &norm) const +double TDStretchSSE::calcCrossCorr(const float *pV1, const float *pV2, double &anorm) { int i; const float *pVec1; @@ -141,7 +141,8 @@ double TDStretchSSE::calcCrossCorr(const float *pV1, const float *pV2, double &n // return value = vSum[0] + vSum[1] + vSum[2] + vSum[3] float *pvNorm = (float*)&vNorm; - norm = (pvNorm[0] + pvNorm[1] + pvNorm[2] + pvNorm[3]); + float norm = (pvNorm[0] + pvNorm[1] + pvNorm[2] + pvNorm[3]); + anorm = norm; float *pvSum = (float*)&vSum; return (double)(pvSum[0] + pvSum[1] + pvSum[2] + pvSum[3]) / sqrt(norm < 1e-9 ? 1.0 : norm); @@ -182,7 +183,7 @@ double TDStretchSSE::calcCrossCorr(const float *pV1, const float *pV2, double &n -double TDStretchSSE::calcCrossCorrAccumulate(const float *pV1, const float *pV2, double &norm) const +double TDStretchSSE::calcCrossCorrAccumulate(const float *pV1, const float *pV2, double &norm) { // call usual calcCrossCorr function because SSE does not show big benefit of // accumulating "norm" value, and also the "norm" rolling algorithm would get @@ -258,14 +259,17 @@ uint FIRFilterSSE::evaluateFilterStereo(float *dest, const float *source, uint n assert(((ulongptr)filterCoeffsAlign) % 16 == 0); // filter is evaluated for two stereo samples with each iteration, thus use of 'j += 2' + #pragma omp parallel for for (j = 0; j < count; j += 2) { const float *pSrc; + float *pDest; const __m128 *pFil; __m128 sum1, sum2; uint i; - pSrc = (const float*)source; // source audio data + pSrc = (const float*)source + j * 2; // source audio data + pDest = dest + j * 2; // destination audio data pFil = (const __m128*)filterCoeffsAlign; // filter coefficients. NOTE: Assumes coefficients // are aligned to 16-byte boundary sum1 = sum2 = _mm_setzero_ps(); @@ -298,12 +302,10 @@ uint FIRFilterSSE::evaluateFilterStereo(float *dest, const float *source, uint n // to sum the two hi- and lo-floats of these registers together. // post-shuffle & add the filtered values and store to dest. - _mm_storeu_ps(dest, _mm_add_ps( + _mm_storeu_ps(pDest, _mm_add_ps( _mm_shuffle_ps(sum1, sum2, _MM_SHUFFLE(1,0,3,2)), // s2_1 s2_0 s1_3 s1_2 _mm_shuffle_ps(sum1, sum2, _MM_SHUFFLE(3,2,1,0)) // s2_3 s2_2 s1_1 s1_0 )); - source += 4; - dest += 4; } // Ideas for further improvement: diff --git a/lib/vamp-2.6/src/doc-overview b/lib/vamp-2.6/src/doc-overview new file mode 100644 index 000000000000..e48fa91af71e --- /dev/null +++ b/lib/vamp-2.6/src/doc-overview @@ -0,0 +1,162 @@ + +/** \mainpage Vamp Plugin SDK + +\section about About Vamp + +Vamp is an API for C and C++ plugins that process sampled audio data +to produce descriptive output (measurements or semantic observations). +Find more information at http://www.vamp-plugins.org/ . + +Although the official API for Vamp plugins is defined in C for maximum +binary compatibility, we strongly recommend using the provided C++ +classes in the SDK to implement your own plugins and hosts. + +\section plugins For Plugins + +Plugins should subclass Vamp::Plugin, and then use a +Vamp::PluginAdapter to expose the correct C API for the plugin. Read +the documentation for Vamp::PluginBase and Vamp::Plugin before +starting. + +Plugins should be compiled and linked into dynamic libraries using the +usual convention for your platform, and should link (preferably +statically) with -lvamp-sdk. Any number of plugins can reside in a +single dynamic library. See plugins.cpp in the example plugins +directory for the sort of code that will need to accompany your plugin +class or classes, to make it possible for a host to look up your +plugins properly. + +Please read the relevant README file for your platform found in the +Vamp SDK build/ directory, for details about how to ensure the +resulting dynamic library exports the correct linker symbols. + +The following example plugins are provided. You may legally reuse any +amount of the code from these examples in any plugins you write, +whether proprietary or open-source. + + - ZeroCrossing calculates the positions and density of zero-crossing + points in an audio waveform. + + - SpectralCentroid calculates the centre of gravity of the frequency + domain representation of each block of audio. + + - PowerSpectrum calculates a power spectrum from the input audio. + Actually, it doesn't do any work except calculating power from a + cartesian complex FFT output. The work of calculating this frequency + domain output is done for it by the host or host SDK; the plugin just + needs to declare that it wants frequency domain input. This is the + simplest of the example plugins. + + - AmplitudeFollower is a simple implementation of SuperCollider's + amplitude-follower algorithm. + + - PercussionOnsetDetector estimates the locations of percussive + onsets using a simple method described in "Drum Source Separation + using Percussive Feature Detection and Spectral Modulation" by Dan + Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. + + - FixedTempoEstimator calculates a single beats-per-minute value + which is an estimate of the tempo of a piece of music that is assumed + to be of fixed tempo, using autocorrelation of a frequency domain + energy rise metric. It has several outputs that return intermediate + results used in the calculation, and may be a useful example of a + plugin having several outputs with varying feature structures. + +Plugin authors should also read the Programmer's Guide at +http://vamp-plugins.org/guide.pdf . + +\section hosts For Hosts + +Hosts will normally use a Vamp::PluginHostAdapter to convert each +plugin's exposed C API back into a useful Vamp::Plugin C++ object. + +The Vamp::HostExt namespace contains several additional C++ classes to +do this work for them, and make the host's life easier: + + - Vamp::HostExt::PluginLoader provides a very easy interface for a + host to discover, load, and find out category information about the + available plugins. Most Vamp hosts will probably want to use this + class. + + - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for + hosts to handle plugins that want frequency-domain input, without + having to convert the input themselves. + + - Vamp::HostExt::PluginChannelAdapter provides a simple means for + hosts to use plugins that do not necessarily support the same number + of audio channels as they have available, without having to apply a + channel management / mixdown policy themselves. + + - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to + avoid having to negotiate the input step and block size, instead + permitting the host to use any block size they desire (and a step + size equal to it). This is particularly useful for "streaming" hosts + that cannot seek backwards in the input audio stream and so would + otherwise need to implement an additional buffer to support step + sizes smaller than the block size. + + - Vamp::HostExt::PluginSummarisingAdapter provides summarisation + methods such as mean and median averages of output features, for use + in any context where an available plugin produces individual values + but the result that is actually needed is some sort of aggregate. + +The PluginLoader class can also use the input domain, channel, and +buffering adapters automatically to make these conversions transparent +to the host if required. + +Host authors should also refer to the example host code in the host +directory of the SDK. + +Hosts should link with -lvamp-hostsdk. + +(The following notes in this section are mostly relevant for +developers that are not using the HostExt classes, or that wish to +know more about the policy they implement.) + +The Vamp API does not officially specify how to load plugin libraries +or where to find them. However, the SDK does include a function +(Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended +directory search path that hosts may use for plugin libraries, and a +class (Vamp::HostExt::PluginLoader) that implements a sensible +cross-platform lookup policy using this path. We recommend using this +class in your host unless you have a good reason not to want to. This +implementation also permits the user to set the environment variable +VAMP_PATH to override the default path if desired. + +The policy used by Vamp::HostExt::PluginLoader -- and our +recommendation for any host -- is to search each directory in this +path for .DLL (on Windows), .so (on Linux, Solaris, BSD etc) or .dylib +(on OS/X) files, then to load each one and perform a dynamic name +lookup on the vampGetPluginDescriptor function to enumerate the +plugins in the library. The example host has some code that may help, +but this operation will necessarily be system-dependent. + +Vamp also has an informal convention for sorting plugins into +functional categories. In addition to the library file itself, a +plugin library may install a category file with the same name as the +library but .cat extension. The existence and format of this file are +not specified by the Vamp API, but by convention the file may contain +lines of the format + +\code +vamp:pluginlibrary:pluginname::General Category > Specific Category +\endcode + +which a host may read and use to assign plugins a location within a +category tree for display to the user. The expectation is that +advanced users may also choose to set up their own preferred category +trees, which is why this information is not queried as part of the +Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also +provides support for plugin category lookup using this scheme. + +\section license License + +This plugin SDK is freely redistributable under a "new-style BSD" +licence. See the file COPYING for more details. In short, you may +modify and redistribute the SDK and example plugins within any +commercial or non-commercial, proprietary or open-source plugin or +application under almost any conditions, with no obligation to provide +source code, provided you retain the original copyright note. + + +*/ diff --git a/lib/vamp-2.6/src/vamp-hostsdk/Files.cpp b/lib/vamp-2.6/src/vamp-hostsdk/Files.cpp new file mode 100644 index 000000000000..8a04dab8939e --- /dev/null +++ b/lib/vamp-2.6/src/vamp-hostsdk/Files.cpp @@ -0,0 +1,277 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp + + An API for audio analysis and feature extraction plugins. + + Centre for Digital Music, Queen Mary, University of London. + Copyright 2006-2015 Chris Cannam and QMUL. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the Centre for + Digital Music; Queen Mary, University of London; and Chris Cannam + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in this Software without prior written + authorization. +*/ + +#include + +#include "Files.h" + +#include // tolower + +#include + +#ifdef _WIN32 + +#include +#include +#define PLUGIN_SUFFIX "dll" + +#else /* ! _WIN32 */ + +#include +#include + +#ifdef __APPLE__ +#define PLUGIN_SUFFIX "dylib" +#else /* ! __APPLE__ */ +#define PLUGIN_SUFFIX "so" +#endif /* ! __APPLE__ */ + +#endif /* ! _WIN32 */ + +using namespace std; + +vector +Files::listLibraryFiles() +{ + return listLibraryFilesMatching(""); +} + +vector +Files::listLibraryFilesMatching(string libraryName) +{ + vector path = Vamp::PluginHostAdapter::getPluginPath(); + vector libraryFiles; + + // we match case-insensitively + for (size_t i = 0; i < libraryName.length(); ++i) { + libraryName[i] = tolower(libraryName[i]); + } + + for (size_t i = 0; i < path.size(); ++i) { + + vector files = listFiles(path[i], PLUGIN_SUFFIX); + + for (vector::iterator fi = files.begin(); + fi != files.end(); ++fi) { + + if (libraryName != "") { + // we match case-insensitively + string temp = *fi; + for (size_t i = 0; i < temp.length(); ++i) { + temp[i] = tolower(temp[i]); + } + // libraryName should be lacking an extension, as it + // is supposed to have come from the plugin key + string::size_type pi = temp.find('.'); + if (pi == string::npos) { + if (libraryName != temp) continue; + } else { + if (libraryName != temp.substr(0, pi)) continue; + } + } + + string fullPath = path[i]; + fullPath = splicePath(fullPath, *fi); + libraryFiles.push_back(fullPath); + } + } + + return libraryFiles; +} + +void * +Files::loadLibrary(string path) +{ + void *handle = 0; +#ifdef _WIN32 +#ifdef UNICODE + int len = path.length() + 1; // cannot be more wchars than length in bytes of utf8 string + wchar_t *buffer = new wchar_t[len]; + int rv = MultiByteToWideChar(CP_UTF8, 0, path.c_str(), len, buffer, len); + if (rv <= 0) { + cerr << "Vamp::HostExt: Unable to convert library path \"" + << path << "\" to wide characters " << endl; + delete[] buffer; + return handle; + } + handle = LoadLibrary(buffer); + delete[] buffer; +#else + handle = LoadLibrary(path.c_str()); +#endif + if (!handle) { + cerr << "Vamp::HostExt: Unable to load library \"" + << path << "\"" << endl; + } +#else + handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL); + if (!handle) { + cerr << "Vamp::HostExt: Unable to load library \"" + << path << "\": " << dlerror() << endl; + } +#endif + return handle; +} + +void +Files::unloadLibrary(void *handle) +{ +#ifdef _WIN32 + FreeLibrary((HINSTANCE)handle); +#else + dlclose(handle); +#endif +} + +void * +Files::lookupInLibrary(void *handle, const char *symbol) +{ +#ifdef _WIN32 + return (void *)GetProcAddress((HINSTANCE)handle, symbol); +#else + return (void *)dlsym(handle, symbol); +#endif +} + +string +Files::lcBasename(string path) +{ + string basename(path); + + string::size_type li = basename.rfind('/'); + if (li != string::npos) basename = basename.substr(li + 1); + +#ifdef _WIN32 + li = basename.rfind('\\'); + if (li != string::npos) basename = basename.substr(li + 1); +#endif + + li = basename.find('.'); + if (li != string::npos) basename = basename.substr(0, li); + + for (size_t i = 0; i < basename.length(); ++i) { + basename[i] = tolower(basename[i]); + } + + return basename; +} + +string +Files::splicePath(string a, string b) +{ +#ifdef _WIN32 + return a + "\\" + b; +#else + return a + "/" + b; +#endif +} + +vector +Files::listFiles(string dir, string extension) +{ + vector files; + +#ifdef _WIN32 + string expression = dir + "\\*." + extension; +#ifdef UNICODE + int len = expression.length() + 1; // cannot be more wchars than length in bytes of utf8 string + wchar_t *buffer = new wchar_t[len]; + int rv = MultiByteToWideChar(CP_UTF8, 0, expression.c_str(), len, buffer, len); + if (rv <= 0) { + cerr << "Vamp::HostExt: Unable to convert wildcard path \"" + << expression << "\" to wide characters" << endl; + delete[] buffer; + return files; + } + WIN32_FIND_DATA data; + HANDLE fh = FindFirstFile(buffer, &data); + if (fh == INVALID_HANDLE_VALUE) { + delete[] buffer; + return files; + } + + bool ok = true; + while (ok) { + wchar_t *fn = data.cFileName; + int wlen = wcslen(fn) + 1; + int maxlen = wlen * 6; + char *conv = new char[maxlen]; + int rv = WideCharToMultiByte(CP_UTF8, 0, fn, wlen, conv, maxlen, 0, 0); + if (rv > 0) { + files.push_back(conv); + } + delete[] conv; + ok = FindNextFile(fh, &data); + } + + FindClose(fh); + delete[] buffer; +#else + WIN32_FIND_DATA data; + HANDLE fh = FindFirstFile(expression.c_str(), &data); + if (fh == INVALID_HANDLE_VALUE) return files; + + bool ok = true; + while (ok) { + files.push_back(data.cFileName); + ok = FindNextFile(fh, &data); + } + + FindClose(fh); +#endif +#else + + size_t extlen = extension.length(); + DIR *d = opendir(dir.c_str()); + if (!d) return files; + + struct dirent *e = 0; + while ((e = readdir(d))) { + + size_t len = strlen(e->d_name); + if (len < extlen + 2 || + e->d_name + len - extlen - 1 != "." + extension) { + continue; + } + + files.push_back(e->d_name); + } + + closedir(d); +#endif + + return files; +} diff --git a/lib/vamp-2.6/src/vamp-hostsdk/Files.h b/lib/vamp-2.6/src/vamp-hostsdk/Files.h new file mode 100644 index 000000000000..6e3fd37fe316 --- /dev/null +++ b/lib/vamp-2.6/src/vamp-hostsdk/Files.h @@ -0,0 +1,63 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp + + An API for audio analysis and feature extraction plugins. + + Centre for Digital Music, Queen Mary, University of London. + Copyright 2006-2015 Chris Cannam and QMUL. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the Centre for + Digital Music; Queen Mary, University of London; and Chris Cannam + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in this Software without prior written + authorization. +*/ + +#ifndef VAMP_FILES_H +#define VAMP_FILES_H + +#include +#include + +/** + * This is a private implementation class for the Vamp Host SDK. + */ +class Files +{ +public: + static std::vector listLibraryFiles(); + static std::vector listLibraryFilesMatching(std::string libname); + + static void *loadLibrary(std::string filename); + static void unloadLibrary(void *); + static void *lookupInLibrary(void *, const char *symbol); + + static std::string lcBasename(std::string path); + static std::string splicePath(std::string a, std::string b); + static std::vector listFiles(std::string dir, std::string ext); +}; + +#endif + + diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginBufferingAdapter.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginBufferingAdapter.cpp similarity index 94% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginBufferingAdapter.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginBufferingAdapter.cpp index 5d945e70f91f..a8747435cb8d 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/PluginBufferingAdapter.cpp +++ b/lib/vamp-2.6/src/vamp-hostsdk/PluginBufferingAdapter.cpp @@ -244,8 +244,10 @@ class PluginBufferingAdapter::Impl bool m_unrun; mutable OutputList m_outputs; mutable std::map m_rewriteOutputTimes; + std::map m_fixedRateFeatureNos; // output no -> feature no void processBlock(FeatureSet& allFeatureSets); + void adjustFixedRateFeatureTime(int outputNo, Feature &); }; PluginBufferingAdapter::PluginBufferingAdapter(Plugin *plugin) : @@ -564,6 +566,8 @@ PluginBufferingAdapter::Impl::reset() m_queue[i]->reset(); } + m_fixedRateFeatureNos.clear(); + m_plugin->reset(); } @@ -607,6 +611,25 @@ PluginBufferingAdapter::Impl::process(const float *const *inputBuffers, return allFeatureSets; } +void +PluginBufferingAdapter::Impl::adjustFixedRateFeatureTime(int outputNo, + Feature &feature) +{ + if (feature.hasTimestamp) { + double secs = feature.timestamp.sec; + secs += feature.timestamp.nsec / 1e9; + m_fixedRateFeatureNos[outputNo] = + int(secs * double(m_outputs[outputNo].sampleRate) + 0.5); + } + + feature.timestamp = RealTime::fromSeconds + (m_fixedRateFeatureNos[outputNo] / double(m_outputs[outputNo].sampleRate)); + + feature.hasTimestamp = true; + + m_fixedRateFeatureNos[outputNo] = m_fixedRateFeatureNos[outputNo] + 1; +} + PluginBufferingAdapter::FeatureSet PluginBufferingAdapter::Impl::getRemainingFeatures() { @@ -631,9 +654,18 @@ PluginBufferingAdapter::Impl::getRemainingFeatures() for (map::iterator iter = featureSet.begin(); iter != featureSet.end(); ++iter) { + + int outputNo = iter->first; FeatureList featureList = iter->second; + for (size_t i = 0; i < featureList.size(); ++i) { - allFeatureSets[iter->first].push_back(featureList[i]); + + if (m_outputs[outputNo].sampleType == + OutputDescriptor::FixedSampleRate) { + adjustFixedRateFeatureTime(outputNo, featureList[i]); + } + + allFeatureSets[outputNo].push_back(featureList[i]); } } @@ -681,15 +713,12 @@ PluginBufferingAdapter::Impl::processBlock(FeatureSet& allFeatureSets) break; case OutputDescriptor::FixedSampleRate: - // use our internal timestamp if feature lacks one - if (!featureList[i].hasTimestamp) { - featureList[i].timestamp = timestamp + adjustment; - featureList[i].hasTimestamp = true; - } + adjustFixedRateFeatureTime(outputNo, featureList[i]); break; case OutputDescriptor::VariableSampleRate: - break; // plugin must set timestamp + // plugin must set timestamp + break; default: break; diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginChannelAdapter.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginChannelAdapter.cpp similarity index 100% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginChannelAdapter.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginChannelAdapter.cpp diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginHostAdapter.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginHostAdapter.cpp similarity index 98% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginHostAdapter.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginHostAdapter.cpp index f5a9119c96b1..2cac617a6c3d 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/PluginHostAdapter.cpp +++ b/lib/vamp-2.6/src/vamp-hostsdk/PluginHostAdapter.cpp @@ -37,7 +37,7 @@ #include #include -#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 3 ) +#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 6 ) #error Unexpected version of Vamp SDK header included #endif @@ -265,7 +265,11 @@ PluginHostAdapter::getCurrentProgram() const if (!m_handle) return ""; int pn = m_descriptor->getCurrentProgram(m_handle); - return m_descriptor->programs[pn]; + if (pn < (int)m_descriptor->programCount) { + return m_descriptor->programs[pn]; + } else { + return ""; + } } void diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginInputDomainAdapter.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginInputDomainAdapter.cpp similarity index 88% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginInputDomainAdapter.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginInputDomainAdapter.cpp index 5429483ed238..2bf396eb7619 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/PluginInputDomainAdapter.cpp +++ b/lib/vamp-2.6/src/vamp-hostsdk/PluginInputDomainAdapter.cpp @@ -39,8 +39,6 @@ #include -// http://msdn.microsoft.com/en-us/library/4hwaceh6(v=vs.80).aspx -#define _USE_MATH_DEFINES #include #include "Window.h" @@ -71,6 +69,9 @@ */ #ifdef HAVE_FFTW3 #include +#warning "Compiling with FFTW3 support will result in a GPL binary" +#else +#include "../vamp-sdk/FFTimpl.cpp" #endif @@ -125,8 +126,6 @@ class PluginInputDomainAdapter::Impl #else double *m_ro; double *m_io; - void fft(unsigned int n, bool inverse, - double *ri, double *ii, double *ro, double *io); #endif FeatureSet processShiftingTimestamp(const float *const *inputBuffers, RealTime timestamp); @@ -293,10 +292,12 @@ PluginInputDomainAdapter::Impl::initialise(size_t channels, size_t stepSize, siz return false; } +#ifndef HAVE_FFTW3 if (blockSize & (blockSize-1)) { std::cerr << "ERROR: PluginInputDomainAdapter::initialise: non-power-of-two\nblocksize " << blockSize << " not supported" << std::endl; return false; } +#endif if (m_channels > 0) { for (int c = 0; c < m_channels; ++c) { @@ -507,7 +508,14 @@ PluginInputDomainAdapter::Impl::processShiftingTimestamp(const float *const *inp RealTime timestamp) { if (m_method == ShiftTimestamp) { + // we may need to add one nsec if timestamp + + // getTimestampAdjustment() rounds down timestamp = timestamp + getTimestampAdjustment(); + RealTime nsec(0, 1); + if (RealTime::realTime2Frame(timestamp, m_inputSampleRate) < + RealTime::realTime2Frame(timestamp + nsec, m_inputSampleRate)) { + timestamp = timestamp + nsec; + } } for (int c = 0; c < m_channels; ++c) { @@ -603,123 +611,6 @@ PluginInputDomainAdapter::Impl::processShiftingData(const float *const *inputBuf #ifndef HAVE_FFTW3 -void -PluginInputDomainAdapter::Impl::fft(unsigned int n, bool inverse, - double *ri, double *ii, double *ro, double *io) -{ - if (!ri || !ro || !io) return; - - unsigned int bits; - unsigned int i, j, k, m; - unsigned int blockSize, blockEnd; - - double tr, ti; - - if (n < 2) return; - if (n & (n-1)) return; - - double angle = 2.0 * M_PI; - if (inverse) angle = -angle; - - for (i = 0; ; ++i) { - if (n & (1 << i)) { - bits = i; - break; - } - } - - static unsigned int tableSize = 0; - static int *table = 0; - - if (tableSize != n) { - - delete[] table; - - table = new int[n]; - - for (i = 0; i < n; ++i) { - - m = i; - - for (j = k = 0; j < bits; ++j) { - k = (k << 1) | (m & 1); - m >>= 1; - } - - table[i] = k; - } - - tableSize = n; - } - - if (ii) { - for (i = 0; i < n; ++i) { - ro[table[i]] = ri[i]; - io[table[i]] = ii[i]; - } - } else { - for (i = 0; i < n; ++i) { - ro[table[i]] = ri[i]; - io[table[i]] = 0.0; - } - } - - blockEnd = 1; - - for (blockSize = 2; blockSize <= n; blockSize <<= 1) { - - double delta = angle / (double)blockSize; - double sm2 = -sin(-2 * delta); - double sm1 = -sin(-delta); - double cm2 = cos(-2 * delta); - double cm1 = cos(-delta); - double w = 2 * cm1; - double ar[3], ai[3]; - - for (i = 0; i < n; i += blockSize) { - - ar[2] = cm2; - ar[1] = cm1; - - ai[2] = sm2; - ai[1] = sm1; - - for (j = i, m = 0; m < blockEnd; j++, m++) { - - ar[0] = w * ar[1] - ar[2]; - ar[2] = ar[1]; - ar[1] = ar[0]; - - ai[0] = w * ai[1] - ai[2]; - ai[2] = ai[1]; - ai[1] = ai[0]; - - k = j + blockEnd; - tr = ar[0] * ro[k] - ai[0] * io[k]; - ti = ar[0] * io[k] + ai[0] * ro[k]; - - ro[k] = ro[j] - tr; - io[k] = io[j] - ti; - - ro[j] += tr; - io[j] += ti; - } - } - - blockEnd = blockSize; - } - - if (inverse) { - - double denom = (double)n; - - for (i = 0; i < n; i++) { - ro[i] /= denom; - io[i] /= denom; - } - } -} - #endif } diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginLoader.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginLoader.cpp similarity index 64% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginLoader.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginLoader.cpp index 0ff362ab270e..c5e8d39b0fbc 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/PluginLoader.cpp +++ b/lib/vamp-2.6/src/vamp-hostsdk/PluginLoader.cpp @@ -34,35 +34,17 @@ authorization. */ -#include #include #include #include #include +#include -#include -#include // tolower - -#include - -#ifdef _WIN32 - -#include -#include -#define PLUGIN_SUFFIX "dll" - -#else /* ! _WIN32 */ - -#include -#include +#include -#ifdef __APPLE__ -#define PLUGIN_SUFFIX "dylib" -#else /* ! __APPLE__ */ -#define PLUGIN_SUFFIX "so" -#endif /* ! __APPLE__ */ +#include "Files.h" -#endif /* ! _WIN32 */ +#include using namespace std; @@ -124,13 +106,6 @@ class PluginLoader::Impl bool decomposePluginKey(PluginKey key, string &libraryName, string &identifier); - void *loadLibrary(string path); - void unloadLibrary(void *handle); - void *lookupInLibrary(void *handle, const char *symbol); - - string splicePath(string a, string b); - vector listFiles(string dir, string ext); - static InstanceCleaner m_cleaner; }; @@ -227,83 +202,64 @@ PluginLoader::Impl::listPlugins() void PluginLoader::Impl::enumeratePlugins(PluginKey forPlugin) { - vector path = PluginHostAdapter::getPluginPath(); - string libraryName, identifier; + vector fullPaths; + if (forPlugin != "") { if (!decomposePluginKey(forPlugin, libraryName, identifier)) { std::cerr << "WARNING: Vamp::HostExt::PluginLoader: Invalid plugin key \"" << forPlugin << "\" in enumerate" << std::endl; return; } + fullPaths = Files::listLibraryFilesMatching(libraryName); + } else { + fullPaths = Files::listLibraryFiles(); } - for (size_t i = 0; i < path.size(); ++i) { - - vector files = listFiles(path[i], PLUGIN_SUFFIX); + for (size_t i = 0; i < fullPaths.size(); ++i) { - for (vector::iterator fi = files.begin(); - fi != files.end(); ++fi) { + string fullPath = fullPaths[i]; + void *handle = Files::loadLibrary(fullPath); + if (!handle) continue; - if (libraryName != "") { - // libraryName is lowercased and lacking an extension, - // as it came from the plugin key - string temp = *fi; - for (size_t i = 0; i < temp.length(); ++i) { - temp[i] = tolower(temp[i]); - } - string::size_type pi = temp.find('.'); - if (pi == string::npos) { - if (libraryName != temp) continue; - } else { - if (libraryName != temp.substr(0, pi)) continue; - } - } - - string fullPath = path[i]; - fullPath = splicePath(fullPath, *fi); - void *handle = loadLibrary(fullPath); - if (!handle) continue; - - VampGetPluginDescriptorFunction fn = - (VampGetPluginDescriptorFunction)lookupInLibrary - (handle, "vampGetPluginDescriptor"); + VampGetPluginDescriptorFunction fn = + (VampGetPluginDescriptorFunction)Files::lookupInLibrary + (handle, "vampGetPluginDescriptor"); - if (!fn) { - if (forPlugin != "") { - cerr << "Vamp::HostExt::PluginLoader: No vampGetPluginDescriptor function found in library \"" - << fullPath << "\"" << endl; - } - unloadLibrary(handle); - continue; + if (!fn) { + if (forPlugin != "") { + cerr << "Vamp::HostExt::PluginLoader: No vampGetPluginDescriptor function found in library \"" + << fullPath << "\"" << endl; } + Files::unloadLibrary(handle); + continue; + } - int index = 0; - const VampPluginDescriptor *descriptor = 0; - bool found = false; + int index = 0; + const VampPluginDescriptor *descriptor = 0; + bool found = false; - while ((descriptor = fn(VAMP_API_VERSION, index))) { - ++index; - if (identifier != "") { - if (descriptor->identifier != identifier) continue; - } - found = true; - PluginKey key = composePluginKey(*fi, descriptor->identifier); + while ((descriptor = fn(VAMP_API_VERSION, index))) { + ++index; + if (identifier != "") { + if (descriptor->identifier != identifier) continue; + } + found = true; + PluginKey key = composePluginKey(fullPath, descriptor->identifier); // std::cerr << "enumerate: " << key << " (path: " << fullPath << ")" << std::endl; - if (m_pluginLibraryNameMap.find(key) == - m_pluginLibraryNameMap.end()) { - m_pluginLibraryNameMap[key] = fullPath; - } + if (m_pluginLibraryNameMap.find(key) == + m_pluginLibraryNameMap.end()) { + m_pluginLibraryNameMap[key] = fullPath; } + } - if (!found && forPlugin != "") { - cerr << "Vamp::HostExt::PluginLoader: Plugin \"" - << identifier << "\" not found in library \"" - << fullPath << "\"" << endl; - } - - unloadLibrary(handle); + if (!found && forPlugin != "") { + cerr << "Vamp::HostExt::PluginLoader: Plugin \"" + << identifier << "\" not found in library \"" + << fullPath << "\"" << endl; } + + Files::unloadLibrary(handle); } if (forPlugin == "") m_allPluginsEnumerated = true; @@ -312,18 +268,7 @@ PluginLoader::Impl::enumeratePlugins(PluginKey forPlugin) PluginLoader::PluginKey PluginLoader::Impl::composePluginKey(string libraryName, string identifier) { - string basename = libraryName; - - string::size_type li = basename.rfind('/'); - if (li != string::npos) basename = basename.substr(li + 1); - - li = basename.find('.'); - if (li != string::npos) basename = basename.substr(0, li); - - for (size_t i = 0; i < basename.length(); ++i) { - basename[i] = tolower(basename[i]); - } - + string basename = Files::lcBasename(libraryName); return basename + ":" + identifier; } @@ -382,17 +327,17 @@ PluginLoader::Impl::loadPlugin(PluginKey key, return 0; } - void *handle = loadLibrary(fullPath); + void *handle = Files::loadLibrary(fullPath); if (!handle) return 0; VampGetPluginDescriptorFunction fn = - (VampGetPluginDescriptorFunction)lookupInLibrary + (VampGetPluginDescriptorFunction)Files::lookupInLibrary (handle, "vampGetPluginDescriptor"); if (!fn) { cerr << "Vamp::HostExt::PluginLoader: No vampGetPluginDescriptor function found in library \"" << fullPath << "\"" << endl; - unloadLibrary(handle); + Files::unloadLibrary(handle); return 0; } @@ -474,12 +419,12 @@ PluginLoader::Impl::generateTaxonomy() for (vector::iterator i = catpath.begin(); i != catpath.end(); ++i) { - vector files = listFiles(*i, suffix); + vector files = Files::listFiles(*i, suffix); for (vector::iterator fi = files.begin(); fi != files.end(); ++fi) { - string filepath = splicePath(*i, *fi); + string filepath = Files::splicePath(*i, *fi); ifstream is(filepath.c_str(), ifstream::in | ifstream::binary); if (is.fail()) { @@ -525,154 +470,11 @@ PluginLoader::Impl::generateTaxonomy() } } -void * -PluginLoader::Impl::loadLibrary(string path) -{ - void *handle = 0; -#ifdef _WIN32 -#ifdef UNICODE - int len = path.length() + 1; // cannot be more wchars than length in bytes of utf8 string - wchar_t *buffer = new wchar_t[len]; - int rv = MultiByteToWideChar(CP_UTF8, 0, path.c_str(), len, buffer, len); - if (rv <= 0) { - cerr << "Vamp::HostExt::PluginLoader: Unable to convert library path \"" - << path << "\" to wide characters " << endl; - delete[] buffer; - return handle; - } - handle = LoadLibrary(buffer); - delete[] buffer; -#else - handle = LoadLibrary(path.c_str()); -#endif - if (!handle) { - cerr << "Vamp::HostExt::PluginLoader: Unable to load library \"" - << path << "\"" << endl; - } -#else - handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL); - if (!handle) { - cerr << "Vamp::HostExt::PluginLoader: Unable to load library \"" - << path << "\": " << dlerror() << endl; - } -#endif - return handle; -} - -void -PluginLoader::Impl::unloadLibrary(void *handle) -{ -#ifdef _WIN32 - FreeLibrary((HINSTANCE)handle); -#else - dlclose(handle); -#endif -} - -void * -PluginLoader::Impl::lookupInLibrary(void *handle, const char *symbol) -{ -#ifdef _WIN32 - return (void *)GetProcAddress((HINSTANCE)handle, symbol); -#else - return (void *)dlsym(handle, symbol); -#endif -} - -string -PluginLoader::Impl::splicePath(string a, string b) -{ -#ifdef _WIN32 - return a + "\\" + b; -#else - return a + "/" + b; -#endif -} - -vector -PluginLoader::Impl::listFiles(string dir, string extension) -{ - vector files; - -#ifdef _WIN32 - string expression = dir + "\\*." + extension; -#ifdef UNICODE - int len = expression.length() + 1; // cannot be more wchars than length in bytes of utf8 string - wchar_t *buffer = new wchar_t[len]; - int rv = MultiByteToWideChar(CP_UTF8, 0, expression.c_str(), len, buffer, len); - if (rv <= 0) { - cerr << "Vamp::HostExt::PluginLoader: Unable to convert wildcard path \"" - << expression << "\" to wide characters" << endl; - delete[] buffer; - return files; - } - WIN32_FIND_DATA data; - HANDLE fh = FindFirstFile(buffer, &data); - if (fh == INVALID_HANDLE_VALUE) { - delete[] buffer; - return files; - } - - bool ok = true; - while (ok) { - wchar_t *fn = data.cFileName; - int wlen = wcslen(fn) + 1; - int maxlen = wlen * 6; - char *conv = new char[maxlen]; - int rv = WideCharToMultiByte(CP_UTF8, 0, fn, wlen, conv, maxlen, 0, 0); - if (rv > 0) { - files.push_back(conv); - } - delete[] conv; - ok = FindNextFile(fh, &data); - } - - FindClose(fh); - delete[] buffer; -#else - WIN32_FIND_DATA data; - HANDLE fh = FindFirstFile(expression.c_str(), &data); - if (fh == INVALID_HANDLE_VALUE) return files; - - bool ok = true; - while (ok) { - files.push_back(data.cFileName); - ok = FindNextFile(fh, &data); - } - - FindClose(fh); -#endif -#else - - size_t extlen = extension.length(); - DIR *d = opendir(dir.c_str()); - if (!d) return files; - - struct dirent *e = 0; - while ((e = readdir(d))) { - - if (!e->d_name) continue; - - size_t len = strlen(e->d_name); - if (len < extlen + 2 || - e->d_name + len - extlen - 1 != "." + extension) { - continue; - } - - files.push_back(e->d_name); - } - - closedir(d); -#endif - - return files; -} - void PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) { void *handle = m_pluginLibraryHandleMap[adapter]; - if (handle) unloadLibrary(handle); + if (handle) Files::unloadLibrary(handle); m_pluginLibraryHandleMap.erase(adapter); } diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginSummarisingAdapter.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginSummarisingAdapter.cpp similarity index 98% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginSummarisingAdapter.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginSummarisingAdapter.cpp index 6b392b7fa3c1..b6621340fff4 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/PluginSummarisingAdapter.cpp +++ b/lib/vamp-2.6/src/vamp-hostsdk/PluginSummarisingAdapter.cpp @@ -38,8 +38,6 @@ #include #include -// http://msdn.microsoft.com/en-us/library/4hwaceh6(v=vs.80).aspx -#define _USE_MATH_DEFINES #include #include @@ -222,8 +220,7 @@ PluginSummarisingAdapter::Impl::~Impl() } bool -PluginSummarisingAdapter::Impl::initialise(size_t channels, - size_t stepSize, size_t blockSize) +PluginSummarisingAdapter::Impl::initialise(size_t, size_t stepSize, size_t blockSize) { m_stepSize = stepSize; m_blockSize = blockSize; @@ -453,7 +450,7 @@ void PluginSummarisingAdapter::Impl::accumulate(int output, const Feature &f, RealTime timestamp, - bool final) + bool /* final */) { // What should happen if a feature's duration spans a segment // boundary? I think we probably want to chop it, and pretend @@ -568,8 +565,6 @@ PluginSummarisingAdapter::Impl::accumulateFinalDurations() if (acount == 0) continue; - RealTime prevTimestamp = i->second; - #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER std::cerr << "output " << output << ": "; #endif @@ -633,9 +628,6 @@ PluginSummarisingAdapter::Impl::findSegmentBounds(RealTime t, void PluginSummarisingAdapter::Impl::segment() { - SegmentBoundaries::iterator boundaryitr = m_boundaries.begin(); - RealTime segmentStart = RealTime::zeroTime; - #ifdef DEBUG_PLUGIN_SUMMARISING_ADAPTER_SEGMENT std::cerr << "segment: starting" << std::endl; #endif diff --git a/lib/vamp-2.3/src/vamp-hostsdk/PluginWrapper.cpp b/lib/vamp-2.6/src/vamp-hostsdk/PluginWrapper.cpp similarity index 100% rename from lib/vamp-2.3/src/vamp-hostsdk/PluginWrapper.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/PluginWrapper.cpp diff --git a/lib/vamp-2.3/src/vamp-hostsdk/RealTime.cpp b/lib/vamp-2.6/src/vamp-hostsdk/RealTime.cpp similarity index 100% rename from lib/vamp-2.3/src/vamp-hostsdk/RealTime.cpp rename to lib/vamp-2.6/src/vamp-hostsdk/RealTime.cpp diff --git a/lib/vamp-2.3/src/vamp-hostsdk/Window.h b/lib/vamp-2.6/src/vamp-hostsdk/Window.h similarity index 96% rename from lib/vamp-2.3/src/vamp-hostsdk/Window.h rename to lib/vamp-2.6/src/vamp-hostsdk/Window.h index 521236d78d93..bb1c53743492 100644 --- a/lib/vamp-2.3/src/vamp-hostsdk/Window.h +++ b/lib/vamp-2.6/src/vamp-hostsdk/Window.h @@ -39,15 +39,9 @@ #include -// http://msdn.microsoft.com/en-us/library/4hwaceh6(v=vs.80).aspx -#define _USE_MATH_DEFINES #include #include -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - _VAMP_SDK_HOSTSPACE_BEGIN(Window.h) template diff --git a/lib/vamp-2.6/src/vamp-sdk/FFT.cpp b/lib/vamp-2.6/src/vamp-sdk/FFT.cpp new file mode 100644 index 000000000000..ce563bdd89cf --- /dev/null +++ b/lib/vamp-2.6/src/vamp-sdk/FFT.cpp @@ -0,0 +1,75 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp + + An API for audio analysis and feature extraction plugins. + + Centre for Digital Music, Queen Mary, University of London. + Copyright 2006-2012 Chris Cannam and QMUL. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the Centre for + Digital Music; Queen Mary, University of London; and Chris Cannam + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in this Software without prior written + authorization. +*/ + +#include + +#include + +#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 6 ) +#error Unexpected version of Vamp SDK header included +#endif + +#ifdef _MSC_VER +#include +#include +#endif + +_VAMP_SDK_PLUGSPACE_BEGIN(FFT.cpp) + +namespace Vamp { + +#include "FFTimpl.cpp" + +void +FFT::forward(unsigned int n, + const double *ri, const double *ii, + double *ro, double *io) +{ + fft(n, false, ri, ii, ro, io); +} + +void +FFT::inverse(unsigned int n, + const double *ri, const double *ii, + double *ro, double *io) +{ + fft(n, true, ri, ii, ro, io); +} + +} + +_VAMP_SDK_PLUGSPACE_END(FFT.cpp) + diff --git a/lib/vamp-2.6/src/vamp-sdk/FFTimpl.cpp b/lib/vamp-2.6/src/vamp-sdk/FFTimpl.cpp new file mode 100644 index 000000000000..95fcee43b295 --- /dev/null +++ b/lib/vamp-2.6/src/vamp-sdk/FFTimpl.cpp @@ -0,0 +1,116 @@ + +/* Public domain FFT implementation from Don Cross. */ + +static void +fft(unsigned int n, bool inverse, + const double *ri, const double *ii, + double *ro, double *io) +{ + if (!ri || !ro || !io) return; + + unsigned int bits; + unsigned int i, j, k, m; + unsigned int blockSize, blockEnd; + + double tr, ti; + + if (n < 2) return; + if (n & (n-1)) return; + + double angle = 2.0 * M_PI; + if (inverse) angle = -angle; + + for (i = 0; ; ++i) { + if (n & (1 << i)) { + bits = i; + break; + } + } + +#ifdef _MSC_VER + int *table = (int *)_malloca(n * sizeof(int)); +#else + int table[n]; +#endif + + for (i = 0; i < n; ++i) { + m = i; + for (j = k = 0; j < bits; ++j) { + k = (k << 1) | (m & 1); + m >>= 1; + } + table[i] = k; + } + + if (ii) { + for (i = 0; i < n; ++i) { + ro[table[i]] = ri[i]; + io[table[i]] = ii[i]; + } + } else { + for (i = 0; i < n; ++i) { + ro[table[i]] = ri[i]; + io[table[i]] = 0.0; + } + } + + blockEnd = 1; + + for (blockSize = 2; blockSize <= n; blockSize <<= 1) { + + double delta = angle / (double)blockSize; + double sm2 = -sin(-2 * delta); + double sm1 = -sin(-delta); + double cm2 = cos(-2 * delta); + double cm1 = cos(-delta); + double w = 2 * cm1; + double ar[3], ai[3]; + + for (i = 0; i < n; i += blockSize) { + + ar[2] = cm2; + ar[1] = cm1; + + ai[2] = sm2; + ai[1] = sm1; + + for (j = i, m = 0; m < blockEnd; j++, m++) { + + ar[0] = w * ar[1] - ar[2]; + ar[2] = ar[1]; + ar[1] = ar[0]; + + ai[0] = w * ai[1] - ai[2]; + ai[2] = ai[1]; + ai[1] = ai[0]; + + k = j + blockEnd; + tr = ar[0] * ro[k] - ai[0] * io[k]; + ti = ar[0] * io[k] + ai[0] * ro[k]; + + ro[k] = ro[j] - tr; + io[k] = io[j] - ti; + + ro[j] += tr; + io[j] += ti; + } + } + + blockEnd = blockSize; + } + + if (inverse) { + + double denom = (double)n; + + for (i = 0; i < n; i++) { + ro[i] /= denom; + io[i] /= denom; + } + } + +#ifdef _MSC_VER + _freea(table); +#endif +} + diff --git a/lib/vamp-2.3/src/vamp-sdk/PluginAdapter.cpp b/lib/vamp-2.6/src/vamp-sdk/PluginAdapter.cpp similarity index 99% rename from lib/vamp-2.3/src/vamp-sdk/PluginAdapter.cpp rename to lib/vamp-2.6/src/vamp-sdk/PluginAdapter.cpp index 32568a135a53..02e114df20d1 100644 --- a/lib/vamp-2.3/src/vamp-sdk/PluginAdapter.cpp +++ b/lib/vamp-2.6/src/vamp-sdk/PluginAdapter.cpp @@ -39,7 +39,7 @@ #include #include -#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 3 ) +#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 6 ) #error Unexpected version of Vamp SDK header included #endif @@ -588,7 +588,7 @@ PluginAdapterBase::Impl::vampGetRemainingFeatures(VampPluginHandle handle) } void -PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *fs) +PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *) { #ifdef DEBUG_PLUGIN_ADAPTER std::cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << std::endl; diff --git a/lib/vamp-2.3/src/vamp-sdk/RealTime.cpp b/lib/vamp-2.6/src/vamp-sdk/RealTime.cpp similarity index 100% rename from lib/vamp-2.3/src/vamp-sdk/RealTime.cpp rename to lib/vamp-2.6/src/vamp-sdk/RealTime.cpp diff --git a/lib/vamp-2.3/vamp-hostsdk/Plugin.h b/lib/vamp-2.6/vamp-hostsdk/Plugin.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/Plugin.h rename to lib/vamp-2.6/vamp-hostsdk/Plugin.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginBase.h b/lib/vamp-2.6/vamp-hostsdk/PluginBase.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginBase.h rename to lib/vamp-2.6/vamp-hostsdk/PluginBase.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginBufferingAdapter.h b/lib/vamp-2.6/vamp-hostsdk/PluginBufferingAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginBufferingAdapter.h rename to lib/vamp-2.6/vamp-hostsdk/PluginBufferingAdapter.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginChannelAdapter.h b/lib/vamp-2.6/vamp-hostsdk/PluginChannelAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginChannelAdapter.h rename to lib/vamp-2.6/vamp-hostsdk/PluginChannelAdapter.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginHostAdapter.h b/lib/vamp-2.6/vamp-hostsdk/PluginHostAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginHostAdapter.h rename to lib/vamp-2.6/vamp-hostsdk/PluginHostAdapter.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginInputDomainAdapter.h b/lib/vamp-2.6/vamp-hostsdk/PluginInputDomainAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginInputDomainAdapter.h rename to lib/vamp-2.6/vamp-hostsdk/PluginInputDomainAdapter.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginLoader.h b/lib/vamp-2.6/vamp-hostsdk/PluginLoader.h similarity index 98% rename from lib/vamp-2.3/vamp-hostsdk/PluginLoader.h rename to lib/vamp-2.6/vamp-hostsdk/PluginLoader.h index eadaf03f9207..c511301f51e9 100644 --- a/lib/vamp-2.3/vamp-hostsdk/PluginLoader.h +++ b/lib/vamp-2.6/vamp-hostsdk/PluginLoader.h @@ -66,6 +66,9 @@ namespace HostExt { * class, and are certainly not required to use this actual class. * But we do strongly recommend it. * + * This class is not thread-safe; use it from a single application + * thread, or guard access to it with a mutex. + * * \note This class was introduced in version 1.1 of the Vamp plugin SDK. */ diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginSummarisingAdapter.h b/lib/vamp-2.6/vamp-hostsdk/PluginSummarisingAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginSummarisingAdapter.h rename to lib/vamp-2.6/vamp-hostsdk/PluginSummarisingAdapter.h diff --git a/lib/vamp-2.3/vamp-hostsdk/PluginWrapper.h b/lib/vamp-2.6/vamp-hostsdk/PluginWrapper.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/PluginWrapper.h rename to lib/vamp-2.6/vamp-hostsdk/PluginWrapper.h diff --git a/lib/vamp-2.3/vamp-hostsdk/RealTime.h b/lib/vamp-2.6/vamp-hostsdk/RealTime.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/RealTime.h rename to lib/vamp-2.6/vamp-hostsdk/RealTime.h diff --git a/lib/vamp-2.6/vamp-hostsdk/host-c.h b/lib/vamp-2.6/vamp-hostsdk/host-c.h new file mode 100644 index 000000000000..aad9b34c7d47 --- /dev/null +++ b/lib/vamp-2.6/vamp-hostsdk/host-c.h @@ -0,0 +1,147 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp + + An API for audio analysis and feature extraction plugins. + + Centre for Digital Music, Queen Mary, University of London. + Copyright 2006-2015 Chris Cannam and QMUL. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the Centre for + Digital Music; Queen Mary, University of London; and Chris Cannam + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in this Software without prior written + authorization. +*/ + +/* + This file defines a low-level API for enumerating and loading + plugin libraries using C calling conventions. It could be used in + C programs, or in languages with C-compatible foreign-function + interfaces. Note that this works by calling to the C++ Vamp host + SDK, so any program using this interface must still link against + the rest of the Vamp plugin library and the C++ standard library. + + This is not the simplest or easiest interface for hosting Vamp + plugins -- if you have the capability to use the C++ API, please + do that instead. (Most programs should not even include this + header.) + + The C and C++ interfaces provide different abstraction levels: + + In the C++ interface, the class PluginLoader provides a list of + keys corresponding to the installed plugins (where a key combines + the plugin's library name and plugin identifier into a single + string) plus a method to load a single plugin based on its key + (obtaining an instance of class Plugin). With the C++ interface + you go straight from the key to a live instance of the plugin. The + PluginLoader also provides various facilities to adapt the plugin + based on your requirements (e.g. to do time- to frequency-domain + conversion for you if the plugin requires it). + + This low-level C interface, on the other hand, deals only in + plugin libraries and static descriptors, not in plugin + instances. You can enumerate the installed libraries, getting just + the base .soname of each library. Then you can retrieve each of + the raw C plugin descriptors from a library, and use the + descriptor (whose interface is defined in vamp/vamp.h) to + instantiate the plugin. + + So this header corresponds to the first part of the PluginLoader + class interface: finding and loading plugin libraries and + retrieving plugin descriptors from them. But it does not do any of + the rest, i.e. instantiating and adapting the plugins themselves. + Although this makes the API appear very simple, it means the + resulting plugins are relatively hard to use compared to those + obtained by the PluginLoader API. There is no way to get to the + full C++ abstraction using this API. + + This API is not thread-safe; use it from a single application + thread, or guard access to it with a mutex. + + This header was introduced in version 2.6 of the Vamp plugin SDK. +*/ + +#ifndef VAMPHOST_C_H_INCLUDED +#define VAMPHOST_C_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct vhLibrary_t *vhLibrary; + +/** + * Return the number of Vamp plugin libraries discovered in the + * installation path. This number will remain fixed after the first + * call -- plugins are only discovered once, the first time this + * function is called. + */ +extern int vhGetLibraryCount(); + +/** + * Return the library name (base soname) of the library with the given + * index, in the range 0..(vhGetLibraryCount()-1). + */ +extern const char *vhGetLibraryName(int library); + +/** + * Return the library index for the given library name, or -1 if the + * name is not known. + */ +extern int vhGetLibraryIndex(const char *name); + +/** + * Load the library with the given index. If the library cannot be + * loaded for any reason, the return value is 0; otherwise it is an + * opaque pointer suitable for passing to other functions in this API. + */ +extern vhLibrary vhLoadLibrary(int library); + +/** + * Return the number of Vamp plugins in the given library. + */ +extern int vhGetPluginCount(vhLibrary library); + +/** + * Return a Vamp plugin descriptor for a plugin in a given + * library. This simply calls the vampGetPluginDescriptor function in + * that library with the given plugin index and returns the + * result. See vamp/vamp.h for details about the plugin descriptor. + */ +extern const VampPluginDescriptor *vhGetPluginDescriptor(vhLibrary library, + int plugin); + +/** + * Unload a plugin library. Do not do this while any of its plugins + * are still in use. + */ +extern void vhUnloadLibrary(vhLibrary); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/vamp-2.3/vamp-hostsdk/hostguard.h b/lib/vamp-2.6/vamp-hostsdk/hostguard.h similarity index 96% rename from lib/vamp-2.3/vamp-hostsdk/hostguard.h rename to lib/vamp-2.6/vamp-hostsdk/hostguard.h index 3698d84cd709..24e4d4b3e66c 100644 --- a/lib/vamp-2.3/vamp-hostsdk/hostguard.h +++ b/lib/vamp-2.6/vamp-hostsdk/hostguard.h @@ -43,6 +43,10 @@ #define _VAMP_IN_HOSTSDK +#define VAMP_SDK_VERSION "2.6" +#define VAMP_SDK_MAJOR_VERSION 2 +#define VAMP_SDK_MINOR_VERSION 6 + #ifdef _VAMP_NO_HOST_NAMESPACE #define _VAMP_SDK_HOSTSPACE_BEGIN(h) #define _VAMP_SDK_HOSTSPACE_END(h) diff --git a/lib/vamp-2.3/vamp-hostsdk/vamp-hostsdk.h b/lib/vamp-2.6/vamp-hostsdk/vamp-hostsdk.h similarity index 100% rename from lib/vamp-2.3/vamp-hostsdk/vamp-hostsdk.h rename to lib/vamp-2.6/vamp-hostsdk/vamp-hostsdk.h diff --git a/lib/vamp-2.6/vamp-sdk/FFT.h b/lib/vamp-2.6/vamp-sdk/FFT.h new file mode 100644 index 000000000000..f7082d8af206 --- /dev/null +++ b/lib/vamp-2.6/vamp-sdk/FFT.h @@ -0,0 +1,100 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp + + An API for audio analysis and feature extraction plugins. + + Centre for Digital Music, Queen Mary, University of London. + Copyright 2006-2012 Chris Cannam and QMUL. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the Centre for + Digital Music; Queen Mary, University of London; and Chris Cannam + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in this Software without prior written + authorization. +*/ + +#ifndef _VAMP_FFT_H_ +#define _VAMP_FFT_H_ + +#include "plugguard.h" +_VAMP_SDK_PLUGSPACE_BEGIN(FFT.h) + +namespace Vamp { + +/** + * A simple FFT implementation provided for convenience of plugin + * authors. + * + * This class provides double-precision FFTs in power-of-two sizes + * only. It is slower than more sophisticated library + * implementations. If these requirements aren't suitable, make other + * arrangements. + * + * The inverse transform is scaled by 1/n. + * + * The implementation is from Don Cross's public domain FFT code. + */ +class FFT +{ +public: + /** + * Calculate a forward transform of size n. + * n must be a power of 2, greater than 1. + * + * ri and ii must point to the real and imaginary component arrays + * of the input. For real input, ii may be NULL. + * + * ro and io must point to enough space to receive the real and + * imaginary component arrays of the output. + * + * All input and output arrays are of size n. + */ + static void forward(unsigned int n, + const double *ri, const double *ii, + double *ro, double *io); + + /** + * Calculate an inverse transform of size n. + * n must be a power of 2, greater than 1. + * + * ri and ii must point to the real and imaginary component arrays + * of the input. For real input, ii may be NULL. + * + * ro and io must point to enough space to receive the real and + * imaginary component arrays of the output. The output is scaled + * by 1/n. The output pointers may not be NULL, even if the output + * is expected to be real. + * + * All input and output arrays are of size n. + */ + static void inverse(unsigned int n, + const double *ri, const double *ii, + double *ro, double *io); +}; + +} + +_VAMP_SDK_PLUGSPACE_END(FFT.h) + +#endif diff --git a/lib/vamp-2.3/vamp-sdk/Plugin.h b/lib/vamp-2.6/vamp-sdk/Plugin.h similarity index 98% rename from lib/vamp-2.3/vamp-sdk/Plugin.h rename to lib/vamp-2.6/vamp-sdk/Plugin.h index 9513671dde22..552cfa1398c9 100644 --- a/lib/vamp-2.3/vamp-sdk/Plugin.h +++ b/lib/vamp-2.6/vamp-sdk/Plugin.h @@ -320,8 +320,16 @@ class Plugin : public PluginBase bool hasDuration; OutputDescriptor() : // defaults for mandatory non-class-type members - hasFixedBinCount(false), hasKnownExtents(false), isQuantized(false), - sampleType(OneSamplePerStep), hasDuration(false) { } + hasFixedBinCount(false), + binCount(0), + hasKnownExtents(false), + minValue(0), + maxValue(0), + isQuantized(false), + quantizeStep(0), + sampleType(OneSamplePerStep), + sampleRate(0), + hasDuration(false) { } }; typedef std::vector OutputList; diff --git a/lib/vamp-2.3/vamp-sdk/PluginAdapter.h b/lib/vamp-2.6/vamp-sdk/PluginAdapter.h similarity index 100% rename from lib/vamp-2.3/vamp-sdk/PluginAdapter.h rename to lib/vamp-2.6/vamp-sdk/PluginAdapter.h diff --git a/lib/vamp-2.3/vamp-sdk/PluginBase.h b/lib/vamp-2.6/vamp-sdk/PluginBase.h similarity index 97% rename from lib/vamp-2.3/vamp-sdk/PluginBase.h rename to lib/vamp-2.6/vamp-sdk/PluginBase.h index 37c98174c53e..fc0f4e7c76b0 100644 --- a/lib/vamp-2.3/vamp-sdk/PluginBase.h +++ b/lib/vamp-2.6/vamp-sdk/PluginBase.h @@ -40,10 +40,6 @@ #include #include -#define VAMP_SDK_VERSION "2.3" -#define VAMP_SDK_MAJOR_VERSION 2 -#define VAMP_SDK_MINOR_VERSION 3 - #include "plugguard.h" _VAMP_SDK_PLUGSPACE_BEGIN(PluginBase.h) @@ -197,7 +193,11 @@ class PluginBase std::vector valueNames; ParameterDescriptor() : // the defaults are invalid: you must set them - minValue(0), maxValue(0), defaultValue(0), isQuantized(false) { } + minValue(0), + maxValue(0), + defaultValue(0), + isQuantized(false), + quantizeStep(0) { } }; typedef std::vector ParameterList; diff --git a/lib/vamp-2.3/vamp-sdk/RealTime.h b/lib/vamp-2.6/vamp-sdk/RealTime.h similarity index 100% rename from lib/vamp-2.3/vamp-sdk/RealTime.h rename to lib/vamp-2.6/vamp-sdk/RealTime.h diff --git a/lib/vamp-2.3/vamp-sdk/plugguard.h b/lib/vamp-2.6/vamp-sdk/plugguard.h similarity index 97% rename from lib/vamp-2.3/vamp-sdk/plugguard.h rename to lib/vamp-2.6/vamp-sdk/plugguard.h index 311dd488e0ee..743fa014160c 100644 --- a/lib/vamp-2.3/vamp-sdk/plugguard.h +++ b/lib/vamp-2.6/vamp-sdk/plugguard.h @@ -71,6 +71,10 @@ #define _VAMP_IN_PLUGINSDK 1 +#define VAMP_SDK_VERSION "2.6" +#define VAMP_SDK_MAJOR_VERSION 2 +#define VAMP_SDK_MINOR_VERSION 6 + #ifdef _VAMP_NO_PLUGIN_NAMESPACE #define _VAMP_SDK_PLUGSPACE_BEGIN(h) #define _VAMP_SDK_PLUGSPACE_END(h) diff --git a/lib/vamp-2.3/vamp-sdk/vamp-sdk.h b/lib/vamp-2.6/vamp-sdk/vamp-sdk.h similarity index 99% rename from lib/vamp-2.3/vamp-sdk/vamp-sdk.h rename to lib/vamp-2.6/vamp-sdk/vamp-sdk.h index 3ac2f8bc05f7..de6037097570 100644 --- a/lib/vamp-2.3/vamp-sdk/vamp-sdk.h +++ b/lib/vamp-2.6/vamp-sdk/vamp-sdk.h @@ -40,6 +40,7 @@ #include "PluginBase.h" #include "Plugin.h" #include "RealTime.h" +#include "FFT.h" #endif diff --git a/lib/vamp-2.3/vamp/vamp.h b/lib/vamp-2.6/vamp/vamp.h similarity index 99% rename from lib/vamp-2.3/vamp/vamp.h rename to lib/vamp-2.6/vamp/vamp.h index 08a83ee6acc3..f54d7e0f2de3 100644 --- a/lib/vamp-2.3/vamp/vamp.h +++ b/lib/vamp-2.6/vamp/vamp.h @@ -250,7 +250,7 @@ typedef struct _VampPluginDescriptor /** API version with which this descriptor is compatible. */ unsigned int vampApiVersion; - /** Computer-usable name of the plugin. Must not change. [a-zA-Z0-9_] */ + /** Computer-usable name of the plugin. Must not change. [a-zA-Z0-9_-] */ const char *identifier; /** Human-readable name of the plugin. May be translatable. */ diff --git a/plugins/soundsourcem4a/SConscript b/plugins/soundsourcem4a/SConscript index 806d0589d2b6..47e012029d3e 100644 --- a/plugins/soundsourcem4a/SConscript +++ b/plugins/soundsourcem4a/SConscript @@ -15,9 +15,11 @@ m4a_sources = [ "sources/soundsource.cpp", "sources/soundsourceplugin.cpp", "sources/audiosource.cpp", + "util/audiosignal.cpp", "util/samplebuffer.cpp", "util/singularsamplebuffer.cpp", "util/sample.cpp", + "util/logger.cpp", "track/trackmetadata.cpp", "track/trackmetadatataglib.cpp", "track/tracknumbers.cpp", @@ -60,6 +62,7 @@ if int(build.flags['faad']): env.Append(CPPDEFINES = '__MP4V2__') env = conf.Finish() + results = [] SHLIBPREFIX='lib' #Makes the filename "libsoundsourcem4a" consistently across platforms to make our lives easier. if build.platform_is_windows: env["LINKFLAGS"].remove("/entry:mainCRTStartup") @@ -69,13 +72,15 @@ if int(build.flags['faad']): else: env["LINKFLAGS"].remove("/subsystem:windows,5.01") ssm4a_bin = env.SharedLibrary('soundsourcem4a', m4a_sources, LINKCOM = [env['LINKCOM'], 'mt.exe -nologo -manifest ${TARGET}.manifest -outputresource:$TARGET;1']) + results.append('ssm4a_bin') + if build.bundle_pdbs: + ssm4a_pdb = env.SideEffect('soundsourcem4a.pdb', ssm4a_bin) + results.append('ssm4a_pdb') else: ssm4a_bin = env.SharedLibrary('soundsourcem4a', m4a_sources) + results.append('ssm4a_bin') #Pass this soundsourcem4a library object file back to the SConscript above us. - Return("ssm4a_bin") + Return(results) else: Return("") - - - diff --git a/plugins/soundsourcem4a/soundsourcem4a.cpp b/plugins/soundsourcem4a/soundsourcem4a.cpp index 3fcfa44faa80..cf272dc06895 100644 --- a/plugins/soundsourcem4a/soundsourcem4a.cpp +++ b/plugins/soundsourcem4a/soundsourcem4a.cpp @@ -1,6 +1,7 @@ #include "soundsourcem4a.h" #include "util/sample.h" +#include "util/logger.h" #ifdef __WINDOWS__ #include @@ -19,10 +20,12 @@ typedef uint32_t SAMPLERATE_TYPE; typedef unsigned long SAMPLERATE_TYPE; #endif -namespace Mixxx { +namespace mixxx { namespace { +const Logger kLogger("SoundSourceM4A"); + // MP4SampleId is 1-based const MP4SampleId kSampleBlockIdMin = 1; @@ -40,6 +43,22 @@ const SINT kNumberOfPrefetchFrames = 2112; // The TrackId is a 1-based index of the tracks in an MP4 file const u_int32_t kMinTrackId = 1; +// http://www.iis.fraunhofer.de/content/dam/iis/de/doc/ame/wp/FraunhoferIIS_Application-Bulletin_AAC-Transport-Formats.pdf +// Footnote 13: "The usual frame length for AAC-LC is 1024 samples, but a 960 sample version +// is used for radio broadcasting, and 480 or 512 sample versions are used for the low-delay +// codecs AAC-LD and AAC-ELD." +const MP4Duration kDefaultFramesPerSampleBlock = 1024; + +// According to various references DecoderConfigDescriptor.bufferSizeDB +// is a 24-bit unsigned integer value. +// MP4 atom: +// trak.mdia.minf.stbl.stsd.*.esds.decConfigDescr.bufferSizeDB +// References: +// https://github.com/sannies/mp4parser/blob/master/isoparser/src/main/java/org/mp4parser/boxes/iso14496/part1/objectdescriptors/DecoderConfigDescriptor.java +// http://mutagen-specs.readthedocs.io/en/latest/mp4/ +// http://perso.telecom-paristech.fr/~dufourd/mpeg-4/tools.html +const u_int32_t kMaxSampleBlockInputSizeLimit = (u_int32_t(1) << 24) - 1; + inline u_int32_t getMaxTrackId(MP4FileHandle hFile) { // The maximum TrackId equals the number of all tracks @@ -69,9 +88,9 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { for (u_int32_t trackId = kMinTrackId; trackId <= maxTrackId; ++trackId) { const char* trackType = MP4GetTrackType(hFile, trackId); if (!isValidTrackType(trackType)) { - qWarning() << "Unsupported track type" + kLogger.warning() << "Unsupported track type" << QString((trackType == nullptr) ? "" : trackType); - qWarning() << "Skipping track" + kLogger.warning() << "Skipping track" << trackId << "of" << maxTrackId @@ -81,9 +100,9 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { } const char* mediaDataName = MP4GetTrackMediaDataName(hFile, trackId); if (!isValidMediaDataName(mediaDataName)) { - qWarning() << "Unsupported media data name" + kLogger.warning() << "Unsupported media data name" << QString((mediaDataName == nullptr) ? "" : mediaDataName); - qWarning() << "Skipping track" + kLogger.warning() << "Skipping track" << trackId << "of" << maxTrackId @@ -99,9 +118,9 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { if (MP4_IS_MPEG4_AAC_AUDIO_TYPE(mpeg4AudioType)) { return trackId; } else { - qWarning() << "Unsupported MPEG4 audio type" + kLogger.warning() << "Unsupported MPEG4 audio type" << int(mpeg4AudioType); - qWarning() << "Skipping track" + kLogger.warning() << "Skipping track" << trackId << "of" << maxTrackId @@ -113,9 +132,9 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { return trackId; } } else { - qWarning() << "Unsupported audio type" + kLogger.warning() << "Unsupported audio type" << int(audioType); - qWarning() << "Skipping track" + kLogger.warning() << "Skipping track" << trackId << "of" << maxTrackId @@ -123,8 +142,8 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { << fileName; continue; } - DEBUG_ASSERT_AND_HANDLE(!"unreachable code") { - qWarning() << "Skipping track" + VERIFY_OR_DEBUG_ASSERT(!"unreachable code") { + kLogger.warning() << "Skipping track" << trackId << "of" << maxTrackId @@ -142,12 +161,12 @@ SoundSourceM4A::SoundSourceM4A(const QUrl& url) m_hFile(MP4_INVALID_FILE_HANDLE), m_trackId(MP4_INVALID_TRACK_ID), m_framesPerSampleBlock(MP4_INVALID_DURATION), - m_numberOfPrefetchSampleBlocks(0), m_maxSampleBlockId(MP4_INVALID_SAMPLE_ID), - m_curSampleBlockId(MP4_INVALID_SAMPLE_ID), m_inputBufferLength(0), m_inputBufferOffset(0), m_hDecoder(nullptr), + m_numberOfPrefetchSampleBlocks(0), + m_curSampleBlockId(MP4_INVALID_SAMPLE_ID), m_curFrameIndex(getMinFrameIndex()) { } @@ -155,7 +174,7 @@ SoundSourceM4A::~SoundSourceM4A() { close(); } -Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { +SoundSource::OpenResult SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { DEBUG_ASSERT(MP4_INVALID_FILE_HANDLE == m_hFile); // open MP4 file, check for >= ver 1.9.1 // From mp4v2/file.h: @@ -169,14 +188,14 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { m_hFile = MP4Read(getLocalFileName().toUtf8().constData()); #endif if (MP4_INVALID_FILE_HANDLE == m_hFile) { - qWarning() << "Failed to open file for reading:" << getUrlString(); - return ERR; + kLogger.warning() << "Failed to open file for reading:" << getUrlString(); + return OpenResult::FAILED; } m_trackId = findFirstAudioTrackId(m_hFile, getLocalFileName()); if (MP4_INVALID_TRACK_ID == m_trackId) { - qWarning() << "No AAC track found:" << getUrlString(); - return ERR; + kLogger.warning() << "No AAC track found:" << getUrlString(); + return OpenResult::ABORTED; } // Read fixed sample duration. If the sample duration is not @@ -185,15 +204,33 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { // can't currently handle these. m_framesPerSampleBlock = MP4GetTrackFixedSampleDuration(m_hFile, m_trackId); if (MP4_INVALID_DURATION == m_framesPerSampleBlock) { - qWarning() << "Unable to decode tracks with non-fixed sample durations: " << getUrlString(); - return ERR; + kLogger.warning() << "Unable to determine the fixed sample duration of track" + << m_trackId << "in file" << getUrlString(); + // TODO(XXX): The following check for FFmpeg or any another available + // AAC decoder should be done at runtime and not at compile time. + // Only if this is the last available decoder for handling the file + // the default value should be used as a fallback and last resort. + // Unfortunately our API currently does not provide this information + // for making such a decision at runtime. +#ifdef __FFMPEGFILE__ + // Give up and instead let FFmpeg (or any other AAC decoder with + // lower priority) handle this file. + // Fixes https://bugs.launchpad.net/mixxx/+bug/1504113 + return OpenResult::ABORTED; +#else + // Fallback: Use a default value if FFmpeg is not available (checked + // at compile time). + kLogger.warning() << "Fallback: Using a default sample duration of" + << kDefaultFramesPerSampleBlock << "sample frames per block"; + m_framesPerSampleBlock = kDefaultFramesPerSampleBlock; +#endif // __FFMPEGFILE__ } const MP4SampleId numberOfSamples = MP4GetTrackNumberOfSamples(m_hFile, m_trackId); if (0 >= numberOfSamples) { - qWarning() << "Failed to read number of samples from file:" << getUrlString(); - return ERR; + kLogger.warning() << "Failed to read number of samples from file:" << getUrlString(); + return OpenResult::FAILED; } m_maxSampleBlockId = kSampleBlockIdMin + (numberOfSamples - 1); @@ -201,19 +238,47 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { // sample block for the selected track. const u_int32_t maxSampleBlockInputSize = MP4GetTrackMaxSampleSize(m_hFile, m_trackId); + if (maxSampleBlockInputSize == 0) { + kLogger.warning() << "Failed to read MP4 DecoderConfigDescriptor.bufferSizeDB:" + << getUrlString(); + return OpenResult::FAILED; + } + if (maxSampleBlockInputSize > kMaxSampleBlockInputSizeLimit) { + // Workaround for a possible bug in libmp4v2 2.0.0 (Ubuntu 16.04) + // that returns 4278190742 when opening a corrupt file. + // https://bugs.launchpad.net/mixxx/+bug/1594169 + kLogger.warning() << "MP4 DecoderConfigDescriptor.bufferSizeDB =" + << maxSampleBlockInputSize + << ">" + << kMaxSampleBlockInputSizeLimit + << "exceeds limit:" + << getUrlString(); + return OpenResult::ABORTED; + } m_inputBuffer.resize(maxSampleBlockInputSize, 0); - DEBUG_ASSERT(nullptr == m_hDecoder); // not already opened + m_audioSrcCfg = audioSrcCfg; + + if (openDecoder()) { + return OpenResult::SUCCEEDED; + } else { + return OpenResult::FAILED; + } +} + +bool SoundSourceM4A::openDecoder() { + DEBUG_ASSERT(m_hDecoder == nullptr); // not already opened + m_hDecoder = NeAACDecOpen(); - if (!m_hDecoder) { - qWarning() << "Failed to open the AAC decoder!"; - return ERR; + if (m_hDecoder == nullptr) { + kLogger.warning() << "Failed to open the AAC decoder!"; + return false; } NeAACDecConfigurationPtr pDecoderConfig = NeAACDecGetCurrentConfiguration( m_hDecoder); pDecoderConfig->outputFormat = FAAD_FMT_FLOAT; - if ((kChannelCountMono == audioSrcCfg.getChannelCount()) || - (kChannelCountStereo == audioSrcCfg.getChannelCount())) { + if ((kChannelCountMono == m_audioSrcCfg.getChannelCount()) || + (kChannelCountStereo == m_audioSrcCfg.getChannelCount())) { pDecoderConfig->downMatrix = 1; } else { pDecoderConfig->downMatrix = 0; @@ -221,18 +286,17 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { pDecoderConfig->defObjectType = LC; if (!NeAACDecSetConfiguration(m_hDecoder, pDecoderConfig)) { - qWarning() << "Failed to configure AAC decoder!"; - return ERR; + kLogger.warning() << "Failed to configure AAC decoder!"; + return false; } u_int8_t* configBuffer = nullptr; u_int32_t configBufferSize = 0; if (!MP4GetTrackESConfiguration(m_hFile, m_trackId, &configBuffer, &configBufferSize)) { - /* failed to get mpeg-4 audio config... this is ok. - * NeAACDecInit2() will simply use default values instead. - */ - qWarning() << "Failed to read the MP4 audio configuration." + // Failed to get mpeg-4 audio config... this is ok. + // NeAACDecInit2() will simply use default values instead. + kLogger.warning() << "Failed to read the MP4 audio configuration." << "Continuing with default values."; } @@ -241,8 +305,8 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { if (0 > NeAACDecInit2(m_hDecoder, configBuffer, configBufferSize, &samplingRate, &channelCount)) { free(configBuffer); - qWarning() << "Failed to initialize the AAC decoder!"; - return ERR; + kLogger.warning() << "Failed to initialize the AAC decoder!"; + return false; } else { free(configBuffer); } @@ -250,8 +314,9 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { // Calculate how many sample blocks we need to decode in advance // of a random seek in order to get the recommended number of // prefetch frames - m_numberOfPrefetchSampleBlocks = (kNumberOfPrefetchFrames + - (m_framesPerSampleBlock - 1)) / m_framesPerSampleBlock; + m_numberOfPrefetchSampleBlocks = + (kNumberOfPrefetchFrames + (m_framesPerSampleBlock - 1)) / + m_framesPerSampleBlock; setChannelCount(channelCount); setSamplingRate(samplingRate); @@ -262,26 +327,39 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { frames2samples(m_framesPerSampleBlock); m_sampleBuffer.resetCapacity(sampleBufferCapacity); - // Invalidate current position to enforce the following - // seek operation + // Discard all buffered samples + m_inputBufferLength = 0; + + // Invalidate current position(s) for the following seek operation + m_curSampleBlockId = MP4_INVALID_SAMPLE_ID; m_curFrameIndex = getMaxFrameIndex(); // (Re-)Start decoding at the beginning of the file seekSampleFrame(getMinFrameIndex()); - return OK; + return m_curFrameIndex == getMinFrameIndex(); } -void SoundSourceM4A::close() { - if (m_hDecoder) { +void SoundSourceM4A::closeDecoder() { + if (m_hDecoder != nullptr) { NeAACDecClose(m_hDecoder); m_hDecoder = nullptr; } +} + +bool SoundSourceM4A::reopenDecoder() { + closeDecoder(); + return openDecoder(); +} + +void SoundSourceM4A::close() { + closeDecoder(); + m_sampleBuffer.reset(); + m_inputBuffer.clear(); if (MP4_INVALID_FILE_HANDLE != m_hFile) { MP4Close(m_hFile); m_hFile = MP4_INVALID_FILE_HANDLE; } - m_inputBuffer.clear(); } bool SoundSourceM4A::isValidSampleBlockId(MP4SampleId sampleBlockId) const { @@ -290,12 +368,12 @@ bool SoundSourceM4A::isValidSampleBlockId(MP4SampleId sampleBlockId) const { } void SoundSourceM4A::restartDecoding(MP4SampleId sampleBlockId) { - DEBUG_ASSERT(MP4_INVALID_SAMPLE_ID != sampleBlockId); + DEBUG_ASSERT(sampleBlockId >= kSampleBlockIdMin); NeAACDecPostSeekReset(m_hDecoder, sampleBlockId); m_curSampleBlockId = sampleBlockId; m_curFrameIndex = AudioSource::getMinFrameIndex() + - (sampleBlockId - kSampleBlockIdMin) * m_framesPerSampleBlock; + (sampleBlockId - kSampleBlockIdMin) * m_framesPerSampleBlock; // Discard input buffer m_inputBufferLength = 0; @@ -306,20 +384,28 @@ void SoundSourceM4A::restartDecoding(MP4SampleId sampleBlockId) { SINT SoundSourceM4A::seekSampleFrame(SINT frameIndex) { DEBUG_ASSERT(isValidFrameIndex(m_curFrameIndex)); - DEBUG_ASSERT(isValidFrameIndex(frameIndex)); - // Handle trivial case - if (m_curFrameIndex == frameIndex) { - // Nothing to do + DEBUG_ASSERT(frameIndex >= getMinFrameIndex()); + if (frameIndex == m_curFrameIndex) { return m_curFrameIndex; } - // Handle edge case - if (getMaxFrameIndex() <= frameIndex) { - // EOF reached + if (frameIndex >= getMaxFrameIndex()) { + // EOF m_curFrameIndex = getMaxFrameIndex(); return m_curFrameIndex; } + // NOTE(uklotzde): Resetting the decoder near to the beginning + // of the stream when seeking backwards produces invalid sample + // values! As a consequence the seeking test fails. + if ((m_curSampleBlockId != MP4_INVALID_SAMPLE_ID) && + (frameIndex < m_curFrameIndex) && + (frameIndex <= (getMinFrameIndex() + kNumberOfPrefetchFrames))) { + // Workaround: Reset the decoder when seeking near to the beginning + // of the stream while decoding. + reopenDecoder(); + } + MP4SampleId sampleBlockId = kSampleBlockIdMin + (frameIndex / m_framesPerSampleBlock); DEBUG_ASSERT(isValidSampleBlockId(sampleBlockId)); @@ -349,7 +435,7 @@ SINT SoundSourceM4A::seekSampleFrame(SINT frameIndex) { const SINT skipFrameCount = skipSampleFrames(prefetchFrameCount); DEBUG_ASSERT(skipFrameCount <= prefetchFrameCount); if (skipFrameCount < prefetchFrameCount) { - qWarning() << "Failed to prefetch sample data while seeking" + kLogger.warning() << "Failed to prefetch sample data while seeking" << skipFrameCount << "<" << prefetchFrameCount; } @@ -397,7 +483,7 @@ SINT SoundSourceM4A::readSampleFrames( if (!MP4ReadSample(m_hFile, m_trackId, m_curSampleBlockId, &pInputBuffer, &inputBufferLength, nullptr, nullptr, nullptr, nullptr)) { - qWarning() + kLogger.warning() << "Failed to read MP4 input data for sample block" << m_curSampleBlockId << "(" << "min =" << kSampleBlockIdMin << "," << "max =" @@ -445,7 +531,7 @@ SINT SoundSourceM4A::readSampleFrames( decodeBufferCapacity * sizeof(*pDecodeBuffer)); // Verify the decoding result if (0 != decFrameInfo.error) { - qWarning() << "AAC decoding error:" + kLogger.warning() << "AAC decoding error:" << decFrameInfo.error << NeAACDecGetErrorMessage(decFrameInfo.error) << getUrlString(); @@ -455,13 +541,13 @@ SINT SoundSourceM4A::readSampleFrames( // Verify the decoded sample data for consistency if (getChannelCount() != decFrameInfo.channels) { - qWarning() << "Corrupt or unsupported AAC file:" + kLogger.warning() << "Corrupt or unsupported AAC file:" << "Unexpected number of channels" << decFrameInfo.channels << "<>" << getChannelCount(); break; // abort } if (getSamplingRate() != SINT(decFrameInfo.samplerate)) { - qWarning() << "Corrupt or unsupported AAC file:" + kLogger.warning() << "Corrupt or unsupported AAC file:" << "Unexpected sampling rate" << decFrameInfo.samplerate << "<>" << getSamplingRate(); break; // abort @@ -516,20 +602,20 @@ QStringList SoundSourceProviderM4A::getSupportedFileExtensions() const { } SoundSourcePointer SoundSourceProviderM4A::newSoundSource(const QUrl& url) { - return exportSoundSourcePlugin(new SoundSourceM4A(url)); + return newSoundSourcePluginFromUrl(url); } -} // namespace Mixxx +} // namespace mixxx extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { // SoundSourceProviderM4A is stateless and a single instance // can safely be shared - static Mixxx::SoundSourceProviderM4A singleton; + static mixxx::SoundSourceProviderM4A singleton; return &singleton; } extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*) { +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*) { // The statically allocated instance must not be deleted! } diff --git a/plugins/soundsourcem4a/soundsourcem4a.h b/plugins/soundsourcem4a/soundsourcem4a.h index ae01c5824161..d026131b81df 100644 --- a/plugins/soundsourcem4a/soundsourcem4a.h +++ b/plugins/soundsourcem4a/soundsourcem4a.h @@ -15,12 +15,12 @@ #include -namespace Mixxx { +namespace mixxx { class SoundSourceM4A: public SoundSourcePlugin { public: explicit SoundSourceM4A(const QUrl& url); - ~SoundSourceM4A(); + ~SoundSourceM4A() override; void close() override; @@ -30,7 +30,11 @@ class SoundSourceM4A: public SoundSourcePlugin { CSAMPLE* sampleBuffer) override; private: - Result tryOpen(const AudioSourceConfig& audioSrcCfg) override; + OpenResult tryOpen(const AudioSourceConfig& audioSrcCfg) override; + + bool openDecoder(); + void closeDecoder(); + bool reopenDecoder(); bool isValidSampleBlockId(MP4SampleId sampleBlockId) const; @@ -39,16 +43,18 @@ class SoundSourceM4A: public SoundSourcePlugin { MP4FileHandle m_hFile; MP4TrackId m_trackId; MP4Duration m_framesPerSampleBlock; - SINT m_numberOfPrefetchSampleBlocks; MP4SampleId m_maxSampleBlockId; - MP4SampleId m_curSampleBlockId; typedef std::vector InputBuffer; InputBuffer m_inputBuffer; SINT m_inputBufferLength; SINT m_inputBufferOffset; + AudioSourceConfig m_audioSrcCfg; + NeAACDecHandle m_hDecoder; + SINT m_numberOfPrefetchSampleBlocks; + MP4SampleId m_curSampleBlockId; SingularSampleBuffer m_sampleBuffer; @@ -64,12 +70,12 @@ class SoundSourceProviderM4A: public SoundSourceProvider { SoundSourcePointer newSoundSource(const QUrl& url) override; }; -} // namespace Mixxx +} // namespace mixxx extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*); +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*); #endif // MIXXX_SOUNDSOURCEM4A_H diff --git a/plugins/soundsourcemediafoundation/SConscript b/plugins/soundsourcemediafoundation/SConscript index b046261c75c7..a3795bd2c404 100644 --- a/plugins/soundsourcemediafoundation/SConscript +++ b/plugins/soundsourcemediafoundation/SConscript @@ -17,10 +17,27 @@ if int(build.flags['mediafoundation']): env["LINKFLAGS"].remove("/subsystem:windows,5.02") else: env["LINKFLAGS"].remove("/subsystem:windows,5.01") + results = ["ssmediafoundation_bin"] ssmediafoundation_bin = env.SharedLibrary('soundsourcemediafoundation', - ['soundsourcemediafoundation.cpp', 'sources/soundsourceplugin.cpp', 'sources/soundsource.cpp', 'sources/audiosource.cpp', 'util/samplebuffer.cpp', 'util/sample.cpp', 'track/trackmetadata.cpp', 'track/trackmetadatataglib.cpp', 'track/tracknumbers.cpp', 'track/replaygain.cpp', 'track/bpm.cpp' ], + ['soundsourcemediafoundation.cpp', + 'sources/soundsourceplugin.cpp', + 'sources/soundsource.cpp', + 'sources/audiosource.cpp', + 'util/audiosignal.cpp', + 'util/singularsamplebuffer.cpp', + 'util/samplebuffer.cpp', + 'util/sample.cpp', + 'util/logger.cpp', + 'track/trackmetadata.cpp', + 'track/trackmetadatataglib.cpp', + 'track/tracknumbers.cpp', + 'track/replaygain.cpp', + 'track/bpm.cpp' ], LINKCOM = [env['LINKCOM'], 'mt.exe -nologo -manifest ${TARGET}.manifest -outputresource:$TARGET;1']) - Return("ssmediafoundation_bin") + if build.bundle_pdbs: + ssmediafoundation_pdb = env.SideEffect('soundsourcemediafoundation.pdb', ssmediafoundation_bin) + results.append("ssmediafoundation_pdb") + Return(results) else: - Return("") \ No newline at end of file + Return("") diff --git a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp index 2a16b8bca21f..3721971dcf12 100644 --- a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp +++ b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp @@ -1,111 +1,82 @@ -/** - * \file soundsourcemediafoundation.cpp - * \author Bill Good - * \author Albert Santoni - * \date Jan 10, 2011 - * \note This file uses COM interfaces defined in Windows 7 and later added to - * Vista and Server 2008 via the "Platform Update Supplement for Windows Vista - * and for Windows Server 2008" (http://support.microsoft.com/kb/2117917). - * Earlier versions of Vista (and possibly Server 2008) have some Media - * Foundation interfaces but not the required IMFSourceReader, and are missing - * the Microsoft-provided AAC decoder. XP does not include Media Foundation. - */ - -/*************************************************************************** - * * - * 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. * - * * - ***************************************************************************/ - #include "soundsourcemediafoundation.h" #include -#include -#include #include #include +#include "util/sample.h" +#include "util/logger.h" + namespace { -const bool sDebug = false; +const mixxx::Logger kLogger("SoundSourceMediaFoundation"); const SINT kBytesPerSample = sizeof(CSAMPLE); const SINT kBitsPerSample = kBytesPerSample * 8; const SINT kLeftoverSize = 4096; // in CSAMPLE's, this seems to be the size MF AAC -/** - * Convert a 100ns Media Foundation value to a frame offset. - */ -inline qint64 frameFromMF(qint64 mf, SINT frameRate) { - return static_cast(mf) * frameRate / 1e7; -} +// Decoding will be restarted one or more blocks of samples +// before the actual position after seeking randomly in the +// audio stream to avoid audible glitches. +// +// "AAC Audio - Encoder Delay and Synchronization: The 2112 Sample Assumption" +// https://developer.apple.com/library/ios/technotes/tn2258/_index.html +// "It must also be assumed that without an explicit value, the playback +// system will trim 2112 samples from the AAC decoder output when starting +// playback from any point in the bistream." +const SINT kNumberOfPrefetchFrames = 2112; -/** - * Convert a frame offset to a 100ns Media Foundation value. - */ -inline qint64 mfFromFrame(qint64 frame, SINT frameRate) { - return static_cast(frame) / frameRate * 1e7; -} +// Only read the first audio stream +const DWORD kStreamIndex = MF_SOURCE_READER_FIRST_AUDIO_STREAM; /** Microsoft examples use this snippet often. */ template static void safeRelease(T **ppT) { if (*ppT) { (*ppT)->Release(); - *ppT = NULL; + *ppT = nullptr; } } } // anonymous namespace -namespace Mixxx { +namespace mixxx { -SoundSourceMediaFoundation::SoundSourceMediaFoundation(QUrl url) +SoundSourceMediaFoundation::SoundSourceMediaFoundation(const QUrl& url) : SoundSourcePlugin(url, "m4a"), m_hrCoInitialize(E_FAIL), m_hrMFStartup(E_FAIL), - m_pReader(NULL), - m_nextFrame(0), - m_leftoverBuffer(NULL), - m_leftoverBufferSize(0), - m_leftoverBufferLength(0), - m_leftoverBufferPosition(0), - m_mfDuration(0), - m_iCurrentPosition(0), - m_dead(false), - m_seeking(false) { + m_pSourceReader(nullptr), + m_currentFrameIndex(0) { } SoundSourceMediaFoundation::~SoundSourceMediaFoundation() { close(); } -Result SoundSourceMediaFoundation::tryOpen(const AudioSourceConfig& audioSrcCfg) { - if (SUCCEEDED(m_hrCoInitialize)) { - qWarning() << "Cannot reopen MediaFoundation file" << getUrlString(); - return ERR; +SoundSource::OpenResult SoundSourceMediaFoundation::tryOpen(const AudioSourceConfig& audioSrcCfg) { + VERIFY_OR_DEBUG_ASSERT(!SUCCEEDED(m_hrCoInitialize)) { + kLogger.warning() + << "Cannot reopen file" + << getUrlString(); + return OpenResult::FAILED; } const QString fileName(getLocalFileName()); - if (sDebug) { - qDebug() << "open()" << fileName; - } - // Initialize the COM library. - m_hrCoInitialize = CoInitializeEx(NULL, + m_hrCoInitialize = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (FAILED(m_hrCoInitialize)) { - qWarning() << "SSMF: failed to initialize COM"; - return ERR; + kLogger.warning() + << "failed to initialize COM"; + return OpenResult::FAILED; } // Initialize the Media Foundation platform. m_hrMFStartup = MFStartup(MF_VERSION); if (FAILED(m_hrCoInitialize)) { - qWarning() << "SSMF: failed to initialize Media Foundation"; - return ERR; + kLogger.warning() + << "failed to initialize Media Foundation"; + return OpenResult::FAILED; } // Create the source reader to read the input file. @@ -115,22 +86,28 @@ Result SoundSourceMediaFoundation::tryOpen(const AudioSourceConfig& audioSrcCfg) static_assert(sizeof(wchar_t) == sizeof(ushort), "QString::utf16(): wchar_t and ushort have different sizes"); HRESULT hr = MFCreateSourceReaderFromURL( reinterpret_cast(fileNameUtf16), - NULL, - &m_pReader); + nullptr, + &m_pSourceReader); if (FAILED(hr)) { - qWarning() << "SSMF: Error opening input file:" << fileName; - return ERR; + kLogger.warning() + << "Error opening input file:" + << fileName; + return OpenResult::FAILED; } if (!configureAudioStream(audioSrcCfg)) { - qWarning() << "SSMF: Error configuring audio stream."; - return ERR; + kLogger.warning() + << "Failed to configure audio stream"; + return OpenResult::FAILED; } + m_streamUnitConverter = StreamUnitConverter(getSamplingRate()); + if (!readProperties()) { - qWarning() << "SSMF::readProperties failed"; - return ERR; + kLogger.warning() + << "Failed to read file properties"; + return OpenResult::FAILED; } //Seek to position 0, which forces us to skip over all the header frames. @@ -138,14 +115,11 @@ Result SoundSourceMediaFoundation::tryOpen(const AudioSourceConfig& audioSrcCfg) //get the number of samples it expects (ie. no header frames). seekSampleFrame(0); - return OK; + return OpenResult::SUCCEEDED; } void SoundSourceMediaFoundation::close() { - delete[] m_leftoverBuffer; - m_leftoverBuffer = NULL; - - safeRelease(&m_pReader); + safeRelease(&m_pSourceReader); if (SUCCEEDED(m_hrMFStartup)) { MFShutdown(); @@ -159,234 +133,307 @@ void SoundSourceMediaFoundation::close() { SINT SoundSourceMediaFoundation::seekSampleFrame( SINT frameIndex) { - DEBUG_ASSERT(isValidFrameIndex(frameIndex)); - if (sDebug) { - qDebug() << "seekSampleFrame()" << frameIndex; + DEBUG_ASSERT(isValidFrameIndex(m_currentFrameIndex)); + + if (frameIndex >= getMaxFrameIndex()) { + // EOF + m_currentFrameIndex = getMaxFrameIndex(); + return m_currentFrameIndex; + } + + if (frameIndex > m_currentFrameIndex) { + // seeking forward + SINT skipFramesCount = frameIndex - m_currentFrameIndex; + // When to prefer skipping over seeking: + // 1) The sample buffer would be discarded before seeking anyway and + // skipping those already decoded samples effectively costs nothing + // 2) After seeking we need to decode at least kNumberOfPrefetchFrames + // before reaching the actual target position -> Only seek if we + // need to decode more than 2 * kNumberOfPrefetchFrames frames + // while skipping + SINT skipFramesCountMax = + samples2frames(m_sampleBuffer.getSize()) + + 2 * kNumberOfPrefetchFrames; + if (skipFramesCount <= skipFramesCountMax) { + skipSampleFrames(skipFramesCount); + } } - qint64 mfSeekTarget(mfFromFrame(frameIndex, getSamplingRate()) - 1); - // minus 1 here seems to make our seeking work properly, otherwise we will - // (more often than not, maybe always) seek a bit too far (although not - // enough for our calculatedFrameFromMF <= nextFrame assertion in ::read). - // Has something to do with 100ns MF units being much smaller than most - // frame offsets (in seconds) -bkgood - SINT result = m_iCurrentPosition; - if (m_dead) { - return result; + if (frameIndex == m_currentFrameIndex) { + return m_currentFrameIndex; } - PROPVARIANT prop; - HRESULT hr; + // Discard decoded samples + m_sampleBuffer.reset(); - // this doesn't fail, see MS's implementation - hr = InitPropVariantFromInt64(mfSeekTarget < 0 ? 0 : mfSeekTarget, &prop); + // Invalidate current position (end of stream) + m_currentFrameIndex = getMaxFrameIndex(); - hr = m_pReader->Flush(MF_SOURCE_READER_FIRST_AUDIO_STREAM); - if (FAILED(hr)) { - qWarning() << "SSMF: failed to flush before seek"; + if (m_pSourceReader == nullptr) { + // reader is dead + return m_currentFrameIndex; } - // http://msdn.microsoft.com/en-us/library/dd374668(v=VS.85).aspx - hr = m_pReader->SetCurrentPosition(GUID_NULL, prop); - if (FAILED(hr)) { - // nothing we can do here as we can't fail (no facility to other than - // crashing mixxx) - qWarning() << "SSMF: failed to seek" - << (hr == MF_E_INVALIDREQUEST ? - "Sample requests still pending" : ""); + // Jump to a position before the actual seeking position. + // Prefetching a certain number of frames is necessary for + // sample accurate decoding. The decoder needs to decode + // some frames in advance to produce the same result at + // each position in the stream. + SINT seekIndex = std::max(SINT(frameIndex - kNumberOfPrefetchFrames), AudioSource::getMinFrameIndex()); + + LONGLONG seekPos = m_streamUnitConverter.fromFrameIndex(seekIndex); + DEBUG_ASSERT(seekPos >= 0); + PROPVARIANT prop; + HRESULT hrInitPropVariantFromInt64 = + InitPropVariantFromInt64(seekPos, &prop); + DEBUG_ASSERT(SUCCEEDED(hrInitPropVariantFromInt64)); // never fails + HRESULT hrSetCurrentPosition = + m_pSourceReader->SetCurrentPosition(GUID_NULL, prop); + PropVariantClear(&prop); + if (SUCCEEDED(hrSetCurrentPosition)) { + // NOTE(uklotzde): After SetCurrentPosition() the actual position + // of the stream is unknown until reading the next samples from + // the reader. Please note that the first sample decoded after + // SetCurrentPosition() may start BEFORE the actual target position. + // See also: https://msdn.microsoft.com/en-us/library/windows/desktop/dd374668(v=vs.85).aspx + // "The SetCurrentPosition method does not guarantee exact seeking." ... + // "After seeking, the application should call IMFSourceReader::ReadSample + // and advance to the desired position. + SINT skipFramesCount = frameIndex - seekIndex; + if (skipFramesCount > 0) { + // We need to fetch at least 1 sample from the reader to obtain the + // current position! + skipSampleFrames(skipFramesCount); + // Now m_currentFrameIndex reflects the actual position of the reader + if (m_currentFrameIndex < frameIndex) { + // Skip more samples if frameIndex has not yet been reached + skipSampleFrames(frameIndex - m_currentFrameIndex); + } + if (m_currentFrameIndex != frameIndex) { + kLogger.warning() + << "Seek to frame" + << frameIndex + << "failed"; + // Jump to end of stream (= invalidate current position) + m_currentFrameIndex = getMaxFrameIndex(); + } + } else { + // We are at the beginning of the stream and don't need + // to skip any frames. Calling IMFSourceReader::ReadSample + // is not necessary in this special case. + DEBUG_ASSERT(frameIndex == AudioSource::getMinFrameIndex()); + m_currentFrameIndex = frameIndex; + } } else { - result = frameIndex; + kLogger.warning() + << "IMFSourceReader::SetCurrentPosition() failed" + << hrSetCurrentPosition; + safeRelease(&m_pSourceReader); // kill the reader } - PropVariantClear(&prop); - // record the next frame so that we can make sure we're there the next - // time we get a buffer from MFSourceReader - m_nextFrame = frameIndex; - m_seeking = true; - m_iCurrentPosition = result; - return result; + return m_currentFrameIndex; } SINT SoundSourceMediaFoundation::readSampleFrames( SINT numberOfFrames, CSAMPLE* sampleBuffer) { - if (sDebug) { - qDebug() << "read()" << numberOfFrames; - } - SINT framesNeeded(numberOfFrames); - - // first, copy frames from leftover buffer IF the leftover buffer is at - // the correct frame - if (m_leftoverBufferLength > 0 && m_leftoverBufferPosition == m_nextFrame) { - copyFrames(sampleBuffer, &framesNeeded, m_leftoverBuffer, - m_leftoverBufferLength); - if (m_leftoverBufferLength > 0) { - if (framesNeeded != 0) { - qWarning() << __FILE__ << __LINE__ - << "WARNING: Expected frames needed to be 0. Abandoning this file."; - m_dead = true; + + SINT numberOfFramesRemaining = numberOfFrames; + CSAMPLE* pSampleBuffer = sampleBuffer; + + while (numberOfFramesRemaining > 0) { + SampleBuffer::ReadableChunk readableChunk( + m_sampleBuffer.readFromHead( + frames2samples(numberOfFramesRemaining))); + DEBUG_ASSERT(readableChunk.size() + <= frames2samples(numberOfFramesRemaining)); + if (readableChunk.size() > 0) { + DEBUG_ASSERT(m_currentFrameIndex < getMaxFrameIndex()); + if (sampleBuffer != nullptr) { + SampleUtil::copy( + pSampleBuffer, + readableChunk.data(), + readableChunk.size()); + pSampleBuffer += readableChunk.size(); } - m_leftoverBufferPosition += numberOfFrames; + m_currentFrameIndex += samples2frames(readableChunk.size()); + numberOfFramesRemaining -= samples2frames(readableChunk.size()); } - } else { - // leftoverBuffer already empty or in the wrong position, clear it - m_leftoverBufferLength = 0; - } - - while (!m_dead && framesNeeded > 0) { - HRESULT hr(S_OK); - DWORD dwFlags(0); - qint64 timestamp(0); - IMFSample *pSample(NULL); - bool error(false); // set to true to break after releasing - - hr = m_pReader->ReadSample(MF_SOURCE_READER_FIRST_AUDIO_STREAM, // [in] DWORD dwStreamIndex, - 0, // [in] DWORD dwControlFlags, - NULL, // [out] DWORD *pdwActualStreamIndex, - &dwFlags, // [out] DWORD *pdwStreamFlags, - ×tamp, // [out] LONGLONG *pllTimestamp, - &pSample); // [out] IMFSample **ppSample - if (FAILED(hr)) { - qWarning() << "ReadSample failed!"; - break; // abort + if (numberOfFramesRemaining == 0) { + break; // finished reading } - if (sDebug) { - qDebug() << "ReadSample timestamp:" << timestamp << "frame:" - << frameFromMF(timestamp, getSamplingRate()) << "dwflags:" << dwFlags; + // No more decoded sample frames available + DEBUG_ASSERT(m_sampleBuffer.isEmpty()); + + if (m_pSourceReader == nullptr) { + break; // abort if reader is dead } + DWORD dwFlags = 0; + LONGLONG streamPos = 0; + IMFSample* pSample = nullptr; + HRESULT hrReadSample = + m_pSourceReader->ReadSample( + kStreamIndex, // [in] DWORD dwStreamIndex, + 0, // [in] DWORD dwControlFlags, + nullptr, // [out] DWORD *pdwActualStreamIndex, + &dwFlags, // [out] DWORD *pdwStreamFlags, + &streamPos, // [out] LONGLONG *pllTimestamp, + &pSample); // [out] IMFSample **ppSample + if (FAILED(hrReadSample)) { + kLogger.warning() + << "IMFSourceReader::ReadSample() failed" + << hrReadSample + << "-> abort decoding"; + DEBUG_ASSERT(pSample == nullptr); + break; // abort + } if (dwFlags & MF_SOURCE_READERF_ERROR) { - // our source reader is now dead, according to the docs - qWarning() - << "SSMF: ReadSample set ERROR, SourceReader is now dead"; - m_dead = true; - break; + kLogger.warning() + << "IMFSourceReader::ReadSample()" + << "detected stream errors" + << "(MF_SOURCE_READERF_ERROR)" + << "-> abort and stop decoding"; + DEBUG_ASSERT(pSample == nullptr); + safeRelease(&m_pSourceReader); // kill the reader + break; // abort } else if (dwFlags & MF_SOURCE_READERF_ENDOFSTREAM) { - qDebug() << "SSMF: End of input file."; - break; + DEBUG_ASSERT(pSample == nullptr); + break; // finished reading } else if (dwFlags & MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED) { - qWarning() << "SSMF: Type change"; - break; - } else if (pSample == NULL) { - // generally this will happen when dwFlags contains ENDOFSTREAM, - // so it'll be caught before now -bkgood - qWarning() << "SSMF: No sample"; - continue; - } // we now own a ref to the instance at pSample - - IMFMediaBuffer *pMBuffer(NULL); - // I know this does at least a memcopy and maybe a malloc, if we have - // xrun issues with this we might want to look into using - // IMFSample::GetBufferByIndex (although MS doesn't recommend this) - if (FAILED(hr = pSample->ConvertToContiguousBuffer(&pMBuffer))) { - error = true; - goto releaseSample; + kLogger.warning() + << "IMFSourceReader::ReadSample()" + << "detected that the media type has changed" + << "(MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED)" + << "-> abort decoding"; + DEBUG_ASSERT(pSample == nullptr); + break; // abort } - CSAMPLE *buffer(NULL); - DWORD bufferLengthInBytes(0); - hr = pMBuffer->Lock(reinterpret_cast(&buffer), NULL, &bufferLengthInBytes); - if (FAILED(hr)) { - error = true; - goto releaseMBuffer; + DEBUG_ASSERT(pSample != nullptr); + SINT readerFrameIndex = m_streamUnitConverter.toFrameIndex(streamPos); + DEBUG_ASSERT( + (m_currentFrameIndex == getMaxFrameIndex()) || // unknown position after seeking + (m_currentFrameIndex == readerFrameIndex)); + m_currentFrameIndex = readerFrameIndex; + + DWORD dwSampleBufferCount = 0; + HRESULT hrGetBufferCount = + pSample->GetBufferCount(&dwSampleBufferCount); + if (FAILED(hrGetBufferCount)) { + kLogger.warning() + << "IMFSample::GetBufferCount() failed" + << hrGetBufferCount + << "-> abort decoding"; + safeRelease(&pSample); + break; // abort } - SINT bufferLength = samples2frames(bufferLengthInBytes / sizeof(buffer[0])); - if (m_seeking) { - qint64 bufferPosition(frameFromMF(timestamp, getSamplingRate())); - if (sDebug) { - qDebug() << "While seeking to " << m_nextFrame - << "WMF put us at" << bufferPosition; + DWORD dwSampleTotalLengthInBytes = 0; + HRESULT hrGetTotalLength = pSample->GetTotalLength(&dwSampleTotalLengthInBytes); + if (FAILED(hrGetTotalLength)) { + kLogger.warning() + << "IMFSample::GetTotalLength() failed" + << hrGetTotalLength + << "-> abort decoding"; + safeRelease(&pSample); + break; // abort + } + // Enlarge temporary buffer (if necessary) + DEBUG_ASSERT((dwSampleTotalLengthInBytes % kBytesPerSample) == 0); + SINT numberOfSamplesToBuffer = + dwSampleTotalLengthInBytes / kBytesPerSample; + SINT sampleBufferCapacity = m_sampleBuffer.getCapacity(); + DEBUG_ASSERT(sampleBufferCapacity > 0); + while (sampleBufferCapacity < numberOfSamplesToBuffer) { + sampleBufferCapacity *= 2; + } + if (m_sampleBuffer.getCapacity() < sampleBufferCapacity) { + kLogger.debug() + << "Enlarging sample buffer capacity" + << m_sampleBuffer.getCapacity() + << "->" + << sampleBufferCapacity; + m_sampleBuffer.resetCapacity(sampleBufferCapacity); + } - } - if (m_nextFrame < bufferPosition) { - // Uh oh. We are farther forward than our seek target. Emit - // silence? We can't seek backwards here. - CSAMPLE* pBufferCurpos = sampleBuffer - + frames2samples(numberOfFrames - framesNeeded); - qint64 offshootFrames = bufferPosition - m_nextFrame; - - // If we can correct this immediately, write zeros and adjust - // m_nextFrame to pretend it never happened. - - if (offshootFrames <= framesNeeded) { - qWarning() << __FILE__ << __LINE__ - << "Working around inaccurate seeking. Writing silence for" - << offshootFrames << "frames"; - // Set offshootFrames samples to zero. - memset(pBufferCurpos, 0, - sizeof(*pBufferCurpos) * frames2samples(offshootFrames)); - // Now m_nextFrame == bufferPosition - m_nextFrame += offshootFrames; - framesNeeded -= offshootFrames; - } else { - // It's more complicated. The buffer we have just decoded is - // more than framesNeeded frames away from us. It's too hard - // for us to handle this correctly currently, so let's just - // try to get on with our lives. - m_seeking = false; - m_nextFrame = bufferPosition; - qWarning() << __FILE__ << __LINE__ - << "Seek offshoot is too drastic. Cutting losses and pretending the current decoded audio buffer is the right seek point."; - } + DWORD dwSampleBufferIndex = 0; + while (dwSampleBufferIndex < dwSampleBufferCount) { + IMFMediaBuffer* pMediaBuffer = nullptr; + HRESULT hrGetBufferByIndex = pSample->GetBufferByIndex(dwSampleBufferIndex, &pMediaBuffer); + if (FAILED(hrGetBufferByIndex)) { + kLogger.warning() + << "IMFSample::GetBufferByIndex() failed" + << hrGetBufferByIndex + << "-> abort decoding"; + DEBUG_ASSERT(pMediaBuffer == nullptr); + break; // prematurely exit buffer loop } - if (m_nextFrame >= bufferPosition - && m_nextFrame < bufferPosition + bufferLength) { - // m_nextFrame is in this buffer. - buffer += frames2samples(m_nextFrame - bufferPosition); - bufferLength -= m_nextFrame - bufferPosition; - m_seeking = false; - } else { - // we need to keep going forward - goto releaseRawBuffer; + CSAMPLE* pLockedSampleBuffer = nullptr; + DWORD lockedSampleBufferLengthInBytes = 0; + HRESULT hrLock = pMediaBuffer->Lock( + reinterpret_cast(&pLockedSampleBuffer), + nullptr, + &lockedSampleBufferLengthInBytes); + if (FAILED(hrLock)) { + kLogger.warning() + << "IMFMediaBuffer::Lock() failed" + << hrLock + << "-> abort decoding"; + safeRelease(&pMediaBuffer); + break; // prematurely exit buffer loop } - } - // If the bufferLength is larger than the leftover buffer, re-allocate - // it with 2x the space. - if (frames2samples(bufferLength) > m_leftoverBufferSize) { - SINT newSize = m_leftoverBufferSize; - - while (newSize < frames2samples(bufferLength)) { - newSize *= 2; + DEBUG_ASSERT((lockedSampleBufferLengthInBytes % sizeof(pLockedSampleBuffer[0])) == 0); + SINT lockedSampleBufferCount = + lockedSampleBufferLengthInBytes / sizeof(pLockedSampleBuffer[0]); + SINT copySamplesCount = std::min( + frames2samples(numberOfFramesRemaining), + lockedSampleBufferCount); + if (copySamplesCount > 0) { + // Copy samples directly into output buffer if possible + if (pSampleBuffer != nullptr) { + SampleUtil::copy( + pSampleBuffer, + pLockedSampleBuffer, + copySamplesCount); + pSampleBuffer += copySamplesCount; + } + pLockedSampleBuffer += copySamplesCount; + lockedSampleBufferCount -= copySamplesCount; + m_currentFrameIndex += samples2frames(copySamplesCount); + numberOfFramesRemaining -= samples2frames(copySamplesCount); } - CSAMPLE* newBuffer = new CSAMPLE[newSize]; - memcpy(newBuffer, m_leftoverBuffer, - sizeof(m_leftoverBuffer[0]) * m_leftoverBufferSize); - delete[] m_leftoverBuffer; - m_leftoverBuffer = newBuffer; - m_leftoverBufferSize = newSize; + // Buffer the remaining samples + SampleBuffer::WritableChunk writableChunk( + m_sampleBuffer.writeToTail(lockedSampleBufferCount)); + // The required capacity has been calculated in advance (see above) + DEBUG_ASSERT(writableChunk.size() == lockedSampleBufferCount); + SampleUtil::copy( + writableChunk.data(), + pLockedSampleBuffer, + writableChunk.size()); + HRESULT hrUnlock = pMediaBuffer->Unlock(); + VERIFY_OR_DEBUG_ASSERT(SUCCEEDED(hrUnlock)) { + kLogger.warning() + << "IMFMediaBuffer::Unlock() failed" + << hrUnlock; + // ignore and continue + } + safeRelease(&pMediaBuffer); + ++dwSampleBufferIndex; } - copyFrames( - sampleBuffer + frames2samples(numberOfFrames - framesNeeded), - &framesNeeded, - buffer, bufferLength); - - releaseRawBuffer: hr = pMBuffer->Unlock(); - // I'm ignoring this, MSDN for IMFMediaBuffer::Unlock stipulates - // nothing about the state of the instance if this fails so might as - // well just let it be released. - //if (FAILED(hr)) break; - releaseMBuffer: safeRelease(&pMBuffer); - releaseSample: safeRelease(&pSample); - if (error) - break; - } - - SINT framesRead = numberOfFrames - framesNeeded; - m_iCurrentPosition += framesRead; - m_nextFrame += framesRead; - if (m_leftoverBufferLength > 0) { - if (framesNeeded != 0) { - qWarning() << __FILE__ << __LINE__ - << "WARNING: Expected frames needed to be 0. Abandoning this file."; - m_dead = true; + safeRelease(&pSample); + if (dwSampleBufferIndex < dwSampleBufferCount) { + // Failed to read data from all buffers -> kill the reader + kLogger.warning() + << "Failed to read all buffered samples" + << "-> abort and stop decoding"; + safeRelease(&m_pSourceReader); + break; // abort } - m_leftoverBufferPosition = m_nextFrame; } - if (sDebug) { - qDebug() << "read()" << numberOfFrames << "returning" << framesRead; - } - return framesRead; + + return numberOfFrames - numberOfFramesRemaining; } //------------------------------------------------------------------- @@ -407,35 +454,48 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a HRESULT hr; // deselect all streams, we only want the first - hr = m_pReader->SetStreamSelection( + hr = m_pSourceReader->SetStreamSelection( MF_SOURCE_READER_ALL_STREAMS, false); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to deselect all streams"; return false; } - hr = m_pReader->SetStreamSelection( - MF_SOURCE_READER_FIRST_AUDIO_STREAM, true); + hr = m_pSourceReader->SetStreamSelection( + kStreamIndex, true); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to select first audio stream"; return false; } IMFMediaType* pAudioType = nullptr; - hr = m_pReader->GetCurrentMediaType( - MF_SOURCE_READER_FIRST_AUDIO_STREAM, &pAudioType); + hr = m_pSourceReader->GetCurrentMediaType( + kStreamIndex, &pAudioType); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to get current media type from stream"; return false; } + //------ Get bitrate from the file, before we change it to get uncompressed audio + UINT32 avgBytesPerSecond; + + hr = pAudioType->GetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &avgBytesPerSecond); + if (FAILED(hr)) { + kLogger.warning() << hr + << "error getting MF_MT_AUDIO_AVG_BYTES_PER_SECOND"; + return false; + } + + setBitrate( (avgBytesPerSecond * 8) / 1000); + //------ + hr = pAudioType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to set major type to audio"; safeRelease(&pAudioType); return false; @@ -443,24 +503,24 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set subtype format to float"; + kLogger.warning() << hr + << "failed to set subtype format to float"; safeRelease(&pAudioType); return false; } hr = pAudioType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, true); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set all samples independent"; + kLogger.warning() << hr + << "failed to set all samples independent"; safeRelease(&pAudioType); return false; } hr = pAudioType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, true); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set fixed size samples"; + kLogger.warning() << hr + << "failed to set fixed size samples"; safeRelease(&pAudioType); return false; } @@ -468,7 +528,7 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->SetUINT32( MF_MT_AUDIO_BITS_PER_SAMPLE, kBitsPerSample); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to set bits per sample:" << kBitsPerSample; safeRelease(&pAudioType); @@ -479,7 +539,7 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->SetUINT32( MF_MT_SAMPLE_SIZE, sampleSize); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + kLogger.warning() << hr << "failed to set sample size:" << sampleSize; safeRelease(&pAudioType); @@ -490,20 +550,20 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->GetUINT32( MF_MT_AUDIO_NUM_CHANNELS, &numChannels); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to get actual number of channels"; + kLogger.warning() << hr + << "failed to get actual number of channels"; return false; } else { qDebug() << "Number of channels in input stream" << numChannels; } - if (audioSrcCfg.hasChannelCount()) { + if (audioSrcCfg.hasValidChannelCount()) { numChannels = audioSrcCfg.getChannelCount(); hr = pAudioType->SetUINT32( MF_MT_AUDIO_NUM_CHANNELS, numChannels); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set number of channels:" - << numChannels; + kLogger.warning() << hr + << "failed to set number of channels:" + << numChannels; safeRelease(&pAudioType); return false; } @@ -514,20 +574,20 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->GetUINT32( MF_MT_AUDIO_SAMPLES_PER_SECOND, &samplesPerSecond); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to get samples per second"; + kLogger.warning() << hr + << "failed to get samples per second"; return false; } else { qDebug() << "Samples per second in input stream" << samplesPerSecond; } - if (audioSrcCfg.hasSamplingRate()) { + if (audioSrcCfg.hasValidSamplingRate()) { samplesPerSecond = audioSrcCfg.getSamplingRate(); hr = pAudioType->SetUINT32( MF_MT_AUDIO_SAMPLES_PER_SECOND, samplesPerSecond); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set samples per second:" - << samplesPerSecond; + kLogger.warning() << hr + << "failed to set samples per second:" + << samplesPerSecond; safeRelease(&pAudioType); return false; } @@ -536,11 +596,11 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a // Set this type on the source reader. The source reader will // load the necessary decoder. - hr = m_pReader->SetCurrentMediaType( - MF_SOURCE_READER_FIRST_AUDIO_STREAM, NULL, pAudioType); + hr = m_pSourceReader->SetCurrentMediaType( + kStreamIndex, nullptr, pAudioType); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to set media type"; + kLogger.warning() << hr + << "failed to set media type"; safeRelease(&pAudioType); return false; } @@ -549,28 +609,28 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a safeRelease(&pAudioType); // Get the resulting output format. - hr = m_pReader->GetCurrentMediaType( - MF_SOURCE_READER_FIRST_AUDIO_STREAM, &pAudioType); + hr = m_pSourceReader->GetCurrentMediaType( + kStreamIndex, &pAudioType); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to retrieve completed media type"; + kLogger.warning() << hr + << "failed to retrieve completed media type"; return false; } // Ensure the stream is selected. - hr = m_pReader->SetStreamSelection( - MF_SOURCE_READER_FIRST_AUDIO_STREAM, true); + hr = m_pSourceReader->SetStreamSelection( + kStreamIndex, true); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to select first audio stream (again)"; + kLogger.warning() << hr + << "failed to select first audio stream (again)"; return false; } hr = pAudioType->GetUINT32( MF_MT_AUDIO_NUM_CHANNELS, &numChannels); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to get actual number of channels"; + kLogger.warning() << hr + << "failed to get actual number of channels"; return false; } setChannelCount(numChannels); @@ -578,8 +638,8 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->GetUINT32( MF_MT_AUDIO_SAMPLES_PER_SECOND, &samplesPerSecond); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to get the actual sample rate"; + kLogger.warning() << hr + << "failed to get the actual sample rate"; return false; } setSamplingRate(samplesPerSecond); @@ -587,14 +647,18 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a UINT32 leftoverBufferSizeInBytes = 0; hr = pAudioType->GetUINT32(MF_MT_SAMPLE_SIZE, &leftoverBufferSizeInBytes); if (FAILED(hr)) { - qWarning() << "SSMF" << hr - << "failed to get sample buffer size (in bytes)"; + kLogger.warning() << hr + << "failed to get sample buffer size (in bytes)"; return false; } - m_leftoverBufferSize = leftoverBufferSizeInBytes / kBytesPerSample; - qDebug() << "SSMF: leftover buffer size" << m_leftoverBufferSize; - m_leftoverBuffer = new CSAMPLE[m_leftoverBufferSize]; + DEBUG_ASSERT((leftoverBufferSizeInBytes % kBytesPerSample) == 0); + m_sampleBuffer.resetCapacity(leftoverBufferSizeInBytes / kBytesPerSample); + DEBUG_ASSERT(m_sampleBuffer.getCapacity() > 0); + kLogger.debug() + << "Sample buffer capacity" + << m_sampleBuffer.getCapacity(); + // Finally release the reference safeRelease(&pAudioType); @@ -606,50 +670,20 @@ bool SoundSourceMediaFoundation::readProperties() { HRESULT hr = S_OK; //Get the duration, provided as a 64-bit integer of 100-nanosecond units - hr = m_pReader->GetPresentationAttribute(MF_SOURCE_READER_MEDIASOURCE, + hr = m_pSourceReader->GetPresentationAttribute(MF_SOURCE_READER_MEDIASOURCE, MF_PD_DURATION, &prop); if (FAILED(hr)) { - qWarning() << "SSMF: error getting duration"; + kLogger.warning() << "error getting duration"; return false; } - m_mfDuration = prop.hVal.QuadPart; - setFrameCount(frameFromMF(m_mfDuration, getSamplingRate())); - qDebug() << "SSMF: Frame count" << getFrameCount(); + setFrameCount(m_streamUnitConverter.toFrameIndex(prop.hVal.QuadPart)); + kLogger.debug() << "Frame count" << getFrameCount(); PropVariantClear(&prop); - // presentation attribute MF_PD_AUDIO_ENCODING_BITRATE only exists for - // presentation descriptors, one of which MFSourceReader is not. - // Therefore, we calculate it ourselves. - setBitrate(kBitsPerSample * frames2samples(getSamplingRate())); - + return true; } -/** - * Copies min(destFrames, srcFrames) frames to dest from src. Anything leftover - * is moved to the beginning of m_leftoverBuffer, so empty it first (possibly - * with this method). If src and dest overlap, I'll hurt you. - */ -void SoundSourceMediaFoundation::copyFrames(CSAMPLE *dest, SINT *destFrames, - const CSAMPLE *src, SINT srcFrames) { - if (srcFrames > *destFrames) { - SINT samplesToCopy(frames2samples(*destFrames)); - memcpy(dest, src, samplesToCopy * sizeof(*src)); - srcFrames -= *destFrames; - memmove(m_leftoverBuffer, src + samplesToCopy, - frames2samples(srcFrames) * sizeof(*src)); - *destFrames = 0; - m_leftoverBufferLength = srcFrames; - } else { - SINT samplesToCopy(frames2samples(srcFrames)); - memcpy(dest, src, samplesToCopy * sizeof(*src)); - *destFrames -= srcFrames; - if (src == m_leftoverBuffer) { - m_leftoverBufferLength = 0; - } - } -} - QString SoundSourceProviderMediaFoundation::getName() const { return "Microsoft Media Foundation"; } @@ -662,20 +696,20 @@ QStringList SoundSourceProviderMediaFoundation::getSupportedFileExtensions() con } SoundSourcePointer SoundSourceProviderMediaFoundation::newSoundSource(const QUrl& url) { - return exportSoundSourcePlugin(new SoundSourceMediaFoundation(url)); + return newSoundSourcePluginFromUrl(url); } -} // namespace Mixxx +} // namespace mixxx extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { // SoundSourceProviderMediaFoundation is stateless and a single instance // can safely be shared - static Mixxx::SoundSourceProviderMediaFoundation singleton; + static mixxx::SoundSourceProviderMediaFoundation singleton; return &singleton; } extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*) { +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*) { // The statically allocated instance must not be deleted! } diff --git a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h index 47845b813f57..1a49b1ccf2f6 100644 --- a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h +++ b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.h @@ -1,39 +1,55 @@ -/** - * \file soundsourcemediafoundation.h - * \class SoundSourceMediaFoundation - * \brief Decodes MPEG4/AAC audio using the SourceReader interface of the - * Media Foundation framework included in Windows 7. - * \author Bill Good - * \author Albert Santoni - * \date Jan 10, 2011 - */ - -/*************************************************************************** - * * - * 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. * - * * - ***************************************************************************/ - -#ifndef SOUNDSOURCEMEDIAFOUNDATION_H -#define SOUNDSOURCEMEDIAFOUNDATION_H +#ifndef MIXXX_SOUNDSOURCEMEDIAFOUNDATION_H +#define MIXXX_SOUNDSOURCEMEDIAFOUNDATION_H -#include "sources/soundsourceplugin.h" - -#include -class IMFSourceReader; -class IMFMediaType; -class IMFMediaSource; +#include +#include -namespace Mixxx { +#include "sources/soundsourceplugin.h" +#include "util/singularsamplebuffer.h" + + +namespace mixxx { + +class StreamUnitConverter final { + const static SINT kStreamUnitsPerSecond = 1000 * 1000 * 10; // frame length = 100 ns + + public: + StreamUnitConverter() + : m_streamUnitsPerFrame(0) { + } + explicit StreamUnitConverter(SINT frameRate) + : m_streamUnitsPerFrame(double(kStreamUnitsPerSecond) / double(frameRate)), + m_toFrameIndexBias(kStreamUnitsPerSecond / frameRate / 2) { + // The stream units should actually be much shorter + // than the frames to minimize jitter. Even a frame + // at 192 kHz has a length of about 5000 ns >> 100 ns. + DEBUG_ASSERT(m_streamUnitsPerFrame >= 50); + DEBUG_ASSERT(m_toFrameIndexBias > 0); + } + + LONGLONG fromFrameIndex(SINT frameIndex) const { + // Used for seeking, so we need to round down to hit the + // corresponding stream unit where the given stream unit + // starts + return floor((frameIndex - AudioSource::getMinFrameIndex()) * m_streamUnitsPerFrame); + } + + SINT toFrameIndex(LONGLONG streamPos) const { + // NOTE(uklotzde): Add m_toFrameIndexBias to account for rounding errors + return AudioSource::getMinFrameIndex() + + static_cast(floor((streamPos + m_toFrameIndexBias) / m_streamUnitsPerFrame)); + } + + private: + double m_streamUnitsPerFrame; + SINT m_toFrameIndexBias; +}; -class SoundSourceMediaFoundation : public Mixxx::SoundSourcePlugin { +class SoundSourceMediaFoundation : public mixxx::SoundSourcePlugin { public: - explicit SoundSourceMediaFoundation(QUrl url); - ~SoundSourceMediaFoundation(); + explicit SoundSourceMediaFoundation(const QUrl& url); + ~SoundSourceMediaFoundation() override; void close() override; @@ -42,26 +58,21 @@ class SoundSourceMediaFoundation : public Mixxx::SoundSourcePlugin { SINT readSampleFrames(SINT numberOfFrames, CSAMPLE* sampleBuffer) override; private: - Result tryOpen(const Mixxx::AudioSourceConfig& audioSrcCfg) override; + OpenResult tryOpen(const mixxx::AudioSourceConfig& audioSrcCfg) override; - bool configureAudioStream(const Mixxx::AudioSourceConfig& audioSrcCfg); + bool configureAudioStream(const mixxx::AudioSourceConfig& audioSrcCfg); bool readProperties(); - void copyFrames(CSAMPLE *dest, SINT *destFrames, const CSAMPLE *src, - SINT srcFrames); - HRESULT m_hrCoInitialize; HRESULT m_hrMFStartup; - IMFSourceReader *m_pReader; - SINT m_nextFrame; - CSAMPLE *m_leftoverBuffer; - SINT m_leftoverBufferSize; - SINT m_leftoverBufferLength; - SINT m_leftoverBufferPosition; - qint64 m_mfDuration; - SINT m_iCurrentPosition; - bool m_dead; - bool m_seeking; + + IMFSourceReader* m_pSourceReader; + + StreamUnitConverter m_streamUnitConverter; + + SINT m_currentFrameIndex; + + SingularSampleBuffer m_sampleBuffer; }; class SoundSourceProviderMediaFoundation: public SoundSourceProvider { @@ -73,12 +84,14 @@ class SoundSourceProviderMediaFoundation: public SoundSourceProvider { SoundSourcePointer newSoundSource(const QUrl& url) override; }; -} // namespace Mixxx +} // namespace mixxx + extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*); +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*); + -#endif // SOUNDSOURCEMEDIAFOUNDATION_H +#endif // MIXXX_SOUNDSOURCEMEDIAFOUNDATION_H diff --git a/plugins/soundsourcewv/SConscript b/plugins/soundsourcewv/SConscript index fdf9c72ac7d7..a594c5a631a9 100644 --- a/plugins/soundsourcewv/SConscript +++ b/plugins/soundsourcewv/SConscript @@ -15,9 +15,11 @@ wv_sources = [ "sources/soundsource.cpp", "sources/soundsourceplugin.cpp", "sources/audiosource.cpp", + "util/audiosignal.cpp", "util/samplebuffer.cpp", "util/singularsamplebuffer.cpp", "util/sample.cpp", + "util/logger.cpp", "track/trackmetadata.cpp", "track/trackmetadatataglib.cpp", "track/tracknumbers.cpp", @@ -36,6 +38,7 @@ if int(build.flags['wv']): have_wv = conf.CheckLib(['wavpack', 'wv']) env = conf.Finish() + results = [] if build.platform_is_windows: env["LINKFLAGS"].remove("/entry:mainCRTStartup") # TODO(rryan): Why do we do this? @@ -44,10 +47,15 @@ if int(build.flags['wv']): else: env["LINKFLAGS"].remove("/subsystem:windows,5.01") sswv_bin = env.SharedLibrary('soundsourcewv', wv_sources, LINKCOM = [env['LINKCOM'], 'mt.exe -nologo -manifest ${TARGET}.manifest -outputresource:$TARGET;1']) + results.append('sswv_bin') + if build.bundle_pdbs: + sswv_pdb = env.SideEffect('soundsourcewv.pdb', sswv_bin) + results.append('sswv_pdb') else: sswv_bin = env.SharedLibrary('soundsourcewv', wv_sources) + results.append('sswv_bin') #Pass this soundsourcewv library object file back to the SConscript above us. - Return("sswv_bin") + Return(results) else: Return("") diff --git a/plugins/soundsourcewv/soundsourcewv.cpp b/plugins/soundsourcewv/soundsourcewv.cpp index 46b88dd8d3e5..cdb744f39e8f 100644 --- a/plugins/soundsourcewv/soundsourcewv.cpp +++ b/plugins/soundsourcewv/soundsourcewv.cpp @@ -1,8 +1,16 @@ +#include + #include "soundsourcewv.h" -#include +#include "util/logger.h" + +namespace mixxx { + +namespace { + +const Logger kLogger("SoundSourceWV"); -namespace Mixxx { +} // anonymous namespace //static WavpackStreamReader SoundSourceWV::s_streamReader = { @@ -18,17 +26,18 @@ WavpackStreamReader SoundSourceWV::s_streamReader = { SoundSourceWV::SoundSourceWV(const QUrl& url) : SoundSourcePlugin(url, "wv"), - m_wpc(NULL), + m_wpc(nullptr), m_sampleScaleFactor(CSAMPLE_ZERO), - m_pWVFile(NULL), - m_pWVCFile(NULL) { + m_pWVFile(nullptr), + m_pWVCFile(nullptr), + m_curFrameIndex(getMinFrameIndex()) { } SoundSourceWV::~SoundSourceWV() { close(); } -Result SoundSourceWV::tryOpen(const AudioSourceConfig& audioSrcCfg) { +SoundSource::OpenResult SoundSourceWV::tryOpen(const AudioSourceConfig& audioSrcCfg) { DEBUG_ASSERT(!m_wpc); char msg[80]; // hold possible error message int openFlags = OPEN_WVC | OPEN_NORMALIZE; @@ -51,8 +60,8 @@ Result SoundSourceWV::tryOpen(const AudioSourceConfig& audioSrcCfg) { m_wpc = WavpackOpenFileInputEx(&s_streamReader, m_pWVFile, m_pWVCFile, msg, openFlags, 0); if (!m_wpc) { - qDebug() << "SSWV::open: failed to open file : " << msg; - return ERR; + kLogger.debug() << "failed to open file : " << msg; + return OpenResult::FAILED; } setChannelCount(WavpackGetReducedChannels(m_wpc)); @@ -68,41 +77,68 @@ Result SoundSourceWV::tryOpen(const AudioSourceConfig& audioSrcCfg) { m_sampleScaleFactor = CSAMPLE_PEAK / wavpackPeakSampleValue; } - return OK; + return OpenResult::SUCCEEDED; } void SoundSourceWV::close() { if (m_wpc) { WavpackCloseFile(m_wpc); - m_wpc = NULL; + m_wpc = nullptr; } if (m_pWVFile) { m_pWVFile->close(); delete m_pWVFile; - m_pWVFile = NULL; + m_pWVFile = nullptr; } if (m_pWVCFile) { m_pWVCFile->close(); delete m_pWVCFile; - m_pWVCFile = NULL; + m_pWVCFile = nullptr; } + m_curFrameIndex = getMinFrameIndex(); } SINT SoundSourceWV::seekSampleFrame(SINT frameIndex) { - DEBUG_ASSERT(isValidFrameIndex(frameIndex)); + DEBUG_ASSERT(isValidFrameIndex(m_curFrameIndex)); + + if (frameIndex >= getMaxFrameIndex()) { + // EOF reached + m_curFrameIndex = getMaxFrameIndex(); + return m_curFrameIndex; + } + + if (frameIndex == m_curFrameIndex) { + return m_curFrameIndex; + } + if (WavpackSeekSample(m_wpc, frameIndex) == true) { + m_curFrameIndex = frameIndex; return frameIndex; } else { - qDebug() << "SSWV::seek : could not seek to frame #" << frameIndex; + kLogger.debug() << "could not seek to frame #" << frameIndex; return WavpackGetSampleIndex(m_wpc); } } SINT SoundSourceWV::readSampleFrames( SINT numberOfFrames, CSAMPLE* sampleBuffer) { + if (sampleBuffer == nullptr) { + // NOTE(uklotzde): The WavPack API does not provide any + // functions for skipping samples in the audio stream. Calling + // API functions with a nullptr buffer does not return. Since + // we don't want to read samples into a temporary buffer that + // has to be allocated we are seeking to the position after + // the skipped samples. + SINT curFrameIndexBefore = m_curFrameIndex; + SINT curFrameIndexAfter = seekSampleFrame(m_curFrameIndex + numberOfFrames); + DEBUG_ASSERT(curFrameIndexBefore <= curFrameIndexAfter); + DEBUG_ASSERT(m_curFrameIndex == curFrameIndexAfter); + return curFrameIndexAfter - curFrameIndexBefore; + } // static assert: sizeof(CSAMPLE) == sizeof(int32_t) SINT unpackCount = WavpackUnpackSamples(m_wpc, reinterpret_cast(sampleBuffer), numberOfFrames); + DEBUG_ASSERT(unpackCount >= 0); if (!(WavpackGetMode(m_wpc) & MODE_FLOAT)) { // signed integer -> float const SINT sampleCount = frames2samples(unpackCount); @@ -112,6 +148,7 @@ SINT SoundSourceWV::readSampleFrames( sampleBuffer[i] = CSAMPLE(sampleValue) * m_sampleScaleFactor; } } + m_curFrameIndex += unpackCount; return unpackCount; } @@ -126,7 +163,7 @@ QStringList SoundSourceProviderWV::getSupportedFileExtensions() const { } SoundSourcePointer SoundSourceProviderWV::newSoundSource(const QUrl& url) { - return exportSoundSourcePlugin(new SoundSourceWV(url)); + return newSoundSourcePluginFromUrl(url); } //static @@ -221,17 +258,17 @@ int32_t SoundSourceWV::WriteBytesCallback(void* id, void* data, int32_t bcount) return (int32_t)pFile->write((char*)data, bcount); } -} // namespace Mixxx +} // namespace mixxx extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider() { // SoundSourceProviderWV is stateless and a single instance // can safely be shared - static Mixxx::SoundSourceProviderWV singleton; + static mixxx::SoundSourceProviderWV singleton; return &singleton; } extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*) { +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*) { // The statically allocated instance must not be deleted! } diff --git a/plugins/soundsourcewv/soundsourcewv.h b/plugins/soundsourcewv/soundsourcewv.h index e77e7ac6bd70..e79eb446c40a 100644 --- a/plugins/soundsourcewv/soundsourcewv.h +++ b/plugins/soundsourcewv/soundsourcewv.h @@ -7,12 +7,12 @@ class QFile; -namespace Mixxx { +namespace mixxx { class SoundSourceWV: public SoundSourcePlugin { public: explicit SoundSourceWV(const QUrl& url); - ~SoundSourceWV(); + ~SoundSourceWV() override; void close() override; @@ -22,7 +22,7 @@ class SoundSourceWV: public SoundSourcePlugin { CSAMPLE* sampleBuffer) override; private: - Result tryOpen(const AudioSourceConfig& audioSrcCfg) override; + OpenResult tryOpen(const AudioSourceConfig& audioSrcCfg) override; static int32_t ReadBytesCallback(void* id, void* data, int bcount); static uint32_t GetPosCallback(void* id); @@ -38,6 +38,8 @@ class SoundSourceWV: public SoundSourcePlugin { CSAMPLE m_sampleScaleFactor; QFile* m_pWVFile; QFile* m_pWVCFile; + + SINT m_curFrameIndex; }; class SoundSourceProviderWV: public SoundSourceProvider { @@ -49,12 +51,12 @@ class SoundSourceProviderWV: public SoundSourceProvider { SoundSourcePointer newSoundSource(const QUrl& url) override; }; -} // namespace Mixxx +} // namespace mixxx extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -Mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); +mixxx::SoundSourceProvider* Mixxx_SoundSourcePluginAPI_createSoundSourceProvider(); extern "C" MIXXX_SOUNDSOURCEPLUGINAPI_EXPORT -void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(Mixxx::SoundSourceProvider*); +void Mixxx_SoundSourcePluginAPI_destroySoundSourceProvider(mixxx::SoundSourceProvider*); #endif // MIXXX_SOUNDSOURCEWV_H diff --git a/res/controllers/American Audio VMS2 Alternative.midi.xml b/res/controllers/American Audio VMS2 Alternative.midi.xml deleted file mode 100644 index 47936bf06ada..000000000000 --- a/res/controllers/American Audio VMS2 Alternative.midi.xml +++ /dev/null @@ -1,1825 +0,0 @@ - - - - American Audio VMS2 (Alternative) - Stefan Nuernberger - -American Audio VMS2 controller mapping with -enhanced usability. - -The center part with the rotational knob is used -for browsing. Rotate knob for browsing the library. -Push the knob button to switch browsing between -entries and sidebar. -Direction buttons around the knob are mapped to: - [<] previous element in sidebar - [>] next element in sidebar - [/\] previous element in browser list - [\/] next element in browser list -When the effects framework is ready these buttons -could be remapped to control effects. - -Faster scrolling through the list is possible by holding -SHIFT button and rotating (any) one of the platters. - -The platters are mapped to only adjust pitch instead of -instantly switching to scratch mode when no additional -buttons are pressed. -For scratch mode hold VINYL button and then touch the -platter. This might sound tricky but prevents accidentally -interrupting a running track by touching the platter. - -Since MIXXX only supports one loop per deck and the VMS2 -does not have EQ kill switches, the secondary IN/OUT/RELOOP -buttons (access holding SHIFT) have been remapped to kill -LOW/MID/HIGH respectively on each deck. - -SoftTakeover is disabled for all controls. - -HotCues, Loop Control, Pitch Range Change, Pitch Bend, -KeyLock, Smart Grid, Cue, Play, Pause, Sync, and Track -Loading all work like in the original VMS4 script. - - - - - - - - - - [Channel1] - VMS2.pitch - 0xE0 - - - - - - - [Channel1] - VMS2.pitchCenter - 0x90 - 0x51 - - - - - - - [Channel1] - VMS2.pitchCenter - 0x80 - 0x51 - - - - - - - [Channel1] - rate_temp_up - 0x90 - 0x0F - -