diff --git a/.gitignore b/.gitignore index 9d62549e436b..c62fdd96b974 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.orig *.os *.patch +!build/appveyor/NSIS.patch *.pyc *.rej *_build @@ -39,11 +40,11 @@ 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 *.obj diff --git a/.travis.yml b/.travis.yml index b8d8412658c7..d5dcc7ddc82d 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,36 +49,41 @@ 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 libjpeg 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. - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export QTDIR=$(find /usr/local/Cellar/qt -d 1 | tail -n 1) ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export QTDIR=$(find /usr/local/Cellar/qt5 -d 1 | tail -n 1) ; fi # Workaround for bug in libopus's opus.h including # instead of . - 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..cae3d381e6b3 --- /dev/null +++ b/build/appveyor/NSIS.patch @@ -0,0 +1,28 @@ +--- MultiUser.nsh.orig 2016-03-11 19:16:38.000000000 +0000 ++++ MultiUser.nsh 2017-01-18 19:43:33.803305800 +0000 +@@ -91,7 +91,11 @@ + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + !ifdef MULTIUSER_INSTALLMODE_INSTDIR +- 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 + +@@ -129,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 b9f41f610f5f..f6409c1b6811 100644 --- a/build/depends.py +++ b/build/depends.py @@ -39,6 +39,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 @@ -154,6 +156,10 @@ def configure(self, build, conf): "Did not find libsndfile or it\'s development headers") build.env.Append(CPPDEFINES='__SNDFILE__') + 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 +229,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 +254,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 +269,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'): @@ -338,31 +354,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. @@ -419,6 +465,7 @@ def sources(self, build): def configure(self, build, conf): build.env.Append(CPPPATH="#lib/replaygain") + class Ebur128Mit(Dependence): INTERNAL_PATH = '#lib/libebur128-1.1.0' INTERNAL_LINK = False @@ -434,6 +481,8 @@ def configure(self, build, conf, env=None): 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): @@ -527,7 +576,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.") @@ -565,6 +614,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): @@ -583,30 +638,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", @@ -622,9 +675,10 @@ def sources(self, build): "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", @@ -649,6 +703,9 @@ def sources(self, build): "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", @@ -708,9 +765,9 @@ 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", @@ -742,17 +799,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", @@ -788,6 +847,7 @@ def sources(self, build): "widget/wstarrating.cpp", "widget/weffectchain.cpp", "widget/weffect.cpp", + "widget/weffectselector.cpp", "widget/weffectparameter.cpp", "widget/weffectbuttonparameter.cpp", "widget/weffectparameterbase.cpp", @@ -800,7 +860,8 @@ def sources(self, build): "widget/wcoverartlabel.cpp", "widget/wcoverartmenu.cpp", "widget/wsingletoncontainer.cpp", - "widget/wmainmenubar.cpp", + "widget/wmenuactionscontainer.cpp", + "widget/wmenubar.cpp", "musicbrainz/network.cpp", "musicbrainz/tagfetcher.cpp", @@ -832,6 +893,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", @@ -877,7 +943,6 @@ def sources(self, build): "library/itunes/itunesfeature.cpp", "library/traktor/traktorfeature.cpp", - "library/cratefeature.cpp", "library/sidebarmodel.cpp", "library/library.cpp", @@ -887,8 +952,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", @@ -896,6 +959,7 @@ 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", @@ -915,8 +979,6 @@ def sources(self, build): "library/parserm3u.cpp", "library/parsercsv.cpp", - "soundsourceproxy.cpp", - "widget/wwaveformviewer.cpp", "waveform/sharedglcontext.cpp", @@ -945,13 +1007,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", @@ -980,20 +1043,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", @@ -1017,11 +1080,11 @@ def sources(self, build): "encoder/encodermp3.cpp", "encoder/encodervorbis.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", @@ -1039,7 +1102,14 @@ def sources(self, build): "util/tapfilter.cpp", "util/movinginterquartilemean.cpp", "util/console.cpp", - "util/dbid.cpp", + "util/db/dbconnection.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", @@ -1047,6 +1117,7 @@ def sources(self, build): "util/rotary.cpp", "util/logging.cpp", "util/cmdlineargs.cpp", + "util/audiosignal.cpp", '#res/mixxx.qrc' ] @@ -1069,8 +1140,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', @@ -1129,6 +1200,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 @@ -1143,20 +1218,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) @@ -1190,7 +1274,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 @@ -1312,7 +1396,7 @@ def depends(self, build): return [SoundTouch, ReplayGain, Ebur128Mit, PortAudio, PortMIDI, Qt, TestHeaders, FidLib, SndFile, FLAC, OggVorbis, OpenGL, TagLib, ProtoBuf, Chromaprint, RubberBand, SecurityFramework, CoreServices, - QtScriptByteArray, Reverb, FpClassify] + 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 0381a1a7b86f..23d4a6118aec 100644 --- a/build/features.py +++ b/build/features.py @@ -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. @@ -549,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): @@ -668,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 @@ -725,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) @@ -737,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): @@ -745,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): @@ -809,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) @@ -820,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.') @@ -835,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): @@ -982,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): @@ -1013,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)) @@ -1027,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 @@ -1039,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 @@ -1056,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 @@ -1074,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. @@ -1099,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) @@ -1110,16 +1139,18 @@ 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 @@ -1128,10 +1159,10 @@ def configure(self, build, conf): # but are not supported on arm builds build.env.Append(CCFLAGS='-msse2 -mfpmath=sse') elif build.architecture_is_arm: - self.status = "portable" + self.status = self.build_status(optimize_level) build.env.Append(CCFLAGS='-mfloat-abi=hard -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 @@ -1144,32 +1175,36 @@ 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" + self.status = self.build_status(optimize_level) build.env.Append(CCFLAGS='-mfloat-abi=hard -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: @@ -1180,29 +1215,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..63bb20a31013 100644 --- a/build/mixxx.py +++ b/build/mixxx.py @@ -48,6 +48,8 @@ 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', @@ -111,6 +113,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 +125,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 +330,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 8f7c5f2c398b..d78ff08e7515 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,6 +485,8 @@ 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" @@ -501,12 +518,16 @@ 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\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" @@ -530,6 +551,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" @@ -549,16 +571,10 @@ Section "Uninstall" 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..8db4b78db38a --- /dev/null +++ b/build/windows/golden_environment @@ -0,0 +1 @@ +2.1-j00019-PLATFORM-CONFIGURATION-static-ce9b43e-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..1a211969ea48 100644 --- a/build/wix/Localization/README-Translations.md +++ b/build/wix/Localization/README-Translations.md @@ -4,24 +4,52 @@ So we convert the english one to a pot file and convert back the translated po f https://github.com/sblaisot/wxl-po-tools Updating source pot -------------------- +=================== `build/wix/Localization$ /path/to/wxl2pot.py -l Language mixxx_en-us.wxl po/mixxx.pot` -Updating translations from transifex ------------------------------------- +Updating translations from Transifex +====================================== -First, pull new translations from transifex -`$ tx pull -r mixxxdj-windows-installer.mixxxpot -a` +First, pull new translations from Transifex + +`$ 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..ee4c35957301 100644 --- a/build/wix/Localization/mixxx_ca-ES.wxl +++ b/build/wix/Localization/mixxx_ca-ES.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -23,26 +23,31 @@ 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ó. {\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. + 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. + 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. diff --git a/build/wix/Localization/mixxx_cs-CZ.wxl b/build/wix/Localization/mixxx_cs-CZ.wxl index cb8506069058..72ce6d115a10 100644 --- a/build/wix/Localization/mixxx_cs-CZ.wxl +++ b/build/wix/Localization/mixxx_cs-CZ.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -35,10 +35,15 @@ {\WixUI_Font_Title}Varování + + Launch Mixxx when setup exits. + Úplný balíček. Hlavní aplikace Hlavní aplikace Mixxxu včetně přednastavení ovladačů. + 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. Klávesová zkratka Přidat klávesovou zkratku pro Mixxx na pracovní plochu Uživatelská příručka diff --git a/build/wix/Localization/mixxx_de-DE.wxl b/build/wix/Localization/mixxx_de-DE.wxl index 6d39e07d45dd..2c67d9c903e9 100644 --- a/build/wix/Localization/mixxx_de-DE.wxl +++ b/build/wix/Localization/mixxx_de-DE.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -35,10 +35,15 @@ {\WixUI_Font_Title}Warnung + + Mixxx starten wenn die Installation abgeschlossen ist. + Das Komplettpaket. Kernanwendung Die Mixxx Kernanwendung einschließlich Controller-Voreinstellungen. + 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-Verknüpfung Auf Ihrem Desktop eine Verknüpfung zu Mixxx hinzufügen Benutzerhandbuch diff --git a/build/wix/Localization/mixxx_en-us.wxl b/build/wix/Localization/mixxx_en-us.wxl index 832a975b5980..5abc85dc29b0 100644 --- a/build/wix/Localization/mixxx_en-us.wxl +++ b/build/wix/Localization/mixxx_en-us.wxl @@ -28,10 +28,15 @@ {\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 diff --git a/build/wix/Localization/mixxx_es-ES.wxl b/build/wix/Localization/mixxx_es-ES.wxl index 15286bf5e4b5..0f29f7821a87 100644 --- a/build/wix/Localization/mixxx_es-ES.wxl +++ b/build/wix/Localization/mixxx_es-ES.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -35,10 +35,15 @@ {\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. + 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. Acceso Directo Añadir un acceso directo a Mixxx en su escritorio Manual de Usuario diff --git a/build/wix/Localization/mixxx_et-EE.wxl b/build/wix/Localization/mixxx_et-EE.wxl new file mode 100644 index 000000000000..1adf5b24c733 --- /dev/null +++ b/build/wix/Localization/mixxx_et-EE.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\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 + diff --git a/build/wix/Localization/mixxx_fr-FR.wxl b/build/wix/Localization/mixxx_fr-FR.wxl index c716fa121f28..fa4cab38d7b7 100644 --- a/build/wix/Localization/mixxx_fr-FR.wxl +++ b/build/wix/Localization/mixxx_fr-FR.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -35,10 +35,15 @@ {\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 diff --git a/build/wix/Localization/mixxx_it-IT.wxl b/build/wix/Localization/mixxx_it-IT.wxl new file mode 100644 index 000000000000..c65497f94151 --- /dev/null +++ b/build/wix/Localization/mixxx_it-IT.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\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 + diff --git a/build/wix/Localization/mixxx_nl-NL.wxl b/build/wix/Localization/mixxx_nl-NL.wxl new file mode 100644 index 000000000000..709b6cfed0a1 --- /dev/null +++ b/build/wix/Localization/mixxx_nl-NL.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\WixUI_Font_Title}Waarschuwing + + + Start Mixxx na de installatie. + + + Het volledige pakket. + Kerntoepassing + De Mixxx-kerntoepassing inclusief voorinstellingen voor controllers. + PDB debug-bestanden + Install Mixxx PDB files to use with a debugger. This is useful to debug Mixxx and provide readable backtraces to the development team. + 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 + diff --git a/build/wix/Localization/mixxx_pl-PL.wxl b/build/wix/Localization/mixxx_pl-PL.wxl new file mode 100644 index 000000000000..470ca4893ce2 --- /dev/null +++ b/build/wix/Localization/mixxx_pl-PL.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\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 + diff --git a/build/wix/Localization/mixxx_pt-BR.wxl b/build/wix/Localization/mixxx_pt-BR.wxl new file mode 100644 index 000000000000..b0265de51de7 --- /dev/null +++ b/build/wix/Localization/mixxx_pt-BR.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\WixUI_Font_Title}Atenção + + + Launch Mixxx when setup exits. + + + O pacote inteiro. + Núcleo da aplicação + O núcleo da aplicação MIxxx incluindo pré-definições de controlador. + 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. + 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. + diff --git a/build/wix/Localization/mixxx_pt-PT.wxl b/build/wix/Localization/mixxx_pt-PT.wxl index 4dce45d8e758..4cf395437a43 100644 --- a/build/wix/Localization/mixxx_pt-PT.wxl +++ b/build/wix/Localization/mixxx_pt-PT.wxl @@ -2,11 +2,11 @@ - - - - - + + + + + @@ -35,14 +35,19 @@ {\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. + 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. 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 diff --git a/build/wix/Localization/mixxx_ro-RO.wxl b/build/wix/Localization/mixxx_ro-RO.wxl new file mode 100644 index 000000000000..985777d9d31e --- /dev/null +++ b/build/wix/Localization/mixxx_ro-RO.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\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 + diff --git a/build/wix/Localization/mixxx_ru-RU.wxl b/build/wix/Localization/mixxx_ru-RU.wxl new file mode 100644 index 000000000000..c6dfcb919666 --- /dev/null +++ b/build/wix/Localization/mixxx_ru-RU.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. Так как установщик был изменен, нет возможности обновения версии ПО. Пожалуйста, удалите старую версию перед запуском данного установщика. + + + {\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 на Рабочий стол + Руководство пользователя + Руквоводство пользователя Mixxx в формате PDF, так же доступно на http://mixxx.org/manual/ + Переводы + Файлы, позволяющие Mixxx отображать интерфейс на альтернативных языках, нежели US английский. + diff --git a/build/wix/Localization/mixxx_tr-TR.wxl b/build/wix/Localization/mixxx_tr-TR.wxl new file mode 100644 index 000000000000..1b90709ce58b --- /dev/null +++ b/build/wix/Localization/mixxx_tr-TR.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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. + + + {\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ı + diff --git a/build/wix/Localization/mixxx_zh-CN.wxl b/build/wix/Localization/mixxx_zh-CN.wxl new file mode 100644 index 000000000000..64d2954c8604 --- /dev/null +++ b/build/wix/Localization/mixxx_zh-CN.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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。我们现已更换安装程序,这将导致不能直接进行升级。安装此版本之前请先卸载旧版本。 + + + {\WixUI_Font_Title}警告 + + + 退出安装程序后,启动Mixxx + + + 完整软件包 + 核心程序 + 核心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的快捷方式到您的桌面 + 用户手册 + Mixxx用户手册为PDF格式,您也可在http://mixxx.org/manual/ 上查看。 + 翻译 + 资源文件将允许Mixxx显示英语(美国)以外的语言 + diff --git a/build/wix/Localization/mixxx_zh-TW.wxl b/build/wix/Localization/mixxx_zh-TW.wxl new file mode 100644 index 000000000000..02fa31ed4634 --- /dev/null +++ b/build/wix/Localization/mixxx_zh-TW.wxl @@ -0,0 +1,53 @@ + + + + + + + + + + + + 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。當我們改變了安裝程式,我們不能順利升級。請安裝這個之前,卸載舊版本。 + + + {\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 + diff --git a/build/wix/Localization/po/ca-ES.po b/build/wix/Localization/po/ca-ES.po index b024e2081d9f..34898926e54c 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 +# 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-01-22 20:14+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,25 @@ 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ó." #. 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 +115,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 "" + +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 "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 +143,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 +153,4 @@ 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." diff --git a/build/wix/Localization/po/cs-CZ.po b/build/wix/Localization/po/cs-CZ.po index 6438f0671add..9bd640a9bd33 100644 --- a/build/wix/Localization/po/cs-CZ.po +++ b/build/wix/Localization/po/cs-CZ.po @@ -1,12 +1,12 @@ # # Translators: # fri, 2016 -# Sébastien 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-01-22 20:14+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" @@ -96,6 +96,11 @@ 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 "" + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -109,6 +114,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 "" + +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 "Klávesová zkratka" diff --git a/build/wix/Localization/po/de-DE.po b/build/wix/Localization/po/de-DE.po index d9fa65939f28..dcc46010e04a 100644 --- a/build/wix/Localization/po/de-DE.po +++ b/build/wix/Localization/po/de-DE.po @@ -1,11 +1,12 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Inpromtu , 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-01-22 20:14+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" @@ -95,6 +96,11 @@ 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 die Installation abgeschlossen ist." + #. Features translations msgctxt "FeatureCompleteDescription" msgid "The complete package." @@ -108,6 +114,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 "" + +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 "Desktop-Verknüpfung" diff --git a/build/wix/Localization/po/es-ES.po b/build/wix/Localization/po/es-ES.po index f3b052496219..f15831b502d6 100644 --- a/build/wix/Localization/po/es-ES.po +++ b/build/wix/Localization/po/es-ES.po @@ -1,13 +1,14 @@ # # Translators: -# Jorge Marcos , 2016 -# Josep Maria Antolin Segura , 2016 -# Sébastien BLAISOT , 2016 +# Jorge Marcos (Jorgeelalto) , 2016 +# Josep Maria Antolin , 2016 +# Josep Maria Antolin , 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-01-22 20:14+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" @@ -97,6 +98,11 @@ 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 +116,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 "" + +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 "Acceso Directo" diff --git a/build/wix/Localization/po/et-EE.po b/build/wix/Localization/po/et-EE.po index eddc9a20bfd7..2fd3028b6527 100644 --- a/build/wix/Localization/po/et-EE.po +++ b/build/wix/Localization/po/et-EE.po @@ -1,11 +1,13 @@ # # Translators: +# Laur Pärn , 2016 # S.Brandt , 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-01-22 20:14+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 +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 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 +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 "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 +83,72 @@ 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 "" +msgstr "Tuvastati vanem versioo Mixxxist. Kuna me vahetasime paigaldajat, ei saa me tõrgeteta uuendada. Palun eemaldage vanem versioon enne selle paigaldamist." #. 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 "" +msgstr "Ressursifailid mis lubavad Mixxxil kuvada teisi alternatiivkeeli peale Ameerika Ühendriikide inglise keele" diff --git a/build/wix/Localization/po/fr-FR.po b/build/wix/Localization/po/fr-FR.po index 738f403012be..5b81aba693ef 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-01-22 20:15+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" @@ -95,6 +96,11 @@ 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 +114,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" diff --git a/build/wix/Localization/po/it-IT.po b/build/wix/Localization/po/it-IT.po index 640b34ad0883..23cf79fa2ab1 100644 --- a/build/wix/Localization/po/it-IT.po +++ b/build/wix/Localization/po/it-IT.po @@ -1,12 +1,13 @@ # # Translators: # Edoardo Codeglia , 2016 -# Sébastien 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-01-22 20:14+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 +18,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" @@ -94,42 +95,57 @@ 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 "" diff --git a/build/wix/Localization/po/mixxx.pot b/build/wix/Localization/po/mixxx.pot index 055aa2758610..6478a299803b 100644 --- a/build/wix/Localization/po/mixxx.pot +++ b/build/wix/Localization/po/mixxx.pot @@ -72,6 +72,11 @@ 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 +90,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 "" diff --git a/build/wix/Localization/po/nl-NL.po b/build/wix/Localization/po/nl-NL.po index 60c7f631f569..7d1f76be489c 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-01-22 20:17+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,72 @@ 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 "" +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." #. 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 "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 "" 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 "" +msgstr "Hulpbestanden die Mixxx toelaten om te werken met andere talen dan Amerikaans Engels" diff --git a/build/wix/Localization/po/fr-BE.po b/build/wix/Localization/po/pl-PL.po similarity index 52% rename from build/wix/Localization/po/fr-BE.po rename to build/wix/Localization/po/pl-PL.po index 445a4880fe72..adffd4751b48 100644 --- a/build/wix/Localization/po/fr-BE.po +++ b/build/wix/Localization/po/pl-PL.po @@ -1,71 +1,71 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Jan Ochwat , 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" +"PO-Revision-Date: 2017-01-22 20:14+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: fr_BE\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #. 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 "Drużyna Deweloperska Mixxx'a" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Oprogramowanie DJ Open-source" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" @@ -73,7 +73,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 "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 "" @@ -81,57 +81,72 @@ 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 "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 "" +msgstr "Wykryto starszą wersję Mixxx. Zmieniliśy Instalator, nie można płynnie uaktualnić programu. Proszę odinstalować starszą wersję przed zainstalowaniem tej." #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +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 "" +msgstr "Kompletny pakiet." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +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 "" +msgstr "Skrót na pulpicie" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Dodaj skrót do Mixxx'a na twoim pulpicie" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Instrukcja obsługi" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Instrukcja obsługi Mixxx'a jest również dostępna jako PDF na http://mixxx.org/manual/" msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Translacje" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" -msgstr "" +msgstr "Pliki zasobów, które pozwalają Mixxx'owi do wyświetlania w alternatywnych językach innych niż Angielski US" diff --git a/build/wix/Localization/po/pt-BR.po b/build/wix/Localization/po/pt-BR.po index a2f87c5c6c64..f7e0f3c03f64 100644 --- a/build/wix/Localization/po/pt-BR.po +++ b/build/wix/Localization/po/pt-BR.po @@ -1,11 +1,12 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Fer22f , 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-01-22 20:14+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 +17,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 +74,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 +82,72 @@ 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 "" +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." #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" +msgstr "{\\WixUI_Font_Title}Atenção" + +#. Custom exit dialog +msgctxt "StartOnExit" +msgid "Launch Mixxx when setup exits." msgstr "" #. 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 "O núcleo da aplicação MIxxx incluindo pré-definições de controlador." + +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 "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 "" +msgstr "Arquivos de recursos que premitem o Mixxx mostrar outras linguagens além do inglês." diff --git a/build/wix/Localization/po/pt-PT.po b/build/wix/Localization/po/pt-PT.po index cbb89ac73040..184deb6ac156 100644 --- a/build/wix/Localization/po/pt-PT.po +++ b/build/wix/Localization/po/pt-PT.po @@ -1,12 +1,13 @@ # # Translators: # Diogo Oliveira , 2016 -# Sébastien BLAISOT , 2016 +# Joaquim Carvalho , 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-01-22 20:14+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" @@ -96,6 +97,11 @@ 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 +109,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 "" + +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 "Atalho no ambiente de trabalho" @@ -119,7 +135,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 +151,4 @@ 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" diff --git a/build/wix/Localization/po/ro-RO.po b/build/wix/Localization/po/ro-RO.po index b15cca911bc5..ebf107e501eb 100644 --- a/build/wix/Localization/po/ro-RO.po +++ b/build/wix/Localization/po/ro-RO.po @@ -1,11 +1,13 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Sebastien BLAISOT , 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-01-22 20:14+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 +18,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 +67,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 +90,65 @@ 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 "" +msgstr "O versiune veche Mixxx a fost detectată. Deoarece am schimbat instalatorul, nu putem actualiza facil. Dezinstalaţi versiunea veche înaintea instalării acesteia." #. 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 "" +msgstr "Fişierele resursă care permit Mixxx să afişeze în alte limbi, altele decât Engleza US" diff --git a/build/wix/Localization/po/ru-RU.po b/build/wix/Localization/po/ru-RU.po index cb012be53f48..b21ef3539e8c 100644 --- a/build/wix/Localization/po/ru-RU.po +++ b/build/wix/Localization/po/ru-RU.po @@ -1,11 +1,12 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Sebastien BLAISOT , 2016 +# Vladimir Novikov , 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-01-22 20:14+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 +17,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 +74,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 +82,72 @@ 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 "" +msgstr "Обнаружена страя версия Mixxx. Так как установщик был изменен, нет возможности обновения версии ПО. Пожалуйста, удалите старую версию перед запуском данного установщика." #. 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 "" "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 "" +msgstr "Файлы, позволяющие Mixxx отображать интерфейс на альтернативных языках, нежели US английский." diff --git a/build/wix/Localization/po/en-GB.po b/build/wix/Localization/po/tr-TR.po similarity index 52% rename from build/wix/Localization/po/en-GB.po rename to build/wix/Localization/po/tr-TR.po index abb0724b0960..6d819915189a 100644 --- a/build/wix/Localization/po/en-GB.po +++ b/build/wix/Localization/po/tr-TR.po @@ -1,71 +1,71 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Salih Tekin , 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" -"Language-Team: English (United Kingdom) (http://www.transifex.com/mixxx-dj-software/mixxxdj-windows-installer/language/en_GB/)\n" +"PO-Revision-Date: 2017-01-22 20:14+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: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: tr_TR\n" +"Plural-Forms: nplurals=1; plural=0;\n" #. 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 Geliştirici Takımı" msgctxt "ProductDescription" msgid "Open-source Digital DJ software" -msgstr "" +msgstr "Açık-kaynak Dijital DJ yazılımı" msgctxt "Comments" msgid "Installs Mixxx" -msgstr "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" @@ -73,7 +73,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-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 "" @@ -81,57 +81,72 @@ 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-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 "" +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." #. Custom Warning Dialog msgctxt "WarningDlgTitle" msgid "{\\WixUI_Font_Title}Warning" -msgstr "" +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 "" +msgstr "Tam paket." msgctxt "FeatureMainProgramTitle" msgid "Core application" -msgstr "" +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 "" +msgstr "Masaüstü Kısayolu" msgctxt "FeatureDesktopShortcutDescription" msgid "Add a shortcut to Mixxx on your desktop" -msgstr "" +msgstr "Masaüstüne Mixxx'e bir kısayol ekle" msgctxt "FeatureManualTitle" msgid "User Manual" -msgstr "" +msgstr "Kullanım Kılavuzu" msgctxt "FeatureManualDescription" msgid "" "The Mixxx user manual in PDF form, also available at " "http://mixxx.org/manual/" -msgstr "" +msgstr "Mixxx kullanım kılavuzu PDF formunda, ayrıca http://mixxx.org/manual/ adresinde mevcut." msgctxt "FeatureTranslationsTitle" msgid "Translations" -msgstr "" +msgstr "Çeviriler" msgctxt "FeatureTranslationsDescription" msgid "" "Resource files that allow Mixxx to display in alternate languages, other " "than US english" -msgstr "" +msgstr "Mixxx'in ABD dili dışındaki alternatif dillerde görüntülenmesine izin veren kaynak dosyaları" diff --git a/build/wix/Localization/po/zh-CN.po b/build/wix/Localization/po/zh-CN.po index 30f360259f68..c01eac6adf6f 100644 --- a/build/wix/Localization/po/zh-CN.po +++ b/build/wix/Localization/po/zh-CN.po @@ -1,11 +1,13 @@ # # Translators: -# Sébastien BLAISOT , 2016 +# Chee Kin Weng , 2016 +# Nya Chan (喵酱) , 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-01-22 20:14+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 +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位版本的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 +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 "您将要安装Mixxx的32位版本,但64位版本已经安装,这可能会导致超乎您意料的结果。请先卸载现有的Mixxx,或下载64位的安装包进行升级 (除非您知道自己在做什么。)" msgctxt "bitWidthMismatch64" msgid "" @@ -81,57 +83,72 @@ 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 "" +msgstr "已检测到旧版本的Mixxx。我们现已更换安装程序,这将导致不能直接进行升级。安装此版本之前请先卸载旧版本。" #. 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 "核心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 "" "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 "" +msgstr "资源文件将允许Mixxx显示英语(美国)以外的语言" diff --git a/build/wix/Localization/po/zh-TW.po b/build/wix/Localization/po/zh-TW.po index 5b4dc9099c2f..37b909750381 100644 --- a/build/wix/Localization/po/zh-TW.po +++ b/build/wix/Localization/po/zh-TW.po @@ -1,11 +1,12 @@ # # Translators: -# Sébastien 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-01-22 20:14+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 +17,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 +74,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 +82,59 @@ 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 "" +msgstr "檢測到舊版本的 Mixxx。當我們改變了安裝程式,我們不能順利升級。請安裝這個之前,卸載舊版本。" #. 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 "" diff --git a/build/wix/README.md b/build/wix/README.md index c9c7e0d77995..2448af895f55 100644 --- a/build/wix/README.md +++ b/build/wix/README.md @@ -12,4 +12,11 @@ For example, to build 64 bits package: .\build.bat 64 or to build 32 bits package: -.\build.bat 32 \ No newline at end of file +.\build.bat 32 + +To test your multilingual package +================================= + +`msiexec /i mixxx-full-name.msi ProductLanguage=xxxx` + +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 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 index 6e2f97c761eb..89fd9c6c54b2 100644 --- a/build/wix/build.bat +++ b/build/wix/build.bat @@ -16,7 +16,7 @@ if "%1" == "64" ( echo *** Building 64 bits package set BITWIDTH=64 set ARCH=x64 - set WINLIB_PATH=%WINLIB_PATH64% + set WINLIB_PATH=%WINLIB_PATH64% ) else ( echo *** Building 32 bits package set WINLIB_PATH=%WINLIB_PATH32% @@ -36,34 +36,45 @@ 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\*.* +if exist subdirs\*.wxs del /Q subdirs\*.wxs +if exist subdirs\*.wixobj del /Q subdirs\*.wixobj 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 +FOR %%d IN (controllers,fonts,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 +SET imageformats=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 +IF EXIST ..\..\dist%BITWIDTH%\imageformats ( + set imageformats=YES + "%WIX%"\bin\heat.exe dir ..\..\dist%BITWIDTH%\imageformats -nologo -sfrag -suid -ag -srd -cg imageformatsComp -dr imageformatsDir -out subdirs\imageformats.wxs -sw5150 -var var.imageformatsVar + "%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dimageformatsVar=..\..\dist%BITWIDTH%\imageformats -arch %ARCH% -out subdirs\imageformats.wixobj subdirs\imageformats.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 +SET PDB=no +REM Harvest main PDB from install dir +IF EXIST ..\..\dist%BITWIDTH%\*.pdb ( + SET PDB=yes + "%WIX%"\bin\heat.exe dir ..\..\dist%BITWIDTH% -nologo -sfrag -suid -ag -srd -cg mainPDBCompGroup -dr INSTALLDIR -out subdirs\mainPDB.wxs -sw5150 -var var.SourceDir -t only-pdb.xslt + "%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dSourceDir=..\..\dist%BITWIDTH% -arch %ARCH% -out subdirs\mainPDB.wixobj subdirs\mainPDB.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 +"%WIX%"\bin\candle.exe -nologo -dWINLIBPATH=%WINLIB_PATH% -dPlatform=%ARCH% -dPDB=%PDB% -dImageformats=%imageformats% -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 +"%WIX%"\bin\light.exe -nologo -sw1076 -spdb -ext WixUIExtension -cultures:%DefaultLanguage% -loc Localization\mixxx_%DefaultLanguage%.wxl -out mixxx-%BITWIDTH%-multilingual.msi *.wixobj subdirs\*.wixobj + +SETLOCAL ENABLEDELAYEDEXPANSION FOR %%G IN (Localization\*.wxl) DO ( REM skip 19 chars (Localization\mixxx_), keep until end -4 char (.wxl) @@ -74,15 +85,16 @@ FOR %%G IN (Localization\*.wxl) DO ( for /f "delims=<> tokens=3" %%i in ('findstr "^[space]*< subdirs\_EMPTY_ \ No newline at end of file diff --git a/build/wix/mixxx.wxs b/build/wix/mixxx.wxs index 3a5056f0e9a6..80d99f077da9 100644 --- a/build/wix/mixxx.wxs +++ b/build/wix/mixxx.wxs @@ -1,9 +1,9 @@ - + - + - + - + - + - + @@ -44,9 +44,9 @@ - + - + @@ -75,9 +75,9 @@ Platform="$(var.Platform)" /> - - - + + + @@ -92,13 +92,13 @@ - + - + @@ -108,7 +108,7 @@ Name="installed$(var.notarch)" Type="raw" /> - + @@ -134,20 +134,28 @@ - - + + + + + - - @@ -157,8 +165,8 @@ = 501)]]> --> - - @@ -167,7 +175,7 @@ - + NOT OLDERINSTALLEXISTS - - @@ -206,14 +214,14 @@ - + - + - + - - + + + Value="!(loc.bitWidthMismatch32)"> OTHERBITWIDTHINSTALLED + Value="!(loc.bitWidthMismatch64)"> OTHERBITWIDTHINSTALLED - - - + + + + + @@ -266,7 +277,7 @@ - @@ -295,14 +306,13 @@ - - - + - - + + + + @@ -322,23 +332,11 @@ - - - - - - - - - - - - - - + + @@ -364,7 +362,7 @@ ==================================================================================== --> - + - - + + + - - + + + + + Level="3"> @@ -410,7 +416,7 @@ InstallDefault='local' Level="1"> - + - + @@ -429,19 +435,25 @@ - - + + + + WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed - + 1 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/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/ebur128/ebur128.c b/lib/libebur128-1.1.0/ebur128/ebur128.c index 019fcf1c3394..3b88662ae116 100644 --- a/lib/libebur128-1.1.0/ebur128/ebur128.c +++ b/lib/libebur128-1.1.0/ebur128/ebur128.c @@ -410,7 +410,7 @@ static void ebur128_check_true_peak(ebur128_state* st, size_t frames) { #define TURN_OFF_FTZ _mm_setcsr(mxcsr); #define FLUSH_MANUALLY #else -#warning "manual FTZ is being used, please enable SSE2 (-msse2 -mfpmath=sse)" +#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 \ 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..c7a24e812822 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,172 @@ 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); + sample_t dry = 1 - blend; + + // the modulated lattices interpolate, which needs truncated float + DSP::FPTruncateMode _truncate; + + // loop through the buffer, processing each sample + // note (timrae):treat the effect as SEND type instead of INSERT type for smoother parameter changes + 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 + dry*in[i]; + out[i + 1] = xr + dry*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/plugins/soundsourcem4a/SConscript b/plugins/soundsourcem4a/SConscript index 806d0589d2b6..102b6b59c5dd 100644 --- a/plugins/soundsourcem4a/SConscript +++ b/plugins/soundsourcem4a/SConscript @@ -15,6 +15,7 @@ m4a_sources = [ "sources/soundsource.cpp", "sources/soundsourceplugin.cpp", "sources/audiosource.cpp", + "util/audiosignal.cpp", "util/samplebuffer.cpp", "util/singularsamplebuffer.cpp", "util/sample.cpp", @@ -60,6 +61,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 +71,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..63f41eb4b905 100644 --- a/plugins/soundsourcem4a/soundsourcem4a.cpp +++ b/plugins/soundsourcem4a/soundsourcem4a.cpp @@ -19,7 +19,7 @@ typedef uint32_t SAMPLERATE_TYPE; typedef unsigned long SAMPLERATE_TYPE; #endif -namespace Mixxx { +namespace mixxx { namespace { @@ -40,6 +40,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 @@ -123,7 +139,7 @@ MP4TrackId findFirstAudioTrackId(MP4FileHandle hFile, const QString& fileName) { << fileName; continue; } - DEBUG_ASSERT_AND_HANDLE(!"unreachable code") { + VERIFY_OR_DEBUG_ASSERT(!"unreachable code") { qWarning() << "Skipping track" << trackId << "of" @@ -142,12 +158,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 +171,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: @@ -170,13 +186,13 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { #endif if (MP4_INVALID_FILE_HANDLE == m_hFile) { qWarning() << "Failed to open file for reading:" << getUrlString(); - return ERR; + return OpenResult::FAILED; } m_trackId = findFirstAudioTrackId(m_hFile, getLocalFileName()); if (MP4_INVALID_TRACK_ID == m_trackId) { qWarning() << "No AAC track found:" << getUrlString(); - return ERR; + return OpenResult::ABORTED; } // Read fixed sample duration. If the sample duration is not @@ -185,15 +201,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; + qWarning() << "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). + qWarning() << "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; + return OpenResult::FAILED; } m_maxSampleBlockId = kSampleBlockIdMin + (numberOfSamples - 1); @@ -201,19 +235,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) { + qWarning() << "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 + qWarning() << "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) { + if (m_hDecoder == nullptr) { qWarning() << "Failed to open the AAC decoder!"; - return ERR; + 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; @@ -222,16 +284,15 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { pDecoderConfig->defObjectType = LC; if (!NeAACDecSetConfiguration(m_hDecoder, pDecoderConfig)) { qWarning() << "Failed to configure AAC decoder!"; - return ERR; + 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. - */ + // 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." << "Continuing with default values."; } @@ -242,7 +303,7 @@ Result SoundSourceM4A::tryOpen(const AudioSourceConfig& audioSrcCfg) { &samplingRate, &channelCount)) { free(configBuffer); qWarning() << "Failed to initialize the AAC decoder!"; - return ERR; + return false; } else { free(configBuffer); } @@ -250,8 +311,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 +324,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 +365,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,17 +381,24 @@ 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 + if (frameIndex >= getMaxFrameIndex()) { + // EOF + m_curFrameIndex = getMaxFrameIndex(); return m_curFrameIndex; } - // Handle edge case - if (getMaxFrameIndex() <= frameIndex) { - // EOF reached - m_curFrameIndex = getMaxFrameIndex(); + + // 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 (isValidSampleBlockId(m_curSampleBlockId) && + (frameIndex <= kNumberOfPrefetchFrames)) { + // Workaround: Reset the decoder when seeking near to the beginning + // of the stream while decoding. + reopenDecoder(); + skipSampleFrames(frameIndex); + } + if (frameIndex == m_curFrameIndex) { return m_curFrameIndex; } @@ -516,20 +598,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..7c85baef22ad 100644 --- a/plugins/soundsourcemediafoundation/SConscript +++ b/plugins/soundsourcemediafoundation/SConscript @@ -17,10 +17,26 @@ 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', + '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..1cc90fd0e9ea 100644 --- a/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp +++ b/plugins/soundsourcemediafoundation/soundsourcemediafoundation.cpp @@ -1,111 +1,81 @@ -/** - * \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" + namespace { -const bool sDebug = false; +const char* const kLogPreamble = "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)) { + qWarning() << kLogPreamble + << "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; + qWarning() << kLogPreamble + << "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; + qWarning() << kLogPreamble + << "failed to initialize Media Foundation"; + return OpenResult::FAILED; } // Create the source reader to read the input file. @@ -115,22 +85,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; + qWarning() << kLogPreamble + << "Error opening input file:" + << fileName; + return OpenResult::FAILED; } if (!configureAudioStream(audioSrcCfg)) { - qWarning() << "SSMF: Error configuring audio stream."; - return ERR; + qWarning() << kLogPreamble + << "Failed to configure audio stream"; + return OpenResult::FAILED; } + m_streamUnitConverter = StreamUnitConverter(getSamplingRate()); + if (!readProperties()) { - qWarning() << "SSMF::readProperties failed"; - return ERR; + qWarning() << kLogPreamble + << "Failed to read file properties"; + return OpenResult::FAILED; } //Seek to position 0, which forces us to skip over all the header frames. @@ -138,14 +114,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 +132,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) { + qWarning() << kLogPreamble + << "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; + qWarning() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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; + qWarning() << kLogPreamble + << "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; + qWarning() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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) { + qDebug() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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)) { + qWarning() << kLogPreamble + << "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 + qWarning() << kLogPreamble + << "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 +453,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 + qWarning() << kLogPreamble << 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 + qWarning() << kLogPreamble << 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 + qWarning() << kLogPreamble << 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)) { + qWarning() << kLogPreamble << 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 + qWarning() << kLogPreamble << hr << "failed to set major type to audio"; safeRelease(&pAudioType); return false; @@ -443,24 +502,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"; + qWarning() << kLogPreamble << 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"; + qWarning() << kLogPreamble << 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"; + qWarning() << kLogPreamble << hr + << "failed to set fixed size samples"; safeRelease(&pAudioType); return false; } @@ -468,7 +527,7 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->SetUINT32( MF_MT_AUDIO_BITS_PER_SAMPLE, kBitsPerSample); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + qWarning() << kLogPreamble << hr << "failed to set bits per sample:" << kBitsPerSample; safeRelease(&pAudioType); @@ -479,7 +538,7 @@ bool SoundSourceMediaFoundation::configureAudioStream(const AudioSourceConfig& a hr = pAudioType->SetUINT32( MF_MT_SAMPLE_SIZE, sampleSize); if (FAILED(hr)) { - qWarning() << "SSMF" << hr + qWarning() << kLogPreamble << hr << "failed to set sample size:" << sampleSize; safeRelease(&pAudioType); @@ -490,20 +549,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"; + qWarning() << kLogPreamble << 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; + qWarning() << kLogPreamble << hr + << "failed to set number of channels:" + << numChannels; safeRelease(&pAudioType); return false; } @@ -514,20 +573,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"; + qWarning() << kLogPreamble << 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; + qWarning() << kLogPreamble << hr + << "failed to set samples per second:" + << samplesPerSecond; safeRelease(&pAudioType); return false; } @@ -536,11 +595,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"; + qWarning() << kLogPreamble << hr + << "failed to set media type"; safeRelease(&pAudioType); return false; } @@ -549,28 +608,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"; + qWarning() << kLogPreamble << 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)"; + qWarning() << kLogPreamble << 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"; + qWarning() << kLogPreamble << hr + << "failed to get actual number of channels"; return false; } setChannelCount(numChannels); @@ -578,8 +637,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"; + qWarning() << kLogPreamble << hr + << "failed to get the actual sample rate"; return false; } setSamplingRate(samplesPerSecond); @@ -587,14 +646,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)"; + qWarning() << kLogPreamble << 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); + qDebug() << kLogPreamble + << "Sample buffer capacity" + << m_sampleBuffer.getCapacity(); + // Finally release the reference safeRelease(&pAudioType); @@ -606,50 +669,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"; + qWarning() << kLogPreamble << "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)); + qDebug() << kLogPreamble << "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 +695,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..681775522be1 100644 --- a/plugins/soundsourcewv/SConscript +++ b/plugins/soundsourcewv/SConscript @@ -15,6 +15,7 @@ wv_sources = [ "sources/soundsource.cpp", "sources/soundsourceplugin.cpp", "sources/audiosource.cpp", + "util/audiosignal.cpp", "util/samplebuffer.cpp", "util/singularsamplebuffer.cpp", "util/sample.cpp", @@ -36,6 +37,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 +46,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..d2a0393fdb8a 100644 --- a/plugins/soundsourcewv/soundsourcewv.cpp +++ b/plugins/soundsourcewv/soundsourcewv.cpp @@ -2,7 +2,7 @@ #include -namespace Mixxx { +namespace mixxx { //static WavpackStreamReader SoundSourceWV::s_streamReader = { @@ -18,17 +18,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; @@ -52,7 +53,7 @@ Result SoundSourceWV::tryOpen(const AudioSourceConfig& audioSrcCfg) { msg, openFlags, 0); if (!m_wpc) { qDebug() << "SSWV::open: failed to open file : " << msg; - return ERR; + return OpenResult::FAILED; } setChannelCount(WavpackGetReducedChannels(m_wpc)); @@ -68,29 +69,42 @@ 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; @@ -100,9 +114,23 @@ SINT SoundSourceWV::seekSampleFrame(SINT frameIndex) { 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 +140,7 @@ SINT SoundSourceWV::readSampleFrames( sampleBuffer[i] = CSAMPLE(sampleValue) * m_sampleScaleFactor; } } + m_curFrameIndex += unpackCount; return unpackCount; } @@ -126,7 +155,7 @@ QStringList SoundSourceProviderWV::getSupportedFileExtensions() const { } SoundSourcePointer SoundSourceProviderWV::newSoundSource(const QUrl& url) { - return exportSoundSourcePlugin(new SoundSourceWV(url)); + return newSoundSourcePluginFromUrl(url); } //static @@ -221,17 +250,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 - -