From: Peter Michael Green Date: Sat, 30 Nov 2019 15:26:20 +0000 (+0000) Subject: Import juce_5.4.4~repack0-3+rpi1.debian.tar.xz X-Git-Tag: archive/raspbian/5.4.5_ds0-1+rpi1~14^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=feebd007b7fa513fd1acda8defd4ce9df7bf140f;p=juce.git Import juce_5.4.4~repack0-3+rpi1.debian.tar.xz [dgit import tarball juce 5.4.4~repack0-3+rpi1 juce_5.4.4~repack0-3+rpi1.debian.tar.xz] --- feebd007b7fa513fd1acda8defd4ce9df7bf140f diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..56aceb77 --- /dev/null +++ b/NEWS @@ -0,0 +1,16 @@ +juce (5.2.0~repack-1) unstable; urgency=medium + + Removal of "libjuce(-dev)" - switch to "juce-modules-source" + ============================================================ + Starting with JUCE-5.2.0, Debian no longer ships libjuce(-dev) packages, as + they turned out to be not useful: the use case heavily favoured by upstream + is "static linking". + In order to keep JUCE useful for developers and packagers, we now suggest to + use the 'juce-modules-source' package instead. + + Breaking changes + ================ + See BREAKING-CHANGES.txt (in the 'juce-modules-sources') package for upstream + incompatibilities. + + -- IOhannes m zmölnig (Debian/GNU) Thu, 09 Nov 2017 13:46:52 +0100 diff --git a/Projucer.desktop b/Projucer.desktop new file mode 100644 index 00000000..2b2a8799 --- /dev/null +++ b/Projucer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=Projucer +GenericName=JUCE project management tool +Comment=IDE for working with JUCE based projects +Exec=/usr/bin/Projucer %f +Icon=juce.png +Categories=Development +MimeType=applications/x-juce; +Terminal=false +Type=Application +Keywords=Development;IDE;C++ diff --git a/README.Debian b/README.Debian new file mode 100644 index 00000000..94066309 --- /dev/null +++ b/README.Debian @@ -0,0 +1,80 @@ +JUCE for Debian +=============== + +upstream's preferred form of usage of JUCE is to include a verbatim copy of all +used JUCE modules in your application. +This is made explicit in the 'Projucer', JUCE's own software project +management workbench, that will copy (or symlink, or include otherwise) the +modules' source code into your project. + +# Projucer for Debian + +Installing the following packages will give you the 'Projucer' as Debian +packages while keeping your embedded-module-code workflow: + - juce-tools (contains the Projucer) + - juce-modules-source (contains the source-code for the JUCE modules) + +The 'Projucer' as shipped with Debian has the following modification regarding +the once shipped by upstream: + +# Debian packages that depend on JUCE + +This is a quick guideline for packaging upstream software that uses JUCE for +Debian. +For further implementation details check out the 'iem-plugin-suite' package. + +- Build-Depend on 'juce-modules-source' +- Add 'Built-Using: juce-modules-source (= <>)' to debian/control + (replace '<>' with the actual version of 'juce-modules-source', as + obtained with + + dpkg-query --show --showformat='${source:Version}' juce-modules-source + + + E.g. dh based packages might use something like the following in debian/rules: + + JUCE_VERSION := $(shell dpkg-query --show --showformat='$${source:Version}' juce-modules-source) + override_dh_gencontrol: + dh_gencontrol -- -Vjuce:BuiltUsing="juce ( = $(JUCE_VERSION) )" + + Accompanied by the following in the binary package's section in debian/control: + + Built-Using: ${juce:BuiltUsing} + +- If needed, dynamically link against the following libraries (as + "juce-modules-source" does not include their sources (as opposed to upstream): + - libjpeg + - libpng + - libflac + - libvorbis libvorbisenc libvorbisfile + - libogg + - zlib + E.g. using something like: + + make LDFLAGS="$(pkg-config --libs libpng libjpeg flac vorbis vorbisfile vorbisenc ogg zlib)" + + *Alternatively*, resave the JUCE-project with the Debian-packaged 'Projucer' + (>=5.4.4~repack0-3) which will take care of adding these libraries (if + required) to the LinuxMakefile build. + +- When compiling for some embedded architectures (notably 'armel', 'mipsel' and + the like), you might need to link against '-latomic'. + The following snippet for d/rules can help inject the library on the required + architectures: + + # link with libatomic on architectures without built-in atomic + noatomicarch = $(shell dpkg-architecture -qDEB_HOST_ARCH | egrep -x "(armel|powerpc|powerpcspe|m68k|mips|mipsel|sh4|riscv64)") + ifeq ($(if $(noatomicarch),atomic), atomic) + LDFLAGS += -latomic + endif + + *Alternatively*, resave the JUCE-project with the Debian-packaged 'Projucer' + (>=5.4.4~repack0-3) which will take care of adding the relevant flags to the + LinuxMakefile build. + +- Also be aware, that Projucer generated makefiles usually include + "-march=native", which is mostly not what you want for a generic baseline CPU + build. + You can override that by setting the TARGET_ARCH make variable + + make TARGET_ARCH="" diff --git a/README.libjuce-doc b/README.libjuce-doc new file mode 100644 index 00000000..bd2012e2 --- /dev/null +++ b/README.libjuce-doc @@ -0,0 +1,5 @@ +the HTML documentation can be found in + /usr/share/doc/juce-modules-source/apiref/ + + -- IOhannes m zmölnig (Debian/GNU) Sun, 11 Feb 2018 10:42:03 +0100 + diff --git a/README.source b/README.source new file mode 100644 index 00000000..86a78e2f --- /dev/null +++ b/README.source @@ -0,0 +1,56 @@ +removed libraries +----------------- + +upstream embeds a number of FLOSS libraries, that Debian already ships: + - FLAC + - OGG/Vorbis + - jpglib + - pnglib + - zlib +upstream also includes some FLOSS headers for building OS-specific audio +plugins: + - AudioUnit (OSX) + +since we don't need either of these, they are stripped away from the source +tarball (in order to not accidentally use them). + + -- IOhannes m zmölnig (Debian/GNU) Wed, 10 Feb 2016 16:38:34 +0100 + + +NOT-removed embedded libraries +------------------------------ + +upstream also includes an embedded copy of Box2D which is available on debian as +"box2d". +Unfortunately it seems that the two are really different versions and the API +has changed. +Therefore we are currently building with the embedded copy. + +Once upstream updates their embedded copy to a version compatible with the one +shipped by Debian, we will switch to the system library. + + -- IOhannes m zmölnig (Debian/GNU) Wed, 10 Feb 2016 16:38:35 +0100 + + +gbp clone +--------- + +Starting with gbp>0.8.1, here's an simple way to automatically fine-tune the +repository in the following ways: +- make git ignore any .pc/ directory (created by quilt) +- enable the "--follow-tags" when running 'git-push', so it's harder + to forget to push packaging tags along with the branches. + +To enable this, run gbp-clone with the '--postclone debian/gbp/postclone.sh' +option. +To enable this for ALL repositories cloned via 'gbp' (in the future), do +something like the following: + + $ mkdir -p ~/bin + $ cp debian/gbp/postclone.sh ~/bin/gbphook-postclone + $ cat >> ~/.gbp.conf < Mon, 1 Aug 2016 12:15:50 +0200 diff --git a/TODO.Debian b/TODO.Debian new file mode 100644 index 00000000..efc9c4bb --- /dev/null +++ b/TODO.Debian @@ -0,0 +1,46 @@ + +# 2017-11-08 + +## drop libjuce +it simply doesn't work. +it's not supported by upstream. +JUCE applications are meant to be compiled with the JUCE sources (statically +linked). +JUCE ABI keeps breaking. + +it was a lot of work, but we should try to swim too hard against the current... + +## keep multiple versions? +API stability??? + +####################################################### +# old TODO + + +## include headers +do we want all headers starting with "juce_*"? + +## build libjuce +we probably need a debug-version and a non-debug version + +or (alternatively) separate libraries for each of the modules. + +- check how to build the GUI widgets + +### use system installed libraries! + +basically done. + +Box2D is incompatible + + + +### clamp defines! + +the following defines need to be forced to +- 0 in Release mode +- 1 in Debug mode +defines: + - JUCE_FORCE_DEBUG + - JUCE_LOG_ASSERTIONS + - JUCE_CHECK_MEMORY_LEAKS diff --git a/artifacts/.empty b/artifacts/.empty new file mode 100644 index 00000000..e69de29b diff --git a/changelog b/changelog new file mode 100644 index 00000000..728cf49e --- /dev/null +++ b/changelog @@ -0,0 +1,338 @@ +juce (5.4.4~repack0-3+rpi1) bullseye-staging; urgency=medium + + * Link with libatomic on armhf too. + + -- Peter Michael Green Sat, 30 Nov 2019 15:26:20 +0000 + +juce (5.4.4~repack0-3) unstable; urgency=medium + + * Make Makefiles created by Debian's Projucer compile without further ado + * Add patch to link against (required) system-libraries + * Add patch to inject LIBS into Projucer's Makefile-exporter from the + from the cmdline + * Make armel/mipsel/... Projucer add "-latomic" to LIBS + * Document the Projucer fixes in README.Debian + + -- IOhannes m zmölnig (Debian/GNU) Thu, 22 Aug 2019 10:01:56 +0200 + +juce (5.4.4~repack0-2) unstable; urgency=medium + + * Link against "libatomic" on armel/mipsel/... to fix FTBFS + * Fix dversionmangle in d/watch + + -- IOhannes m zmölnig (Debian/GNU) Wed, 21 Aug 2019 13:56:30 +0200 + +juce (5.4.4~repack0-1) unstable; urgency=medium + + * New upstream version 5.4.4~repack0 + (Closes: #925723) + + [ Ondřej Nový ] + * Use debhelper-compat instead of debian/compat + * Bump Standards-Version to 4.4.0 + + [ IOhannes m zmölnig ] + * Refresh patches + * Drop obsolete d/source/local-options + * Update d/copyright + * Regenerate d/copyright_hints + + -- IOhannes m zmölnig (Debian/GNU) Tue, 20 Aug 2019 13:28:00 +0200 + +juce (5.4.1+really5.4.1~repack-3) unstable; urgency=medium + + * Add more missing VST opcodes (Closes: #923529) + + -- IOhannes m zmölnig (Debian/GNU) Wed, 06 Mar 2019 19:22:02 +0100 + +juce (5.4.1+really5.4.1~repack-2) unstable; urgency=medium + + * Install VSTInterface.h for jor arch:all builds + + -- IOhannes m zmölnig (Debian/GNU) Sun, 13 Jan 2019 09:42:22 +0100 + +juce (5.4.1+really5.4.1~repack-1) unstable; urgency=medium + + [ IOhannes m zmölnig (Debian/GNU) ] + * New upstream version 5.4.1 + * Refresh patches + + * Ported juce_VSTInterface.h from JUCE-5.3.2 to JUCE-5.4.1 (Closes: #913915) + * Fixed spelling errors + * Updated d/copyright + * Fixed 'licensecheck' target + * Refreshed d/copyright_hints + * Removed trailing whitespace in d/changelog + * Bumped standards-version to 4.3.0 + + -- IOhannes m zmölnig (Debian/GNU) Sat, 12 Jan 2019 00:45:16 +0100 + +juce (5.4.1+really5.3.2~repack-1) unstable; urgency=medium + + * Reverted to upstream version 5.3.2 (due to VST issues) + (Closes: #913915) + + * Fixed cmdline flag for Projucer for the autopkgtest + * Updated licensecheck ignores + + -- IOhannes m zmölnig (Debian/GNU) Wed, 05 Dec 2018 17:06:00 +0100 + +juce (5.4.1~repack-1) unstable; urgency=medium + + * New upstream version 5.4.1~repack + + [ Olivier Humbert ] + * Fixed typos in README.Debian and README.source + + [ IOhannes m zmölnig (Debian/GNU) ] + * Refreshed patches and removed patch applied upstream + * Updated d/copyright + * Regenerated d/copyright_hints + + -- IOhannes m zmölnig (Debian/GNU) Wed, 14 Nov 2018 11:22:12 +0100 + +juce (5.3.2~repack-2) unstable; urgency=medium + + * Backported fix for Projucer crash when saving global search-path + * Fixed patch-headers in preparation of 'gbp pq' + * Declare that building this package doesn't require "root" privileges + * Bumped standards-version to 4.2.1 + + -- IOhannes m zmölnig (Debian/GNU) Fri, 26 Oct 2018 22:17:07 +0200 + +juce (5.3.2~repack-1) unstable; urgency=medium + + * New upstream version 5.3.2~repack + * Refreshed patches + * Dropped build-time patch for reproducible builds + + -- IOhannes m zmölnig (Debian/GNU) Mon, 14 May 2018 09:58:20 +0200 + +juce (5.3.1~repack-1) unstable; urgency=medium + + * New upstream version 5.3.1~repack + * Refreshed patches + * Patch to generate useful JACK client names by default + * Run unit-tests on Deb-CI + * Fix UnitTests to use system-wide JUCE modules + * Refreshed d/copyright_hints + * Bumped standards to 4.1.4 + + -- IOhannes m zmölnig (Debian/GNU) Thu, 12 Apr 2018 13:34:24 +0200 + +juce (5.3.0~repack-1) unstable; urgency=medium + + * New upstream version 5.3.0~repack + * Refreshed patches + * Fixed path to Icon.png + * Added patch to not reveal usage data by default + * Install API documentation into /usr/share/doc/juce-modules-source/ + * Updated copyright for moved Box2D tests + * Updated d/copyright_hints + * Updated Vcs-* stanzas to salsa.d.o + * Updated upstream source URL + + -- IOhannes m zmölnig (Debian/GNU) Mon, 26 Mar 2018 16:11:09 +0200 + +juce (5.2.1~repack-2) unstable; urgency=medium + + * Fixed building of documentation (for real) + * Use upstream's Makefile rather than second-guessing how to do it + * Added B-D on Python3 and added patch to use Py3 to build docs + * Added B-D on graphviz (Closes: #890035) + * Dropped .tag files for (more) reproducible builds. (Closes: #890036) + Thanks to Chris Lamb for the last two + * Re-enabled LV2 support (Closes: #889969) + * Refreshed LV2 sources + + -- IOhannes m zmölnig (Debian/GNU) Sun, 11 Feb 2018 10:42:03 +0100 + +juce (5.2.1~repack-1) unstable; urgency=medium + + * New upstream version 5.2.1~repack + * Removed patches applied upstream + * Refreshed remaining patches + * Have juce-module-source depend on more packages + * Fixed libjuce-doc package to actually contain documentation + * Added more documentation on how to create Debian packages depending on JUCE + * Updated maintainer email + * Updated d/copyright(_hints) + * Switched build system from CDBS to DH + * Bumped dh-compat to 11 + * Bumped standards version to 4.1.3 + + -- IOhannes m zmölnig (Debian/GNU) Thu, 08 Feb 2018 22:25:21 +0100 + +juce (5.2.0~repack-3) unstable; urgency=medium + + * Backported upstream fix for IIRFilter with SIMD registers + * Updated README.Debian with build instructions for Debian Developers + * Bumped standards version to 4.1.2 + + -- IOhannes m zmölnig (Debian/GNU) Tue, 19 Dec 2017 17:51:50 +0100 + +juce (5.2.0~repack-2) unstable; urgency=medium + + * Projucer: use Debian's JUCE modules by default + * modules-sources: force system provided use of libflac and libvorbis + (LP: #1720634) + * Recommend image/audio format libraries and depend on zlib-dev + * Fixed formatting of NEWS file + + -- IOhannes m zmölnig (Debian/GNU) Tue, 19 Dec 2017 11:43:22 +0100 + +juce (5.2.0~repack-1) unstable; urgency=medium + + * New upstream version 5.2.0~repack + + * Refreshed patches + - Dropped those applied upstream + - Dropped unneeded patch magic + - Removed reproducible DATE_TIME hacks + - Patch to fix spelling errors + - Patch to avoid checking for updates + - Added DEP-3 headers to patches + - Build GPL-3 variant of Projucer + * Added missing B-Ds, dropped unused B-Ds + * Dropped libjuce(0|-dev) packages + - juce-modules-source breaks/replaces libjuce-dev + * Re-ordered packages in d/control + * Installed lv2-ttl-generator as part of juce-tools + * "verbose" builds + * Dropped 'install' target + * Link with "--as-needed" + * Changed how to build debian-specific artifacts + * Force-disabled embedded zlib/jpeglib/pnglib + * Added "Keywords" to desktop-file + * Ship BREAKING-CHANGES.txt + * Updated README.Debian + * Added d/NEWS + * Updated d/copyright + - Excluded some more well-known binary files from licensecheck + * Modernized Vcs-Browser stanza + * Fixed reference to non-existing "introjucer" package in long description + * Dropped unused lintian override + * Bumped standards version to 4.1.1 + + -- IOhannes m zmölnig (Debian/GNU) Thu, 09 Nov 2017 15:04:02 +0100 + +juce (4.3.0~repack-1) unstable; urgency=medium + + * New upstream version 4.3.0~repack + + [ IOhannes m zmölnig ] + * Refreshed patches. + * Fixed LV2_wrapper. + * Recommend lv2-dev (for building LV2-plugins) + * Tightened versioned dependencies. + * Added Multi-Arch fields. + * Updated d/copyright(_hints) + + -- IOhannes m zmölnig (Debian/GNU) Fri, 04 Nov 2016 22:27:09 +0100 + +juce (4.2.4~repack-1) unstable; urgency=medium + + * New upstream version 4.2.4~repack + * Refreshed patches. + * Enabled VST pluginhost + * Tightened dependency of juce-utils + * Update d/copyright_hints + * Excluded more binary data from copyright-check + + -- IOhannes m zmölnig (Debian/GNU) Wed, 21 Sep 2016 12:21:37 +0200 + +juce (4.2.3~repack-1) unstable; urgency=medium + + * New upstream version 4.2.3~repack + + * Refreshed patches + * Documented how to properly checkout the project via gbp + * Updated d/copyright_hints + + -- IOhannes m zmölnig (Debian/GNU) Mon, 08 Aug 2016 15:47:12 +0200 + +juce (4.2.2+repack-1) unstable; urgency=medium + + * Imported Upstream version 4.2.2+repack + + * Fixed rule that fixes permissions of source-files + * Renamed introjucer/projucer package to juce-tools + * Updated README.Debian to reflect package rename + * Shortened extended description + * Updated d/copyright_hints + + -- IOhannes m zmölnig (Debian/GNU) Wed, 25 May 2016 17:01:46 +0200 + +juce (4.2.1+repack-2) unstable; urgency=medium + + * Drop "-march=native" from Projucer build-flags + * Refreshed libpng16 patch + + -- IOhannes m zmölnig (Debian/GNU) Mon, 02 May 2016 15:51:34 +0200 + +juce (4.2.1+repack-1) unstable; urgency=medium + + * Imported Upstream version 4.2.1+repack + * Introjucer has been replaced by Projucer + * Refreshed patches + * libjuce: manually include AppConfig.h + * libjuce0 symbols file (not used in packaging) + * Updated d/copyright + * Drop licenses that no longer apply from d/copyright + * Install documentation into /usr/share/doc/libjuce/ + * Bumped standards version to 3.9.8 + + -- IOhannes m zmölnig (Debian/GNU) Thu, 28 Apr 2016 23:38:46 +0200 + +juce (4.1.0+repack-6) unstable; urgency=medium + + * Updated d/copyright + * Fixed homepage field. + Thanks to Paul Wise (Closes: 820653) + * Set BUILD_TIME from d/changelog + + -- IOhannes m zmölnig (Debian/GNU) Wed, 13 Apr 2016 16:39:10 +0200 + +juce (4.1.0+repack-5) unstable; urgency=medium + + [ IOhannes m zmölnig ] + * LV2 support + * Added LV2-wrapper sources to -dev package. + * LV2-wrapper not included in library + * ttl-generator for lv2 + * Another try on a decent build-date. + * Clamped audio-plugin defines. + + [ Gianfranco Costamagna ] + * Fixed build with libpng16. (Closes: 820347) + + -- IOhannes m zmölnig (Debian/GNU) Thu, 07 Apr 2016 22:18:20 +0200 + +juce (4.1.0+repack-4) unstable; urgency=medium + + * Updated B-D from libpng12-dev to libpng-dev. + Thanks to Tobias Frost (Closes: #819438) + + -- IOhannes m zmölnig (Debian/GNU) Mon, 28 Mar 2016 21:17:16 +0200 + +juce (4.1.0+repack-3) unstable; urgency=medium + + * Dropped "-std=gnu++0x" from CFLAGS since we are already using "-std=c++11" + (Closes: #816000) + * Reverted uscan-compat to 3 + + -- IOhannes m zmölnig (Debian/GNU) Sat, 27 Feb 2016 17:02:27 +0100 + +juce (4.1.0+repack-2) unstable; urgency=medium + + * Use numeric build-date + * Nicer package description for 'introjucer' + * Fixed debian/watch + + -- IOhannes m zmölnig (Debian/GNU) Tue, 16 Feb 2016 16:45:04 +0100 + +juce (4.1.0+repack-1) unstable; urgency=medium + + * Initial release. (Closes: #808611) + + -- IOhannes m zmölnig (Debian/GNU) Fri, 12 Feb 2016 07:46:59 +0100 diff --git a/control b/control new file mode 100644 index 00000000..e7bf27f1 --- /dev/null +++ b/control @@ -0,0 +1,109 @@ +Source: juce +Section: devel +Priority: optional +Maintainer: Debian Multimedia Maintainers +Uploaders: + IOhannes m zmölnig (Debian/GNU) , +Build-Depends: + debhelper-compat (= 11), + pkg-config, + libasound2-dev, + libcurl4-gnutls-dev | libcurl-dev, + libfreetype6-dev, + libgl1-mesa-dev | libgl-dev, + libgtk-3-dev, + libjpeg-dev, + libwebkit2gtk-4.0-dev, + libx11-dev, + libxext-dev, + libxinerama-dev, + libxrandr-dev, + libxcomposite-dev, + libxcursor-dev, + zlib1g-dev, + help2man, +Build-Depends-Indep: + doxygen, + graphviz, + python3, +Standards-Version: 4.4.0 +Rules-Requires-Root: no +Homepage: https://www.juce.com +Vcs-Git: https://salsa.debian.org/multimedia-team/juce.git +Vcs-Browser: https://salsa.debian.org/multimedia-team/juce + +Package: juce-modules-source +Architecture: all +Multi-Arch: foreign +Depends: + ${shlibs:Depends}, + ${misc:Depends}, + libasound2-dev, + libcurl4-gnutls-dev | libcurl-dev, + libfreetype6-dev, + libgl1-mesa-dev | libgl-dev, + libx11-dev, + libxext-dev, + libxinerama-dev, + libxrandr-dev, + zlib1g-dev | libz-dev, + libwebkit2gtk-4.0-dev, + libgtk-3-dev, + libflac-dev, + libjpeg-dev, + libpng-dev, + libvorbis-dev, +Recommends: + lv2-dev, +Replaces: libjuce-dev (<< 5.2.0~) +Breaks: libjuce-dev (<< 5.2.0~) +Description: Jules' Utility Class Extensions (module sources) + JUCE (Jules' Utility Class Extensions) is an all-encompassing C++ framework for + developing cross-platform software. + . + It contains pretty much everything you're likely to need to create most + applications, and is particularly well-suited for building highly-customised + GUIs, and for handling graphics and sound. + . + This package provides the sources for the JUCE modules, as used by 'jucer' + projects. (Projucer is provided in the 'juce-tools' package). + +Package: juce-tools +Architecture: any +Depends: + ${shlibs:Depends}, + ${misc:Depends}, +Recommends: juce-modules-source +Breaks: introjucer +Replaces: introjucer +Conflicts: introjucer +Description: JUCE's project management tools + JUCE (Jules' Utility Class Extensions) is an all-encompassing C++ framework for + developing cross-platform software. + The Projucer (formerly Introjucer) is JUCE's project-management tool and secret + weapon. + . + The Projucer's Duties: + - Central management of cross-platform builds + - JUCE Module Management + - New Project Creation + - User-Interface Design Tool + - Plug-in Projects + - Miscellaneous Utilities + +Package: libjuce-doc +Architecture: all +Multi-Arch: foreign +Section: doc +Depends: + ${misc:Depends}, +Suggests: juce-modules-source +Description: Jules' Utility Class Extensions (documentation) + JUCE (Jules' Utility Class Extensions) is an all-encompassing C++ framework for + developing cross-platform software. + . + It contains pretty much everything you're likely to need to create most + applications, and is particularly well-suited for building highly-customised + GUIs, and for handling graphics and sound. + . + This package contains html documentation for the JUCE API. diff --git a/copyright b/copyright new file mode 100644 index 00000000..07be548b --- /dev/null +++ b/copyright @@ -0,0 +1,842 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: JUCE +Upstream-Contact: +Source: https://github.com/WeAreROLI/JUCE +Files-Excluded: + modules/juce_audio_formats/codecs/flac/* + modules/juce_audio_formats/codecs/oggvorbis/* + modules/juce_audio_plugin_client/AU/* + modules/juce_graphics/image_formats/jpglib/* + modules/juce_graphics/image_formats/pnglib/* + modules/juce_core/zip/zlib/* + .gitignore + +Files: * +Copyright: 2015-2019, ROLI Ltd +License: GPL-3 + +Files: + modules/juce_core/* + modules/juce_audio_devices/* + modules/juce_audio_basics/* + modules/juce_events/* + modules/juce_blocks_basics/* +Copyright: 2015-2019, ROLI Ltd +License: ISC + +Files: modules/juce_box2d/box2d/* + examples/Assets/Box2DTests/* + examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/* +Copyright: 2006-2011, Erin Catto http://www.box2d.org +License: Zlib/libpng + +Files: modules/juce_audio_processors/format_types/VST3_SDK/* +Copyright: 2018-2019, Steinberg Media Technologies GmbH +License: GPL-3 + +Files: modules/juce_audio_processors/format_types/VST3_SDK/base/* +Copyright: 2018-2019, Steinberg Media Technologies GmbH +License: BSD-3-clause + +Files: + ex*/*/Builds/Android/gradle/wrapper/* + extras/Projucer/Source/BinaryData/gradle/* +Copyright: 2015 Gradle Inc. +License: Apache-2.0 + +Files: debian/* +Copyright: 2015-2019, IOhannes m zmölnig +License: GPL-2+ or GPL-3 + +Files: debian/extra/juce_audio_plugin_client/* debian/extra/lv2-ttl-generator/lv2_ttl_generator.c +Copyright: Filipe Coelho +License: GPL-2+ or AGPL-3 + +Files: debian/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h +Copyright: NONE +License: public-domain +License-Grant: + This work is in public domain. + . + This file 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. + . + If you have questions, contact Filipe Coelho (aka falkTX) + or ask in #lad channel, FreeNode IRC network. + + +License: GPL-3 + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + . + 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 complete text of the GNU General Public License + (GPL) version 3 can be found in "/usr/share/common-licenses/GPL-3". + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +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, 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. + . + Some files differ from above by replacing "this program" with "this + file". + . + On Debian GNU systems, the complete text of the GNU General Public + License (GPL) version 2 or later can be found in + '/usr/share/common-licenses/GPL-2'. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +License: Zlib/libpng + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + . + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + . + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +License: AGPL-3 + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + . + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + . + Preamble + . + The GNU Affero General Public License is a free, copyleft license for + software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software. + . + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + our General Public Licenses are intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains + free software for all its users. + . + When we speak of free software, we are referring to freedom, not price. + Our General Public Licenses are designed to make sure that you have the + freedom to distribute copies of free software (and charge for them if + you wish), that you receive source code or can get it if you want it, + that you can change the software or use pieces of it in new free + programs, and that you know you can do these things. + . + Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer you + this License which gives you legal permission to copy, distribute + and/or modify the software. + . + A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they receive + widespread use, become available for other developers to incorporate. + Many developers of free software are heartened and encouraged by the + resulting cooperation. However, in the case of software used on + network servers, this result may fail to come about. The GNU General + Public License permits making a modified version and letting the public + access it on a server without ever releasing its source code to the + public. + . + The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version. + . + An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing + under this license. + . + The precise terms and conditions for copying, distribution and + modification follow. + . + TERMS AND CONDITIONS + . + 0. Definitions. + . + "This License" refers to version 3 of the GNU Affero General Public + License. + . + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + . + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + . + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of + an exact copy. The resulting work is called a "modified version" of + the earlier work or a work "based on" the earlier work. + . + A "covered work" means either the unmodified Program or a work based on + the Program. + . + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + . + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not + conveying. + . + An interactive user interface displays "Appropriate Legal Notices" to + the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If the + interface presents a list of user commands or options, such as a menu, + a prominent item in the list meets this criterion. + . + 1. Source Code. + . + The "source code" for a work means the preferred form of the work for + making modifications to it. "Object code" means any non-source form of + a work. + . + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that is + widely used among developers working in that language. + . + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A "Major + Component", in this context, means a major essential component (kernel, + window system, and so on) of the specific operating system (if any) on + which the executable work runs, or a compiler used to produce the work, + or an object code interpreter used to run it. + . + The "Corresponding Source" for a work in object code form means all the + source code needed to generate, install, and (for an executable work) + run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + . + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding Source. + . + The Corresponding Source for a work in source code form is that same + work. + . + 2. Basic Permissions. + . + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + . + You may make, run and propagate covered works that you do not convey, + without conditions so long as your license otherwise remains in force. + You may convey covered works to others for the sole purpose of having + them make modifications exclusively for you, or provide you with + facilities for running those works, provided that you comply with the + terms of this License in conveying all material for which you do not + control copyright. Those thus making or running the covered works for + you must do so exclusively on your behalf, under your direction and + control, on terms that prohibit them from making any copies of your + copyrighted material outside their relationship with you. + . + Conveying under any other circumstances is permitted solely under the + conditions stated below. Sublicensing is not allowed; section 10 makes + it unnecessary. + . + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + . + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar + laws prohibiting or restricting circumvention of such measures. + . + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such + circumvention is effected by exercising rights under this License with + respect to the covered work, and you disclaim any intention to limit + operation or modification of the work as a means of enforcing, against + the work's users, your or third parties' legal rights to forbid + circumvention of technological measures. + . + 4. Conveying Verbatim Copies. + . + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + . + You may charge any price or no price for each copy that you convey, and + you may offer support or warranty protection for a fee. + . + 5. Conveying Modified Source Versions. + . + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the terms + of section 4, provided that you also meet all of these conditions: + . + a) The work must carry prominent notices stating that you modified it, + and giving a relevant date. + . + b) The work must carry prominent notices stating that it is released + under this License and any conditions added under section 7. This + requirement modifies the requirement in section 4 to "keep intact all + notices". + . + c) You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will + therefore apply, along with any applicable section 7 additional terms, + to the whole of the work, and all its parts, regardless of how they are + packaged. This License gives no permission to license the work in any + other way, but it does not invalidate such permission if you have + separately received it. + . + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your work + need not make them do so. + . + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, in + or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not used + to limit the access or legal rights of the compilation's users beyond + what the individual works permit. Inclusion of a covered work in an + aggregate does not cause this License to apply to the other parts of + the aggregate. + . + 6. Conveying Non-Source Forms. + . + You may convey a covered work in object code form under the terms of + sections 4 and 5, provided that you also convey the machine-readable + Corresponding Source under the terms of this License, in one of these + ways: + . + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium customarily + used for software interchange. + . + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a written + offer, valid for at least three years and valid for as long as you + offer spare parts or customer support for that product model, to give + anyone who possesses the object code either (1) a copy of the + Corresponding Source for all the software in the product that is + covered by this License, on a durable physical medium customarily used + for software interchange, for a price no more than your reasonable cost + of physically performing this conveying of source, or (2) access to + copy the Corresponding Source from a network server at no charge. + . + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This alternative is + allowed only occasionally and noncommercially, and only if you received + the object code with such an offer, in accord with subsection 6b. + . + d) Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to copy + the object code is a network server, the Corresponding Source may be on + a different server (operated by you or a third party) that supports + equivalent copying facilities, provided you maintain clear directions + next to the object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you remain + obligated to ensure that it is available for as long as needed to + satisfy these requirements. + . + e) Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of + the work are being offered to the general public at no charge under + subsection 6d. + . + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be included + in conveying the object code work. + . + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for + incorporation into a dwelling. In determining whether a product is a + consumer product, doubtful cases shall be resolved in favor of + coverage. For a particular product received by a particular user, + "normally used" refers to a typical or common use of that class of + product, regardless of the status of the particular user or of the way + in which the particular user actually uses, or expects or is expected + to use, the product. A product is a consumer product regardless of + whether the product has substantial commercial, industrial or + non-consumer uses, unless such uses represent the only significant mode + of use of the product. + . + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that User + Product from a modified version of its Corresponding Source. The + information must suffice to ensure that the continued functioning of + the modified object code is in no case prevented or interfered with + solely because modification has been made. + . + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied by + the Installation Information. But this requirement does not apply if + neither you nor any third party retains the ability to install modified + object code on the User Product (for example, the work has been + installed in ROM). + . + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or + updates for a work that has been modified or installed by the + recipient, or for the User Product in which it has been modified or + installed. Access to a network may be denied when the modification + itself materially and adversely affects the operation of the network or + violates the rules and protocols for communication across the network. + . + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + . + 7. Additional Terms. + . + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + . + When you convey a copy of a covered work, you may at your option remove + any additional permissions from that copy, or from any part of it. + (Additional permissions may be written to require their own removal in + certain cases when you modify the work.) You may place additional + permissions on material, added by you to a covered work, for which you + have or can give appropriate copyright permission. + . + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders + of that material) supplement the terms of this License with terms: + . + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + . + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + . + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + . + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + . + e) Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or + . + f) Requiring indemnification of licensors and authors of that material + by anyone who conveys the material (or modified versions of it) with + contractual assumptions of liability to the recipient, for any + liability that these contractual assumptions directly impose on those + licensors and authors. + . + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + . + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the additional + terms that apply to those files, or a notice indicating where to find + the applicable terms. + . + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; the + above requirements apply either way. + . + 8. Termination. + . + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + . + However, if you cease all violation of this License, then your license + from a particular copyright holder is reinstated (a) provisionally, + unless and until the copyright holder explicitly and finally terminates + your license, and (b) permanently, if the copyright holder fails to + notify you of the violation by some reasonable means prior to 60 days + after the cessation. + . + Moreover, your license from a particular copyright holder is reinstated + permanently if the copyright holder notifies you of the violation by + some reasonable means, this is the first time you have received notice + of violation of this License (for any work) from that copyright holder, + and you cure the violation prior to 30 days after your receipt of the + notice. + . + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + . + 9. Acceptance Not Required for Having Copies. + . + You are not required to accept this License in order to receive or run + a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission to + receive a copy likewise does not require acceptance. However, nothing + other than this License grants you permission to propagate or modify + any covered work. These actions infringe copyright if you do not + accept this License. Therefore, by modifying or propagating a covered + work, you indicate your acceptance of this License to do so. + . + 10. Automatic Licensing of Downstream Recipients. + . + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + . + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that transaction + who receives a copy of the work also receives whatever licenses to the + work the party's predecessor in interest had or could give under the + previous paragraph, plus a right to possession of the Corresponding + Source of the work from the predecessor in interest, if the predecessor + has it or can get it with reasonable efforts. + . + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + . + 11. Patents. + . + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + . + A contributor's "essential patent claims" are all patent claims owned + or controlled by the contributor, whether already acquired or hereafter + acquired, that would be infringed by some manner, permitted by this + License, of making, using, or selling its contributor version, but do + not include claims that would be infringed only as a consequence of + further modification of the contributor version. For purposes of this + definition, "control" includes the right to grant patent sublicenses in + a manner consistent with the requirements of this License. + . + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + . + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + . + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone to + copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + . + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + . + A patent license is "discriminatory" if it does not include within the + scope of its coverage, prohibits the exercise of, or is conditioned on + the non-exercise of one or more of the rights that are specifically + granted under this License. You may not convey a covered work if you + are a party to an arrangement with a third party that is in the + business of distributing software, under which you make payment to the + third party based on the extent of your activity of conveying the work, + and under which the third party grants, to any of the parties who would + receive the covered work from you, a discriminatory patent license (a) + in connection with copies of the covered work conveyed by you (or + copies made from those copies), or (b) primarily for and in connection + with specific products or compilations that contain the covered work, + unless you entered into that arrangement, or that patent license was + granted, prior to 28 March 2007. + . + Nothing in this License shall be construed as excluding or limiting any + implied license or other defenses to infringement that may otherwise be + available to you under applicable patent law. + . + 12. No Surrender of Others' Freedom. + . + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under + this License and any other pertinent obligations, then as a consequence + you may not convey it at all. For example, if you agree to terms that + obligate you to collect a royalty for further conveying from those to + whom you convey the Program, the only way you could satisfy both those + terms and this License would be to refrain entirely from conveying the + Program. + . + 13. Remote Network Interaction; Use with the GNU General Public + License. + . + Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your + version supports such interaction) an opportunity to receive the + Corresponding Source of your version by providing access to the + Corresponding Source from a network server at no charge, through some + standard or customary means of facilitating copying of software. This + Corresponding Source shall include the Corresponding Source for any + work covered by version 3 of the GNU General Public License that is + incorporated pursuant to the following paragraph. + . + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the work with which it is combined will remain governed by version + 3 of the GNU General Public License. + . + 14. Revised Versions of this License. + . + The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. + . + Each version is given a distinguishing version number. If the Program + specifies that a certain numbered version of the GNU Affero General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU Affero General Public License, you may choose any version ever + published by the Free Software Foundation. + . + If the Program specifies that a proxy can decide which future versions + of the GNU Affero General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + . + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + . + 15. Disclaimer of Warranty. + . + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE + OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU + ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + . + 16. Limitation of Liability. + . + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR + CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT + NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES + SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO + OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY + HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + . + 17. Interpretation of Sections 15 and 16. + . + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + . + END OF TERMS AND CONDITIONS + . + How to Apply These Terms to Your New Programs + . + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these + terms. + . + To do so, attach the following notices to the program. It is safest to + attach them to the start of each source file to most effectively state + the exclusion of warranty; and each file should have at least the + "copyright" line and a pointer to where the full notice is found. + . + + Copyright (C) + . + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 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 + Affero General Public License for more details. + . + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see + . + . + Also add information on how to contact you by electronic and paper + mail. + . + If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements. + . + You should also get your employer (if you work as a programmer) or + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. For more information on this, and how to apply and follow + the GNU AGPL, see . + +License: ISC + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + . + THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + +License: Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +Comment: + On Debian systems, the complete text of the Apache License version 2.0 can + be found in "/usr/share/common-licenses/Apache-2.0". + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Steinberg Media Technologies nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + +License: public-domain + This work is in public domain. diff --git a/copyright_hints b/copyright_hints new file mode 100644 index 00000000..1f0c8d40 --- /dev/null +++ b/copyright_hints @@ -0,0 +1,2436 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: FIXME +Upstream-Contact: FIXME +Source: FIXME +Disclaimer: Autogenerated by licensecheck + +Files: ./examples/DemoRunner/Source/Demos/DemoPIPs1.cpp + ./examples/DemoRunner/Source/Demos/DemoPIPs2.cpp + ./examples/DemoRunner/Source/Demos/IntroScreen.h + ./examples/DemoRunner/Source/Demos/JUCEDemos.cpp + ./examples/DemoRunner/Source/Demos/JUCEDemos.h + ./examples/DemoRunner/Source/Main.cpp + ./examples/DemoRunner/Source/UI/DemoContentComponent.cpp + ./examples/DemoRunner/Source/UI/DemoContentComponent.h + ./examples/DemoRunner/Source/UI/MainComponent.cpp + ./examples/DemoRunner/Source/UI/MainComponent.h + ./examples/DemoRunner/Source/UI/SettingsContent.h + ./extras/AudioPerformanceTest/Source/Main.cpp + ./extras/AudioPerformanceTest/Source/MainComponent.h + ./extras/AudioPluginHost/Source/HostStartup.cpp + ./extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.cpp + ./extras/AudioPluginHost/Source/Plugins/IOConfigurationWindow.h + ./extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp + ./extras/AudioPluginHost/Source/Plugins/InternalPlugins.h + ./extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp + ./extras/AudioPluginHost/Source/Plugins/PluginGraph.h + ./extras/AudioPluginHost/Source/UI/GraphEditorPanel.cpp + ./extras/AudioPluginHost/Source/UI/GraphEditorPanel.h + ./extras/AudioPluginHost/Source/UI/MainHostWindow.cpp + ./extras/AudioPluginHost/Source/UI/MainHostWindow.h + ./extras/AudioPluginHost/Source/UI/PluginWindow.h + ./extras/BinaryBuilder/Source/Main.cpp + ./extras/NetworkGraphicsDemo/Source/Demos.h + ./extras/NetworkGraphicsDemo/Source/Main.cpp + ./extras/NetworkGraphicsDemo/Source/MasterComponent.h + ./extras/NetworkGraphicsDemo/Source/SharedCanvas.h + ./extras/NetworkGraphicsDemo/Source/SlaveComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_AboutWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_EditorColourSchemeWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_FloatingToolWindow.h + ./extras/Projucer/Source/Application/Windows/jucer_GlobalPathsWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_PIPCreatorWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_SVGPathDataWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_TranslationToolWindowComponent.h + ./extras/Projucer/Source/Application/Windows/jucer_UTF8WindowComponent.h + ./extras/Projucer/Source/Application/jucer_Application.cpp + ./extras/Projucer/Source/Application/jucer_Application.h + ./extras/Projucer/Source/Application/jucer_AutoUpdater.cpp + ./extras/Projucer/Source/Application/jucer_AutoUpdater.h + ./extras/Projucer/Source/Application/jucer_CommandIDs.h + ./extras/Projucer/Source/Application/jucer_CommandLine.cpp + ./extras/Projucer/Source/Application/jucer_CommandLine.h + ./extras/Projucer/Source/Application/jucer_CommonHeaders.h + ./extras/Projucer/Source/Application/jucer_Headers.h + ./extras/Projucer/Source/Application/jucer_Main.cpp + ./extras/Projucer/Source/Application/jucer_MainWindow.cpp + ./extras/Projucer/Source/Application/jucer_MainWindow.h + ./extras/Projucer/Source/Application/jucer_ProjucerAnalytics.cpp + ./extras/Projucer/Source/Application/jucer_ProjucerAnalytics.h + ./extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.cpp + ./extras/Projucer/Source/CodeEditor/jucer_DocumentEditorComponent.h + ./extras/Projucer/Source/CodeEditor/jucer_ItemPreviewComponent.h + ./extras/Projucer/Source/CodeEditor/jucer_LiveBuildCodeEditor.h + ./extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.cpp + ./extras/Projucer/Source/CodeEditor/jucer_OpenDocumentManager.h + ./extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.cpp + ./extras/Projucer/Source/CodeEditor/jucer_SourceCodeEditor.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ButtonHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ComboBoxHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentNameProperty.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.cpp + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentTypeHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ComponentUndoableAction.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_GenericComponentHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_GroupComponentHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_HyperlinkButtonHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ImageButtonHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_JucerComponentHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_LabelHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_SliderHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_TabbedComponentHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_TextButtonHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_TextEditorHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ToggleButtonHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_TreeViewHandler.h + ./extras/Projucer/Source/ComponentEditor/Components/jucer_ViewportHandler.h + ./extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.cpp + ./extras/Projucer/Source/ComponentEditor/Documents/jucer_ButtonDocument.h + ./extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.cpp + ./extras/Projucer/Source/ComponentEditor/Documents/jucer_ComponentDocument.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.cpp + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ColouredElement.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ElementSiblingComponent.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_FillType.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_GradientPointComponent.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_ImageResourceProperty.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.cpp + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElement.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementEllipse.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.cpp + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementGroup.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.cpp + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementImage.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.cpp + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementPath.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRectangle.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementRoundedRectangle.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementText.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PaintElementUndoableAction.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_PointComponent.h + ./extras/Projucer/Source/ComponentEditor/PaintElements/jucer_StrokeType.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_ColourPropertyComponent.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentBooleanProperty.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentChoiceProperty.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentColourProperty.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_ComponentTextProperty.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_FilePropertyComponent.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_JustificationProperty.h + ./extras/Projucer/Source/ComponentEditor/Properties/jucer_PositionPropertyBase.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutEditor.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentLayoutPanel.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ComponentOverlayComponent.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_EditingPanelBase.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_JucerCommandIDs.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_JucerDocumentEditor.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutineEditor.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_PaintRoutinePanel.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_RelativePositionedRectangle.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_ResourceEditorPanel.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_SnapGridPainter.h + ./extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.cpp + ./extras/Projucer/Source/ComponentEditor/UI/jucer_TestComponent.h + ./extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.h + ./extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.h + ./extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_GeneratedCode.h + ./extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.h + ./extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_ObjectTypes.h + ./extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.cpp + ./extras/Projucer/Source/ComponentEditor/jucer_PaintRoutine.h + ./extras/Projucer/Source/ComponentEditor/jucer_UtilityFunctions.h + ./extras/Projucer/Source/Licenses/jucer_LicenseController.cpp + ./extras/Projucer/Source/Licenses/jucer_LicenseController.h + ./extras/Projucer/Source/Licenses/jucer_LicenseThread.h + ./extras/Projucer/Source/Licenses/jucer_LicenseWebview.h + ./extras/Projucer/Source/LiveBuildEngine/UI/jucer_ActivityListComponent.h + ./extras/Projucer/Source/LiveBuildEngine/UI/jucer_BuildTabStatusComponent.h + ./extras/Projucer/Source/LiveBuildEngine/UI/jucer_ComponentListComponent.h + ./extras/Projucer/Source/LiveBuildEngine/UI/jucer_ErrorListComponent.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_ActivityList.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_ClassDatabase.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_ClientServerMessages.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.cpp + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineDLL.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineServer.cpp + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineServer.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineSettings.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_CppHelpers.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_DiagnosticMessage.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.cpp + ./extras/Projucer/Source/LiveBuildEngine/jucer_DownloadCompileEngineThread.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_ErrorList.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_LiveCodeBuilderDLL.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_MessageIDs.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_ProjectBuildInfo.h + ./extras/Projucer/Source/LiveBuildEngine/jucer_SourceCodeRange.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_ExporterTreeItems.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_LiveBuildTab.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_ModuleTreeItems.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTab.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_TabComponents.h + ./extras/Projucer/Source/Project/UI/Sidebar/jucer_TreeItemTypes.h + ./extras/Projucer/Source/Project/UI/jucer_ContentViewComponents.h + ./extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h + ./extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp + ./extras/Projucer/Source/Project/UI/jucer_HeaderComponent.h + ./extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h + ./extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp + ./extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h + ./extras/Projucer/Source/Project/jucer_Module.cpp + ./extras/Projucer/Source/Project/jucer_Module.h + ./extras/Projucer/Source/Project/jucer_Project.cpp + ./extras/Projucer/Source/Project/jucer_Project.h + ./extras/Projucer/Source/Project/jucer_ProjectType.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp + ./extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h + ./extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.cpp + ./extras/Projucer/Source/ProjectSaving/jucer_ResourceFile.h + ./extras/Projucer/Source/ProjectSaving/jucer_XcodeProjectParser.h + ./extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp + ./extras/Projucer/Source/Settings/jucer_AppearanceSettings.h + ./extras/Projucer/Source/Settings/jucer_StoredSettings.cpp + ./extras/Projucer/Source/Settings/jucer_StoredSettings.h + ./extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.cpp + ./extras/Projucer/Source/Utility/Helpers/jucer_CodeHelpers.h + ./extras/Projucer/Source/Utility/Helpers/jucer_Colours.h + ./extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp + ./extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.h + ./extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.cpp + ./extras/Projucer/Source/Utility/Helpers/jucer_MiscUtilities.h + ./extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h + ./extras/Projucer/Source/Utility/Helpers/jucer_RelativePath.h + ./extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h + ./extras/Projucer/Source/Utility/Helpers/jucer_ValueSourceHelpers.h + ./extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp + ./extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.h + ./extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_ColourPropertyComponent.h + ./extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_FilePathPropertyComponent.h + ./extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_LabelPropertyComponent.h + ./extras/Projucer/Source/Utility/UI/PropertyComponents/jucer_PropertyComponentsWithEnablement.h + ./extras/Projucer/Source/Utility/UI/jucer_IconButton.h + ./extras/Projucer/Source/Utility/UI/jucer_Icons.cpp + ./extras/Projucer/Source/Utility/UI/jucer_Icons.h + ./extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.cpp + ./extras/Projucer/Source/Utility/UI/jucer_JucerTreeViewBase.h + ./extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.cpp + ./extras/Projucer/Source/Utility/UI/jucer_ProjucerLookAndFeel.h + ./extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.cpp + ./extras/Projucer/Source/Utility/UI/jucer_SlidingPanelComponent.h + ./extras/Projucer/Source/Utility/UI/jucer_UserSettingsPopup.h + ./extras/Projucer/Source/Wizards/jucer_NewFileWizard.cpp + ./extras/Projucer/Source/Wizards/jucer_NewFileWizard.h + ./extras/Projucer/Source/Wizards/jucer_NewProjectWizard.h + ./extras/Projucer/Source/Wizards/jucer_NewProjectWizardClasses.cpp + ./extras/Projucer/Source/Wizards/jucer_NewProjectWizardClasses.h + ./extras/Projucer/Source/Wizards/jucer_NewProjectWizardComponent.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_Animated.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_AudioApp.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_AudioPlugin.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_Blank.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_Console.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_DLL.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_GUIApp.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_StaticLibrary.h + ./extras/Projucer/Source/Wizards/jucer_ProjectWizard_openGL.h + ./extras/Projucer/Source/Wizards/jucer_StartPageComponent.h + ./extras/Projucer/Source/Wizards/jucer_TemplateThumbnailsComponent.h + ./extras/UnitTestRunner/Source/Main.cpp + ./modules/juce_analytics/analytics/juce_Analytics.cpp + ./modules/juce_analytics/analytics/juce_Analytics.h + ./modules/juce_analytics/analytics/juce_ButtonTracker.cpp + ./modules/juce_analytics/analytics/juce_ButtonTracker.h + ./modules/juce_analytics/destinations/juce_AnalyticsDestination.h + ./modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.cpp + ./modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h + ./modules/juce_analytics/juce_analytics.cpp + ./modules/juce_analytics/juce_analytics.h + ./modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.cpp + ./modules/juce_audio_basics/buffers/juce_AudioProcessLoadMeasurer.h + ./modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h + ./modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_WavAudioFormat.h + ./modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp + ./modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h + ./modules/juce_audio_formats/format/juce_AudioFormat.cpp + ./modules/juce_audio_formats/format/juce_AudioFormat.h + ./modules/juce_audio_formats/format/juce_AudioFormatManager.cpp + ./modules/juce_audio_formats/format/juce_AudioFormatManager.h + ./modules/juce_audio_formats/format/juce_AudioFormatReader.cpp + ./modules/juce_audio_formats/format/juce_AudioFormatReader.h + ./modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp + ./modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h + ./modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp + ./modules/juce_audio_formats/format/juce_AudioFormatWriter.h + ./modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp + ./modules/juce_audio_formats/format/juce_AudioSubsectionReader.h + ./modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp + ./modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h + ./modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h + ./modules/juce_audio_formats/juce_audio_formats.cpp + ./modules/juce_audio_formats/juce_audio_formats.h + ./modules/juce_audio_formats/juce_audio_formats.mm + ./modules/juce_audio_formats/sampler/juce_Sampler.cpp + ./modules/juce_audio_formats/sampler/juce_Sampler.h + ./modules/juce_audio_plugin_client/AAX/juce_AAX_Modifier_Injector.h + ./modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp + ./modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp + ./modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h + ./modules/juce_audio_plugin_client/Unity/juce_UnityPluginInterface.h + ./modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp + ./modules/juce_audio_plugin_client/VST/juce_VSTCallbackHandler.h + ./modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp + ./modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm + ./modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client.h + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AAX.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AU.r + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_1.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AU_2.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_1.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_2.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_3.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_4.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS_utils.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_Unity.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_VST2.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_VST_utils.mm + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_utils.cpp + ./modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h + ./modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h + ./modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h + ./modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h + ./modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h + ./modules/juce_audio_plugin_client/utility/juce_PluginHostType.h + ./modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp + ./modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h + ./modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp + ./modules/juce_audio_processors/format/juce_AudioPluginFormat.h + ./modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp + ./modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h + ./modules/juce_audio_processors/format_types/juce_AU_Shared.h + ./modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h + ./modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm + ./modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp + ./modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h + ./modules/juce_audio_processors/format_types/juce_LegacyAudioParameter.cpp + ./modules/juce_audio_processors/format_types/juce_VST3Common.h + ./modules/juce_audio_processors/format_types/juce_VST3Headers.h + ./modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp + ./modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h + ./modules/juce_audio_processors/format_types/juce_VSTCommon.h + ./modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h + ./modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp + ./modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h + ./modules/juce_audio_processors/juce_audio_processors.cpp + ./modules/juce_audio_processors/juce_audio_processors.h + ./modules/juce_audio_processors/juce_audio_processors.mm + ./modules/juce_audio_processors/processors/juce_AudioPluginInstance.cpp + ./modules/juce_audio_processors/processors/juce_AudioPluginInstance.h + ./modules/juce_audio_processors/processors/juce_AudioProcessor.cpp + ./modules/juce_audio_processors/processors/juce_AudioProcessor.h + ./modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp + ./modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h + ./modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp + ./modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h + ./modules/juce_audio_processors/processors/juce_AudioProcessorListener.h + ./modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h + ./modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp + ./modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h + ./modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp + ./modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h + ./modules/juce_audio_processors/processors/juce_PluginDescription.cpp + ./modules/juce_audio_processors/processors/juce_PluginDescription.h + ./modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp + ./modules/juce_audio_processors/scanning/juce_KnownPluginList.h + ./modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp + ./modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h + ./modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp + ./modules/juce_audio_processors/scanning/juce_PluginListComponent.h + ./modules/juce_audio_processors/utilities/juce_AudioParameterBool.cpp + ./modules/juce_audio_processors/utilities/juce_AudioParameterBool.h + ./modules/juce_audio_processors/utilities/juce_AudioParameterChoice.cpp + ./modules/juce_audio_processors/utilities/juce_AudioParameterChoice.h + ./modules/juce_audio_processors/utilities/juce_AudioParameterFloat.cpp + ./modules/juce_audio_processors/utilities/juce_AudioParameterFloat.h + ./modules/juce_audio_processors/utilities/juce_AudioParameterInt.cpp + ./modules/juce_audio_processors/utilities/juce_AudioParameterInt.h + ./modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.cpp + ./modules/juce_audio_processors/utilities/juce_AudioProcessorParameterWithID.h + ./modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp + ./modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h + ./modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp + ./modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h + ./modules/juce_audio_utils/audio_cd/juce_AudioCDBurner.h + ./modules/juce_audio_utils/audio_cd/juce_AudioCDReader.cpp + ./modules/juce_audio_utils/audio_cd/juce_AudioCDReader.h + ./modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp + ./modules/juce_audio_utils/gui/juce_AudioAppComponent.h + ./modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp + ./modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h + ./modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp + ./modules/juce_audio_utils/gui/juce_AudioThumbnail.h + ./modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h + ./modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp + ./modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h + ./modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp + ./modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h + ./modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h + ./modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp + ./modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h + ./modules/juce_audio_utils/juce_audio_utils.cpp + ./modules/juce_audio_utils/juce_audio_utils.h + ./modules/juce_audio_utils/juce_audio_utils.mm + ./modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp + ./modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm + ./modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp + ./modules/juce_audio_utils/native/juce_linux_BluetoothMidiDevicePairingDialogue.cpp + ./modules/juce_audio_utils/native/juce_mac_AudioCDBurner.mm + ./modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm + ./modules/juce_audio_utils/native/juce_mac_BluetoothMidiDevicePairingDialogue.mm + ./modules/juce_audio_utils/native/juce_win32_AudioCDBurner.cpp + ./modules/juce_audio_utils/native/juce_win32_AudioCDReader.cpp + ./modules/juce_audio_utils/native/juce_win_BluetoothMidiDevicePairingDialogue.cpp + ./modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp + ./modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h + ./modules/juce_audio_utils/players/juce_SoundPlayer.cpp + ./modules/juce_audio_utils/players/juce_SoundPlayer.h + ./modules/juce_box2d/juce_box2d.cpp + ./modules/juce_box2d/juce_box2d.h + ./modules/juce_box2d/utils/juce_Box2DRenderer.cpp + ./modules/juce_box2d/utils/juce_Box2DRenderer.h + ./modules/juce_cryptography/encryption/juce_BlowFish.cpp + ./modules/juce_cryptography/encryption/juce_BlowFish.h + ./modules/juce_cryptography/encryption/juce_Primes.cpp + ./modules/juce_cryptography/encryption/juce_Primes.h + ./modules/juce_cryptography/encryption/juce_RSAKey.cpp + ./modules/juce_cryptography/encryption/juce_RSAKey.h + ./modules/juce_cryptography/hashing/juce_MD5.cpp + ./modules/juce_cryptography/hashing/juce_MD5.h + ./modules/juce_cryptography/hashing/juce_SHA256.cpp + ./modules/juce_cryptography/hashing/juce_SHA256.h + ./modules/juce_cryptography/hashing/juce_Whirlpool.cpp + ./modules/juce_cryptography/hashing/juce_Whirlpool.h + ./modules/juce_cryptography/juce_cryptography.cpp + ./modules/juce_cryptography/juce_cryptography.h + ./modules/juce_cryptography/juce_cryptography.mm + ./modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp + ./modules/juce_data_structures/app_properties/juce_ApplicationProperties.h + ./modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp + ./modules/juce_data_structures/app_properties/juce_PropertiesFile.h + ./modules/juce_data_structures/juce_data_structures.cpp + ./modules/juce_data_structures/juce_data_structures.h + ./modules/juce_data_structures/juce_data_structures.mm + ./modules/juce_data_structures/undomanager/juce_UndoManager.cpp + ./modules/juce_data_structures/undomanager/juce_UndoManager.h + ./modules/juce_data_structures/undomanager/juce_UndoableAction.h + ./modules/juce_data_structures/values/juce_CachedValue.cpp + ./modules/juce_data_structures/values/juce_CachedValue.h + ./modules/juce_data_structures/values/juce_Value.cpp + ./modules/juce_data_structures/values/juce_Value.h + ./modules/juce_data_structures/values/juce_ValueTree.cpp + ./modules/juce_data_structures/values/juce_ValueTree.h + ./modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp + ./modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h + ./modules/juce_data_structures/values/juce_ValueWithDefault.cpp + ./modules/juce_data_structures/values/juce_ValueWithDefault.h + ./modules/juce_dsp/containers/juce_AudioBlock.h + ./modules/juce_dsp/containers/juce_SIMDRegister.h + ./modules/juce_dsp/containers/juce_SIMDRegister_Impl.h + ./modules/juce_dsp/containers/juce_SIMDRegister_test.cpp + ./modules/juce_dsp/filter_design/juce_FilterDesign.cpp + ./modules/juce_dsp/filter_design/juce_FilterDesign.h + ./modules/juce_dsp/frequency/juce_Convolution.cpp + ./modules/juce_dsp/frequency/juce_Convolution.h + ./modules/juce_dsp/frequency/juce_FFT.cpp + ./modules/juce_dsp/frequency/juce_FFT.h + ./modules/juce_dsp/frequency/juce_FFT_test.cpp + ./modules/juce_dsp/frequency/juce_Windowing.cpp + ./modules/juce_dsp/frequency/juce_Windowing.h + ./modules/juce_dsp/juce_dsp.cpp + ./modules/juce_dsp/juce_dsp.h + ./modules/juce_dsp/juce_dsp.mm + ./modules/juce_dsp/maths/juce_FastMathApproximations.h + ./modules/juce_dsp/maths/juce_LogRampedValue.h + ./modules/juce_dsp/maths/juce_LogRampedValue_test.cpp + ./modules/juce_dsp/maths/juce_LookupTable.cpp + ./modules/juce_dsp/maths/juce_LookupTable.h + ./modules/juce_dsp/maths/juce_Matrix.cpp + ./modules/juce_dsp/maths/juce_Matrix.h + ./modules/juce_dsp/maths/juce_Matrix_test.cpp + ./modules/juce_dsp/maths/juce_Phase.h + ./modules/juce_dsp/maths/juce_Polynomial.h + ./modules/juce_dsp/maths/juce_SpecialFunctions.cpp + ./modules/juce_dsp/maths/juce_SpecialFunctions.h + ./modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp + ./modules/juce_dsp/native/juce_avx_SIMDNativeOps.h + ./modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h + ./modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp + ./modules/juce_dsp/native/juce_neon_SIMDNativeOps.h + ./modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp + ./modules/juce_dsp/native/juce_sse_SIMDNativeOps.h + ./modules/juce_dsp/processors/juce_Bias.h + ./modules/juce_dsp/processors/juce_FIRFilter.cpp + ./modules/juce_dsp/processors/juce_FIRFilter.h + ./modules/juce_dsp/processors/juce_FIRFilter_test.cpp + ./modules/juce_dsp/processors/juce_Gain.h + ./modules/juce_dsp/processors/juce_IIRFilter.cpp + ./modules/juce_dsp/processors/juce_IIRFilter.h + ./modules/juce_dsp/processors/juce_IIRFilter_Impl.h + ./modules/juce_dsp/processors/juce_LadderFilter.cpp + ./modules/juce_dsp/processors/juce_LadderFilter.h + ./modules/juce_dsp/processors/juce_Oscillator.h + ./modules/juce_dsp/processors/juce_Oversampling.cpp + ./modules/juce_dsp/processors/juce_Oversampling.h + ./modules/juce_dsp/processors/juce_ProcessContext.h + ./modules/juce_dsp/processors/juce_ProcessorChain.h + ./modules/juce_dsp/processors/juce_ProcessorDuplicator.h + ./modules/juce_dsp/processors/juce_ProcessorWrapper.h + ./modules/juce_dsp/processors/juce_Reverb.h + ./modules/juce_dsp/processors/juce_StateVariableFilter.h + ./modules/juce_dsp/processors/juce_WaveShaper.h + ./modules/juce_graphics/colour/juce_Colour.cpp + ./modules/juce_graphics/colour/juce_Colour.h + ./modules/juce_graphics/colour/juce_ColourGradient.cpp + ./modules/juce_graphics/colour/juce_ColourGradient.h + ./modules/juce_graphics/colour/juce_Colours.cpp + ./modules/juce_graphics/colour/juce_Colours.h + ./modules/juce_graphics/colour/juce_FillType.cpp + ./modules/juce_graphics/colour/juce_FillType.h + ./modules/juce_graphics/colour/juce_PixelFormats.h + ./modules/juce_graphics/contexts/juce_GraphicsContext.cpp + ./modules/juce_graphics/contexts/juce_GraphicsContext.h + ./modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h + ./modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp + ./modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h + ./modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp + ./modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h + ./modules/juce_graphics/effects/juce_DropShadowEffect.cpp + ./modules/juce_graphics/effects/juce_DropShadowEffect.h + ./modules/juce_graphics/effects/juce_GlowEffect.cpp + ./modules/juce_graphics/effects/juce_GlowEffect.h + ./modules/juce_graphics/effects/juce_ImageEffectFilter.h + ./modules/juce_graphics/fonts/juce_AttributedString.cpp + ./modules/juce_graphics/fonts/juce_AttributedString.h + ./modules/juce_graphics/fonts/juce_CustomTypeface.cpp + ./modules/juce_graphics/fonts/juce_CustomTypeface.h + ./modules/juce_graphics/fonts/juce_Font.cpp + ./modules/juce_graphics/fonts/juce_Font.h + ./modules/juce_graphics/fonts/juce_GlyphArrangement.cpp + ./modules/juce_graphics/fonts/juce_GlyphArrangement.h + ./modules/juce_graphics/fonts/juce_TextLayout.cpp + ./modules/juce_graphics/fonts/juce_TextLayout.h + ./modules/juce_graphics/fonts/juce_Typeface.cpp + ./modules/juce_graphics/fonts/juce_Typeface.h + ./modules/juce_graphics/geometry/juce_AffineTransform.cpp + ./modules/juce_graphics/geometry/juce_AffineTransform.h + ./modules/juce_graphics/geometry/juce_BorderSize.h + ./modules/juce_graphics/geometry/juce_EdgeTable.cpp + ./modules/juce_graphics/geometry/juce_EdgeTable.h + ./modules/juce_graphics/geometry/juce_Line.h + ./modules/juce_graphics/geometry/juce_Parallelogram.h + ./modules/juce_graphics/geometry/juce_Path.cpp + ./modules/juce_graphics/geometry/juce_Path.h + ./modules/juce_graphics/geometry/juce_PathIterator.cpp + ./modules/juce_graphics/geometry/juce_PathIterator.h + ./modules/juce_graphics/geometry/juce_PathStrokeType.cpp + ./modules/juce_graphics/geometry/juce_PathStrokeType.h + ./modules/juce_graphics/geometry/juce_Point.h + ./modules/juce_graphics/geometry/juce_Rectangle.h + ./modules/juce_graphics/geometry/juce_RectangleList.h + ./modules/juce_graphics/image_formats/juce_GIFLoader.cpp + ./modules/juce_graphics/image_formats/juce_JPEGLoader.cpp + ./modules/juce_graphics/image_formats/juce_PNGLoader.cpp + ./modules/juce_graphics/images/juce_Image.cpp + ./modules/juce_graphics/images/juce_Image.h + ./modules/juce_graphics/images/juce_ImageCache.cpp + ./modules/juce_graphics/images/juce_ImageCache.h + ./modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp + ./modules/juce_graphics/images/juce_ImageConvolutionKernel.h + ./modules/juce_graphics/images/juce_ImageFileFormat.cpp + ./modules/juce_graphics/images/juce_ImageFileFormat.h + ./modules/juce_graphics/juce_graphics.cpp + ./modules/juce_graphics/juce_graphics.h + ./modules/juce_graphics/juce_graphics.mm + ./modules/juce_graphics/native/juce_RenderingHelpers.h + ./modules/juce_graphics/native/juce_android_Fonts.cpp + ./modules/juce_graphics/native/juce_android_GraphicsContext.cpp + ./modules/juce_graphics/native/juce_android_IconHelpers.cpp + ./modules/juce_graphics/native/juce_freetype_Fonts.cpp + ./modules/juce_graphics/native/juce_linux_Fonts.cpp + ./modules/juce_graphics/native/juce_linux_IconHelpers.cpp + ./modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h + ./modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm + ./modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h + ./modules/juce_graphics/native/juce_mac_Fonts.mm + ./modules/juce_graphics/native/juce_mac_IconHelpers.cpp + ./modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp + ./modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.h + ./modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp + ./modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp + ./modules/juce_graphics/native/juce_win32_Fonts.cpp + ./modules/juce_graphics/native/juce_win32_IconHelpers.cpp + ./modules/juce_graphics/placement/juce_Justification.h + ./modules/juce_graphics/placement/juce_RectanglePlacement.cpp + ./modules/juce_graphics/placement/juce_RectanglePlacement.h + ./modules/juce_gui_basics/application/juce_Application.cpp + ./modules/juce_gui_basics/application/juce_Application.h + ./modules/juce_gui_basics/buttons/juce_ArrowButton.cpp + ./modules/juce_gui_basics/buttons/juce_ArrowButton.h + ./modules/juce_gui_basics/buttons/juce_Button.cpp + ./modules/juce_gui_basics/buttons/juce_Button.h + ./modules/juce_gui_basics/buttons/juce_DrawableButton.cpp + ./modules/juce_gui_basics/buttons/juce_DrawableButton.h + ./modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp + ./modules/juce_gui_basics/buttons/juce_HyperlinkButton.h + ./modules/juce_gui_basics/buttons/juce_ImageButton.cpp + ./modules/juce_gui_basics/buttons/juce_ImageButton.h + ./modules/juce_gui_basics/buttons/juce_ShapeButton.cpp + ./modules/juce_gui_basics/buttons/juce_ShapeButton.h + ./modules/juce_gui_basics/buttons/juce_TextButton.cpp + ./modules/juce_gui_basics/buttons/juce_TextButton.h + ./modules/juce_gui_basics/buttons/juce_ToggleButton.cpp + ./modules/juce_gui_basics/buttons/juce_ToggleButton.h + ./modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp + ./modules/juce_gui_basics/buttons/juce_ToolbarButton.h + ./modules/juce_gui_basics/commands/juce_ApplicationCommandID.h + ./modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp + ./modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h + ./modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp + ./modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h + ./modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp + ./modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h + ./modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp + ./modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h + ./modules/juce_gui_basics/components/juce_CachedComponentImage.h + ./modules/juce_gui_basics/components/juce_Component.cpp + ./modules/juce_gui_basics/components/juce_Component.h + ./modules/juce_gui_basics/components/juce_ComponentListener.cpp + ./modules/juce_gui_basics/components/juce_ComponentListener.h + ./modules/juce_gui_basics/components/juce_ModalComponentManager.cpp + ./modules/juce_gui_basics/components/juce_ModalComponentManager.h + ./modules/juce_gui_basics/desktop/juce_Desktop.cpp + ./modules/juce_gui_basics/desktop/juce_Desktop.h + ./modules/juce_gui_basics/desktop/juce_Displays.cpp + ./modules/juce_gui_basics/desktop/juce_Displays.h + ./modules/juce_gui_basics/drawables/juce_Drawable.cpp + ./modules/juce_gui_basics/drawables/juce_Drawable.h + ./modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp + ./modules/juce_gui_basics/drawables/juce_DrawableComposite.h + ./modules/juce_gui_basics/drawables/juce_DrawableImage.cpp + ./modules/juce_gui_basics/drawables/juce_DrawableImage.h + ./modules/juce_gui_basics/drawables/juce_DrawablePath.cpp + ./modules/juce_gui_basics/drawables/juce_DrawablePath.h + ./modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp + ./modules/juce_gui_basics/drawables/juce_DrawableRectangle.h + ./modules/juce_gui_basics/drawables/juce_DrawableShape.cpp + ./modules/juce_gui_basics/drawables/juce_DrawableShape.h + ./modules/juce_gui_basics/drawables/juce_DrawableText.cpp + ./modules/juce_gui_basics/drawables/juce_DrawableText.h + ./modules/juce_gui_basics/drawables/juce_SVGParser.cpp + ./modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp + ./modules/juce_gui_basics/filebrowser/juce_ContentSharer.h + ./modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h + ./modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp + ./modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h + ./modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h + ./modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h + ./modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileChooser.h + ./modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h + ./modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileListComponent.h + ./modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h + ./modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h + ./modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h + ./modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h + ./modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp + ./modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h + ./modules/juce_gui_basics/juce_gui_basics.cpp + ./modules/juce_gui_basics/juce_gui_basics.h + ./modules/juce_gui_basics/juce_gui_basics.mm + ./modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp + ./modules/juce_gui_basics/keyboard/juce_CaretComponent.h + ./modules/juce_gui_basics/keyboard/juce_KeyListener.cpp + ./modules/juce_gui_basics/keyboard/juce_KeyListener.h + ./modules/juce_gui_basics/keyboard/juce_KeyPress.cpp + ./modules/juce_gui_basics/keyboard/juce_KeyPress.h + ./modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp + ./modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h + ./modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp + ./modules/juce_gui_basics/keyboard/juce_ModifierKeys.h + ./modules/juce_gui_basics/keyboard/juce_SystemClipboard.h + ./modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h + ./modules/juce_gui_basics/keyboard/juce_TextInputTarget.h + ./modules/juce_gui_basics/layout/juce_AnimatedPosition.h + ./modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h + ./modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp + ./modules/juce_gui_basics/layout/juce_ComponentAnimator.h + ./modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp + ./modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h + ./modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp + ./modules/juce_gui_basics/layout/juce_ComponentBuilder.h + ./modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp + ./modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h + ./modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp + ./modules/juce_gui_basics/layout/juce_ConcertinaPanel.h + ./modules/juce_gui_basics/layout/juce_FlexBox.cpp + ./modules/juce_gui_basics/layout/juce_FlexBox.h + ./modules/juce_gui_basics/layout/juce_FlexItem.h + ./modules/juce_gui_basics/layout/juce_Grid.cpp + ./modules/juce_gui_basics/layout/juce_Grid.h + ./modules/juce_gui_basics/layout/juce_GridItem.cpp + ./modules/juce_gui_basics/layout/juce_GridItem.h + ./modules/juce_gui_basics/layout/juce_GroupComponent.cpp + ./modules/juce_gui_basics/layout/juce_GroupComponent.h + ./modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp + ./modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h + ./modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp + ./modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h + ./modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp + ./modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h + ./modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp + ./modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h + ./modules/juce_gui_basics/layout/juce_ScrollBar.cpp + ./modules/juce_gui_basics/layout/juce_ScrollBar.h + ./modules/juce_gui_basics/layout/juce_SidePanel.cpp + ./modules/juce_gui_basics/layout/juce_SidePanel.h + ./modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp + ./modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h + ./modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp + ./modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h + ./modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp + ./modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h + ./modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp + ./modules/juce_gui_basics/layout/juce_TabbedButtonBar.h + ./modules/juce_gui_basics/layout/juce_TabbedComponent.cpp + ./modules/juce_gui_basics/layout/juce_TabbedComponent.h + ./modules/juce_gui_basics/layout/juce_Viewport.cpp + ./modules/juce_gui_basics/layout/juce_Viewport.h + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp + ./modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.h + ./modules/juce_gui_basics/menus/juce_BurgerMenuComponent.cpp + ./modules/juce_gui_basics/menus/juce_BurgerMenuComponent.h + ./modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp + ./modules/juce_gui_basics/menus/juce_MenuBarComponent.h + ./modules/juce_gui_basics/menus/juce_MenuBarModel.cpp + ./modules/juce_gui_basics/menus/juce_MenuBarModel.h + ./modules/juce_gui_basics/menus/juce_PopupMenu.cpp + ./modules/juce_gui_basics/menus/juce_PopupMenu.h + ./modules/juce_gui_basics/misc/juce_BubbleComponent.cpp + ./modules/juce_gui_basics/misc/juce_BubbleComponent.h + ./modules/juce_gui_basics/misc/juce_DropShadower.cpp + ./modules/juce_gui_basics/misc/juce_DropShadower.h + ./modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp + ./modules/juce_gui_basics/misc/juce_JUCESplashScreen.h + ./modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp + ./modules/juce_gui_basics/mouse/juce_ComponentDragger.h + ./modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp + ./modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h + ./modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h + ./modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h + ./modules/juce_gui_basics/mouse/juce_LassoComponent.h + ./modules/juce_gui_basics/mouse/juce_MouseCursor.cpp + ./modules/juce_gui_basics/mouse/juce_MouseCursor.h + ./modules/juce_gui_basics/mouse/juce_MouseEvent.cpp + ./modules/juce_gui_basics/mouse/juce_MouseEvent.h + ./modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp + ./modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h + ./modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp + ./modules/juce_gui_basics/mouse/juce_MouseInputSource.h + ./modules/juce_gui_basics/mouse/juce_MouseListener.cpp + ./modules/juce_gui_basics/mouse/juce_MouseListener.h + ./modules/juce_gui_basics/mouse/juce_SelectedItemSet.h + ./modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h + ./modules/juce_gui_basics/mouse/juce_TooltipClient.h + ./modules/juce_gui_basics/native/juce_MultiTouchMapper.h + ./modules/juce_gui_basics/native/juce_android_ContentSharer.cpp + ./modules/juce_gui_basics/native/juce_android_FileChooser.cpp + ./modules/juce_gui_basics/native/juce_android_Windowing.cpp + ./modules/juce_gui_basics/native/juce_common_MimeTypes.cpp + ./modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp + ./modules/juce_gui_basics/native/juce_ios_FileChooser.mm + ./modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm + ./modules/juce_gui_basics/native/juce_ios_Windowing.mm + ./modules/juce_gui_basics/native/juce_linux_FileChooser.cpp + ./modules/juce_gui_basics/native/juce_linux_X11.cpp + ./modules/juce_gui_basics/native/juce_linux_X11.h + ./modules/juce_gui_basics/native/juce_linux_X11_Clipboard.cpp + ./modules/juce_gui_basics/native/juce_linux_X11_Windowing.cpp + ./modules/juce_gui_basics/native/juce_mac_FileChooser.mm + ./modules/juce_gui_basics/native/juce_mac_MainMenu.mm + ./modules/juce_gui_basics/native/juce_mac_MouseCursor.mm + ./modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm + ./modules/juce_gui_basics/native/juce_mac_Windowing.mm + ./modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp + ./modules/juce_gui_basics/native/juce_win32_FileChooser.cpp + ./modules/juce_gui_basics/native/juce_win32_Windowing.cpp + ./modules/juce_gui_basics/positioning/juce_MarkerList.cpp + ./modules/juce_gui_basics/positioning/juce_MarkerList.h + ./modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp + ./modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h + ./modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp + ./modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h + ./modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp + ./modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h + ./modules/juce_gui_basics/positioning/juce_RelativePoint.cpp + ./modules/juce_gui_basics/positioning/juce_RelativePoint.h + ./modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp + ./modules/juce_gui_basics/positioning/juce_RelativePointPath.h + ./modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp + ./modules/juce_gui_basics/positioning/juce_RelativeRectangle.h + ./modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h + ./modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h + ./modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h + ./modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_MultiChoicePropertyComponent.h + ./modules/juce_gui_basics/properties/juce_PropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_PropertyComponent.h + ./modules/juce_gui_basics/properties/juce_PropertyPanel.cpp + ./modules/juce_gui_basics/properties/juce_PropertyPanel.h + ./modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h + ./modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp + ./modules/juce_gui_basics/properties/juce_TextPropertyComponent.h + ./modules/juce_gui_basics/widgets/juce_ComboBox.cpp + ./modules/juce_gui_basics/widgets/juce_ComboBox.h + ./modules/juce_gui_basics/widgets/juce_ImageComponent.cpp + ./modules/juce_gui_basics/widgets/juce_ImageComponent.h + ./modules/juce_gui_basics/widgets/juce_Label.cpp + ./modules/juce_gui_basics/widgets/juce_Label.h + ./modules/juce_gui_basics/widgets/juce_ListBox.cpp + ./modules/juce_gui_basics/widgets/juce_ListBox.h + ./modules/juce_gui_basics/widgets/juce_ProgressBar.cpp + ./modules/juce_gui_basics/widgets/juce_ProgressBar.h + ./modules/juce_gui_basics/widgets/juce_Slider.cpp + ./modules/juce_gui_basics/widgets/juce_Slider.h + ./modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp + ./modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h + ./modules/juce_gui_basics/widgets/juce_TableListBox.cpp + ./modules/juce_gui_basics/widgets/juce_TableListBox.h + ./modules/juce_gui_basics/widgets/juce_TextEditor.cpp + ./modules/juce_gui_basics/widgets/juce_TextEditor.h + ./modules/juce_gui_basics/widgets/juce_Toolbar.cpp + ./modules/juce_gui_basics/widgets/juce_Toolbar.h + ./modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp + ./modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h + ./modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h + ./modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp + ./modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h + ./modules/juce_gui_basics/widgets/juce_TreeView.cpp + ./modules/juce_gui_basics/widgets/juce_TreeView.h + ./modules/juce_gui_basics/windows/juce_AlertWindow.cpp + ./modules/juce_gui_basics/windows/juce_AlertWindow.h + ./modules/juce_gui_basics/windows/juce_CallOutBox.cpp + ./modules/juce_gui_basics/windows/juce_CallOutBox.h + ./modules/juce_gui_basics/windows/juce_ComponentPeer.cpp + ./modules/juce_gui_basics/windows/juce_ComponentPeer.h + ./modules/juce_gui_basics/windows/juce_DialogWindow.cpp + ./modules/juce_gui_basics/windows/juce_DialogWindow.h + ./modules/juce_gui_basics/windows/juce_DocumentWindow.cpp + ./modules/juce_gui_basics/windows/juce_DocumentWindow.h + ./modules/juce_gui_basics/windows/juce_NativeMessageBox.h + ./modules/juce_gui_basics/windows/juce_ResizableWindow.cpp + ./modules/juce_gui_basics/windows/juce_ResizableWindow.h + ./modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp + ./modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h + ./modules/juce_gui_basics/windows/juce_TooltipWindow.cpp + ./modules/juce_gui_basics/windows/juce_TooltipWindow.h + ./modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp + ./modules/juce_gui_basics/windows/juce_TopLevelWindow.h + ./modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp + ./modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h + ./modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h + ./modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp + ./modules/juce_gui_extra/code_editor/juce_CodeDocument.h + ./modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp + ./modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h + ./modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h + ./modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp + ./modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h + ./modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp + ./modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h + ./modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp + ./modules/juce_gui_extra/documents/juce_FileBasedDocument.h + ./modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h + ./modules/juce_gui_extra/embedding/juce_AndroidViewComponent.h + ./modules/juce_gui_extra/embedding/juce_NSViewComponent.h + ./modules/juce_gui_extra/embedding/juce_ScopedDPIAwarenessDisabler.h + ./modules/juce_gui_extra/embedding/juce_UIViewComponent.h + ./modules/juce_gui_extra/embedding/juce_XEmbedComponent.h + ./modules/juce_gui_extra/juce_gui_extra.cpp + ./modules/juce_gui_extra/juce_gui_extra.h + ./modules/juce_gui_extra/juce_gui_extra.mm + ./modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp + ./modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h + ./modules/juce_gui_extra/misc/juce_AppleRemote.h + ./modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp + ./modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h + ./modules/juce_gui_extra/misc/juce_ColourSelector.cpp + ./modules/juce_gui_extra/misc/juce_ColourSelector.h + ./modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp + ./modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h + ./modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp + ./modules/juce_gui_extra/misc/juce_LiveConstantEditor.h + ./modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp + ./modules/juce_gui_extra/misc/juce_PreferencesPanel.h + ./modules/juce_gui_extra/misc/juce_PushNotifications.cpp + ./modules/juce_gui_extra/misc/juce_PushNotifications.h + ./modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp + ./modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h + ./modules/juce_gui_extra/misc/juce_SplashScreen.cpp + ./modules/juce_gui_extra/misc/juce_SplashScreen.h + ./modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp + ./modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h + ./modules/juce_gui_extra/misc/juce_WebBrowserComponent.h + ./modules/juce_gui_extra/native/juce_AndroidViewComponent.cpp + ./modules/juce_gui_extra/native/juce_android_PushNotifications.cpp + ./modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp + ./modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp + ./modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm + ./modules/juce_gui_extra/native/juce_linux_X11_SystemTrayIcon.cpp + ./modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp + ./modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp + ./modules/juce_gui_extra/native/juce_mac_AppleRemote.mm + ./modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h + ./modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm + ./modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp + ./modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp + ./modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm + ./modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp + ./modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp + ./modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp + ./modules/juce_opengl/geometry/juce_Draggable3DOrientation.h + ./modules/juce_opengl/geometry/juce_Matrix3D.h + ./modules/juce_opengl/geometry/juce_Quaternion.h + ./modules/juce_opengl/geometry/juce_Vector3D.h + ./modules/juce_opengl/juce_opengl.cpp + ./modules/juce_opengl/juce_opengl.h + ./modules/juce_opengl/juce_opengl.mm + ./modules/juce_opengl/native/juce_MissingGLDefinitions.h + ./modules/juce_opengl/native/juce_OpenGLExtensions.h + ./modules/juce_opengl/native/juce_OpenGL_android.h + ./modules/juce_opengl/native/juce_OpenGL_ios.h + ./modules/juce_opengl/native/juce_OpenGL_linux_X11.h + ./modules/juce_opengl/native/juce_OpenGL_osx.h + ./modules/juce_opengl/native/juce_OpenGL_win32.h + ./modules/juce_opengl/opengl/juce_OpenGLContext.cpp + ./modules/juce_opengl/opengl/juce_OpenGLContext.h + ./modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp + ./modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h + ./modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp + ./modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h + ./modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp + ./modules/juce_opengl/opengl/juce_OpenGLHelpers.h + ./modules/juce_opengl/opengl/juce_OpenGLImage.cpp + ./modules/juce_opengl/opengl/juce_OpenGLImage.h + ./modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp + ./modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h + ./modules/juce_opengl/opengl/juce_OpenGLRenderer.h + ./modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp + ./modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h + ./modules/juce_opengl/opengl/juce_OpenGLTexture.cpp + ./modules/juce_opengl/opengl/juce_OpenGLTexture.h + ./modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp + ./modules/juce_opengl/utils/juce_OpenGLAppComponent.h + ./modules/juce_osc/juce_osc.cpp + ./modules/juce_osc/juce_osc.h + ./modules/juce_osc/osc/juce_OSCAddress.cpp + ./modules/juce_osc/osc/juce_OSCAddress.h + ./modules/juce_osc/osc/juce_OSCArgument.cpp + ./modules/juce_osc/osc/juce_OSCArgument.h + ./modules/juce_osc/osc/juce_OSCBundle.cpp + ./modules/juce_osc/osc/juce_OSCBundle.h + ./modules/juce_osc/osc/juce_OSCMessage.cpp + ./modules/juce_osc/osc/juce_OSCMessage.h + ./modules/juce_osc/osc/juce_OSCReceiver.cpp + ./modules/juce_osc/osc/juce_OSCReceiver.h + ./modules/juce_osc/osc/juce_OSCSender.cpp + ./modules/juce_osc/osc/juce_OSCSender.h + ./modules/juce_osc/osc/juce_OSCTimeTag.cpp + ./modules/juce_osc/osc/juce_OSCTimeTag.h + ./modules/juce_osc/osc/juce_OSCTypes.cpp + ./modules/juce_osc/osc/juce_OSCTypes.h + ./modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp + ./modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h + ./modules/juce_product_unlocking/juce_product_unlocking.cpp + ./modules/juce_product_unlocking/juce_product_unlocking.h + ./modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h + ./modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.cpp + ./modules/juce_product_unlocking/marketplace/juce_OnlineUnlockForm.h + ./modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.cpp + ./modules/juce_product_unlocking/marketplace/juce_OnlineUnlockStatus.h + ./modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.cpp + ./modules/juce_product_unlocking/marketplace/juce_TracktionMarketplaceStatus.h + ./modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp + ./modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp + ./modules/juce_video/capture/juce_CameraDevice.cpp + ./modules/juce_video/capture/juce_CameraDevice.h + ./modules/juce_video/juce_video.cpp + ./modules/juce_video/juce_video.h + ./modules/juce_video/juce_video.mm + ./modules/juce_video/native/juce_android_CameraDevice.h + ./modules/juce_video/native/juce_ios_CameraDevice.h + ./modules/juce_video/native/juce_mac_CameraDevice.h + ./modules/juce_video/native/juce_win32_CameraDevice.h + ./modules/juce_video/native/juce_win32_Video.h + ./modules/juce_video/playback/juce_VideoComponent.cpp + ./modules/juce_video/playback/juce_VideoComponent.h +Copyright: 2017, - ROLI Ltd. +License: GPL-3 + FIXME + +Files: ./.github/ISSUE_TEMPLATE.txt + ./.gitlab-ci.yml + ./BREAKING-CHANGES.txt + ./ChangeList.txt + ./doxygen/Doxyfile + ./doxygen/Makefile + ./doxygen/README.txt + ./doxygen/make.bat + ./doxygen/process_source_files.py + ./examples/Assets/Box2DTests/AddPair.h + ./examples/Assets/Signing/README.txt + ./examples/Assets/demo table data.xml + ./examples/Assets/google-services.json + ./examples/Assets/juce_module_info + ./examples/Assets/proaudio.path + ./examples/Assets/teapot.obj + ./examples/Assets/treedemo.xml + ./examples/DemoRunner/Builds/Android/app/CMakeLists.txt + ./examples/DemoRunner/Builds/Android/app/build.gradle + ./examples/DemoRunner/Builds/Android/app/src/debug/res/values/string.xml + ./examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/AddPair.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Signing/README.txt + ./examples/DemoRunner/Builds/Android/app/src/main/assets/demo table data.xml + ./examples/DemoRunner/Builds/Android/app/src/main/assets/google-services.json + ./examples/DemoRunner/Builds/Android/app/src/main/assets/juce_module_info + ./examples/DemoRunner/Builds/Android/app/src/main/assets/proaudio.path + ./examples/DemoRunner/Builds/Android/app/src/main/assets/teapot.obj + ./examples/DemoRunner/Builds/Android/app/src/main/assets/treedemo.xml + ./examples/DemoRunner/Builds/Android/app/src/release/res/values/string.xml + ./examples/DemoRunner/Builds/Android/build.gradle + ./examples/DemoRunner/Builds/Android/gradle/wrapper/gradle-wrapper.properties + ./examples/DemoRunner/Builds/Android/gradlew + ./examples/DemoRunner/Builds/Android/gradlew.bat + ./examples/DemoRunner/Builds/Android/settings.gradle + ./examples/DemoRunner/Builds/LinuxMakefile/Makefile + ./examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj + ./examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./examples/DemoRunner/Builds/VisualStudio2015/DemoRunner.sln + ./examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj + ./examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters + ./examples/DemoRunner/Builds/VisualStudio2017/DemoRunner.sln + ./examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj + ./examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters + ./examples/DemoRunner/Builds/VisualStudio2019/DemoRunner.sln + ./examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj + ./examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters + ./examples/DemoRunner/Builds/iOS/DemoRunner.entitlements + ./examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj + ./examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Contents.json + ./examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/LaunchImage.launchimage/Contents.json + ./examples/DemoRunner/Builds/iOS/LaunchScreen.storyboard + ./examples/DemoRunner/JuceLibraryCode/JuceHeader.h + ./examples/DemoRunner/JuceLibraryCode/ReadMe.txt + ./examples/DemoRunner/JuceLibraryCode/include_juce_analytics.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_basics.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_basics.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_devices.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_devices.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_formats.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_formats.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_processors.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_utils.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_audio_utils.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_blocks_basics.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_box2d.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_core.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_core.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_cryptography.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_cryptography.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_data_structures.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_data_structures.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_dsp.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_dsp.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_events.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_events.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_graphics.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_graphics.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_gui_basics.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_gui_basics.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_gui_extra.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_gui_extra.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_opengl.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_opengl.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_osc.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_product_unlocking.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_product_unlocking.mm + ./examples/DemoRunner/JuceLibraryCode/include_juce_video.cpp + ./examples/DemoRunner/JuceLibraryCode/include_juce_video.mm + ./extras/AudioPerformanceTest/AudioPerformanceTest.jucer + ./extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt + ./extras/AudioPerformanceTest/Builds/Android/app/build.gradle + ./extras/AudioPerformanceTest/Builds/Android/app/src/debug/res/values/string.xml + ./extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml + ./extras/AudioPerformanceTest/Builds/Android/app/src/main/java/com/juce/audioperformancetest/SharingContentProvider.java + ./extras/AudioPerformanceTest/Builds/Android/app/src/release/res/values/string.xml + ./extras/AudioPerformanceTest/Builds/Android/build.gradle + ./extras/AudioPerformanceTest/Builds/Android/gradle/wrapper/gradle-wrapper.properties + ./extras/AudioPerformanceTest/Builds/Android/gradlew + ./extras/AudioPerformanceTest/Builds/Android/gradlew.bat + ./extras/AudioPerformanceTest/Builds/Android/settings.gradle + ./extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile + ./extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj + ./extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/AudioPerformanceTest/Builds/MacOSX/Info-App.plist + ./extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest.sln + ./extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj + ./extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters + ./extras/AudioPerformanceTest/Builds/VisualStudio2019/resources.rc + ./extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj + ./extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/AppIcon.appiconset/Contents.json + ./extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest/Images.xcassets/LaunchImage.launchimage/Contents.json + ./extras/AudioPerformanceTest/Builds/iOS/Info-App.plist + ./extras/AudioPerformanceTest/Builds/iOS/LaunchScreen.storyboard + ./extras/AudioPerformanceTest/JuceLibraryCode/JuceHeader.h + ./extras/AudioPerformanceTest/JuceLibraryCode/ReadMe.txt + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_basics.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_basics.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_devices.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_devices.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_formats.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_formats.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_processors.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_utils.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_audio_utils.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_core.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_core.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_data_structures.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_events.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_events.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_graphics.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_graphics.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/AudioPerformanceTest/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/AudioPluginHost/AudioPluginHost.jucer + ./extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt + ./extras/AudioPluginHost/Builds/Android/app/build.gradle + ./extras/AudioPluginHost/Builds/Android/app/src/debug/res/values/string.xml + ./extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml + ./extras/AudioPluginHost/Builds/Android/app/src/release/res/values/string.xml + ./extras/AudioPluginHost/Builds/Android/build.gradle + ./extras/AudioPluginHost/Builds/Android/gradle/wrapper/gradle-wrapper.properties + ./extras/AudioPluginHost/Builds/Android/gradlew + ./extras/AudioPluginHost/Builds/Android/gradlew.bat + ./extras/AudioPluginHost/Builds/Android/settings.gradle + ./extras/AudioPluginHost/Builds/LinuxMakefile/Makefile + ./extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj + ./extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/AudioPluginHost/Builds/MacOSX/Info-App.plist + ./extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost.sln + ./extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj + ./extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters + ./extras/AudioPluginHost/Builds/VisualStudio2015/resources.rc + ./extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost.sln + ./extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj + ./extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters + ./extras/AudioPluginHost/Builds/VisualStudio2017/resources.rc + ./extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost.sln + ./extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj + ./extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters + ./extras/AudioPluginHost/Builds/VisualStudio2019/resources.rc + ./extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj + ./extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/AppIcon.appiconset/Contents.json + ./extras/AudioPluginHost/Builds/iOS/AudioPluginHost/Images.xcassets/LaunchImage.launchimage/Contents.json + ./extras/AudioPluginHost/Builds/iOS/Info-App.plist + ./extras/AudioPluginHost/Builds/iOS/LaunchScreen.storyboard + ./extras/AudioPluginHost/JuceLibraryCode/BinaryData.cpp + ./extras/AudioPluginHost/JuceLibraryCode/BinaryData.h + ./extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h + ./extras/AudioPluginHost/JuceLibraryCode/ReadMe.txt + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_basics.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_basics.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_devices.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_devices.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_formats.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_formats.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_processors.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_utils.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_audio_utils.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_core.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_core.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_cryptography.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_cryptography.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_data_structures.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_events.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_events.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_graphics.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_graphics.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_opengl.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_opengl.mm + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_video.cpp + ./extras/AudioPluginHost/JuceLibraryCode/include_juce_video.mm + ./extras/BLOCKS/Makefile + ./extras/BLOCKS/standalone_sdk/README.md + ./extras/BLOCKS/standalone_sdk/SDK/BlocksHeader.h + ./extras/BLOCKS/standalone_sdk/SDK/Build/Linux/Makefile + ./extras/BLOCKS/standalone_sdk/SDK/Build/MacOS/BLOCKS-SDK.xcodeproj/project.pbxproj + ./extras/BLOCKS/standalone_sdk/SDK/Build/Windows/BLOCKS-SDK.sln + ./extras/BLOCKS/standalone_sdk/SDK/Build/Windows/BLOCKS-SDK.vcxproj + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/Linux/Makefile + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/MacOS/BlockFinder.xcodeproj/project.pbxproj + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/MacOS/Makefile + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/Windows/BlockFinder.sln + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/Windows/BlockFinder.vcxproj + ./extras/BinaryBuilder/BinaryBuilder.jucer + ./extras/BinaryBuilder/Builds/LinuxMakefile/Makefile + ./extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj + ./extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder.sln + ./extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj + ./extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters + ./extras/BinaryBuilder/Builds/VisualStudio2019/resources.rc + ./extras/BinaryBuilder/JuceLibraryCode/JuceHeader.h + ./extras/BinaryBuilder/JuceLibraryCode/ReadMe.txt + ./extras/BinaryBuilder/JuceLibraryCode/include_juce_core.cpp + ./extras/BinaryBuilder/JuceLibraryCode/include_juce_core.mm + ./extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt + ./extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/debug/res/values/string.xml + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/main/java/com/juce/networkgraphicsdemo/SharingContentProvider.java + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/release/res/values/string.xml + ./extras/NetworkGraphicsDemo/Builds/Android/build.gradle + ./extras/NetworkGraphicsDemo/Builds/Android/gradle/wrapper/gradle-wrapper.properties + ./extras/NetworkGraphicsDemo/Builds/Android/gradlew + ./extras/NetworkGraphicsDemo/Builds/Android/gradlew.bat + ./extras/NetworkGraphicsDemo/Builds/Android/settings.gradle + ./extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile + ./extras/NetworkGraphicsDemo/Builds/MacOSX/Info-App.plist + ./extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj + ./extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo.sln + ./extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj + ./extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters + ./extras/NetworkGraphicsDemo/Builds/VisualStudio2019/resources.rc + ./extras/NetworkGraphicsDemo/Builds/iOS/Info-App.plist + ./extras/NetworkGraphicsDemo/Builds/iOS/LaunchScreen.storyboard + ./extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj + ./extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/AppIcon.appiconset/Contents.json + ./extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo/Images.xcassets/LaunchImage.launchimage/Contents.json + ./extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/BinaryData.h + ./extras/NetworkGraphicsDemo/JuceLibraryCode/JuceHeader.h + ./extras/NetworkGraphicsDemo/JuceLibraryCode/ReadMe.txt + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_basics.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_basics.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_devices.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_devices.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_formats.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_formats.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_processors.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_utils.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_audio_utils.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_core.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_core.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_cryptography.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_cryptography.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_data_structures.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_events.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_events.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_graphics.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_graphics.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_opengl.cpp + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_opengl.mm + ./extras/NetworkGraphicsDemo/JuceLibraryCode/include_juce_osc.cpp + ./extras/NetworkGraphicsDemo/NetworkGraphicsDemo.jucer + ./extras/NetworkGraphicsDemo/README.txt + ./extras/Projucer/Builds/LinuxMakefile/Makefile + ./extras/Projucer/Builds/MacOSX/Info-App.plist + ./extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj + ./extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/Projucer/Builds/VisualStudio2015/Projucer.sln + ./extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj + ./extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters + ./extras/Projucer/Builds/VisualStudio2015/resources.rc + ./extras/Projucer/Builds/VisualStudio2017/Projucer.sln + ./extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj + ./extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters + ./extras/Projucer/Builds/VisualStudio2017/resources.rc + ./extras/Projucer/Builds/VisualStudio2019/Projucer.sln + ./extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj + ./extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters + ./extras/Projucer/Builds/VisualStudio2019/resources.rc + ./extras/Projucer/JuceLibraryCode/BinaryData.cpp + ./extras/Projucer/JuceLibraryCode/BinaryData.h + ./extras/Projucer/JuceLibraryCode/JuceHeader.h + ./extras/Projucer/JuceLibraryCode/ReadMe.txt + ./extras/Projucer/JuceLibraryCode/include_juce_analytics.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_core.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_core.mm + ./extras/Projucer/JuceLibraryCode/include_juce_cryptography.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_cryptography.mm + ./extras/Projucer/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_data_structures.mm + ./extras/Projucer/JuceLibraryCode/include_juce_events.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_events.mm + ./extras/Projucer/JuceLibraryCode/include_juce_graphics.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_graphics.mm + ./extras/Projucer/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/Projucer/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/Projucer/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/Projucer/Projucer.jucer + ./extras/Projucer/Source/BinaryData/Icons/background_logo.svg + ./extras/Projucer/Source/BinaryData/Icons/export_android.svg + ./extras/Projucer/Source/BinaryData/Icons/export_clion.svg + ./extras/Projucer/Source/BinaryData/Icons/export_codeBlocks.svg + ./extras/Projucer/Source/BinaryData/Icons/export_linux.svg + ./extras/Projucer/Source/BinaryData/Icons/export_visualStudio.svg + ./extras/Projucer/Source/BinaryData/Icons/export_xcode.svg + ./extras/Projucer/Source/BinaryData/Icons/huckleberry_icon.svg + ./extras/Projucer/Source/BinaryData/Icons/juce-logo-with-text.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_AnimatedApp.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_AudioApp.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_AudioPlugin.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_ConsoleApp.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_DLL.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_GUI.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_Highlight.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_OpenGL.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_Openfile.svg + ./extras/Projucer/Source/BinaryData/Icons/wizard_StaticLibrary.svg + ./extras/Projucer/Source/BinaryData/Templates/jucer_AnimatedComponentSimpleTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AnimatedComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioComponentSimpleTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioComponentTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginEditorTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_ContentCompSimpleTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_ContentCompTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_ContentCompTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_InlineComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_MainConsoleAppTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_MainTemplate_NoWindow.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_MainTemplate_SimpleWindow.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_MainTemplate_Window.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_NewComponentTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_NewComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_NewCppFileTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_NewCppFileTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_NewInlineComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_OpenGLComponentSimpleTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_OpenGLComponentTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_PIPAudioProcessorTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_PIPMain.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_PIPTemplate.h + ./extras/Projucer/Source/BinaryData/Templates/jucer_UnityPluginGUIScript.cs + ./extras/Projucer/Source/BinaryData/colourscheme_dark.xml + ./extras/Projucer/Source/BinaryData/colourscheme_light.xml + ./extras/Projucer/Source/BinaryData/gradle/gradlew + ./extras/Projucer/Source/BinaryData/gradle/gradlew.bat + ./extras/Projucer/Source/BinaryData/nothingtoseehere.txt + ./extras/UnitTestRunner/Builds/LinuxMakefile/Makefile + ./extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj + ./extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings + ./extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner.sln + ./extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj + ./extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters + ./extras/UnitTestRunner/Builds/VisualStudio2017/resources.rc + ./extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner.sln + ./extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj + ./extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters + ./extras/UnitTestRunner/Builds/VisualStudio2019/resources.rc + ./extras/UnitTestRunner/JuceLibraryCode/JuceHeader.h + ./extras/UnitTestRunner/JuceLibraryCode/ReadMe.txt + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_analytics.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_basics.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_basics.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_devices.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_devices.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_formats.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_formats.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_processors.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_utils.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_audio_utils.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_blocks_basics.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_core.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_core.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_cryptography.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_cryptography.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_data_structures.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_dsp.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_dsp.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_events.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_events.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_graphics.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_graphics.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_opengl.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_opengl.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_osc.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_product_unlocking.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_product_unlocking.mm + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_video.cpp + ./extras/UnitTestRunner/JuceLibraryCode/include_juce_video.mm + ./extras/UnitTestRunner/UnitTestRunner.jucer + ./extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL.sln + ./extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj + ./extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters + ./extras/WindowsDLL/JuceLibraryCode/JuceHeader.h + ./extras/WindowsDLL/JuceLibraryCode/ReadMe.txt + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_basics.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_basics.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_devices.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_devices.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_formats.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_formats.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_processors.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_utils.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_audio_utils.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_core.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_core.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_cryptography.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_cryptography.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_data_structures.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_data_structures.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_events.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_events.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_graphics.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_graphics.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_gui_basics.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_gui_basics.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_gui_extra.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_gui_extra.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_opengl.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_opengl.mm + ./extras/WindowsDLL/JuceLibraryCode/include_juce_video.cpp + ./extras/WindowsDLL/JuceLibraryCode/include_juce_video.mm + ./extras/WindowsDLL/WindowsDLL.jucer + ./modules/JUCE Module Format.txt + ./modules/juce_audio_devices/native/java/app/com/roli/juce/JuceMidiSupport.java + ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def + ./modules/juce_audio_plugin_client/juce_audio_plugin_client_RTAS.r + ./modules/juce_audio_processors/format_types/VST3_SDK/README.md + ./modules/juce_audio_processors/format_types/VST3_SDK/base/README.md + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/conststringtable.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/coreiids.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpop.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/icloneable.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipersistent.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ipluginbase.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/iupdatehandler.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/smartpointer.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/typesizecheck.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ustring.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugview.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/gui/iplugviewcontentscalesupport.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstautomationstate.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstchannelcontextinfo.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcontextmenu.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstevents.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsthostapplication.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstinterappaudio.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmessage.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidicontrollers.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstmidilearn.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstnoteexpression.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstparameterchanges.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstphysicalui.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstpluginterfacesupport.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstplugview.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprefetchablesupport.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstprocesscontext.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstrepresentation.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstunits.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstpshpack4.h + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/README.md + ./modules/juce_blocks_basics/README.txt + ./modules/juce_blocks_basics/juce_LittleFootFunctions.dox + ./modules/juce_blocks_basics/littlefoot/LittleFoot Language README.txt + ./modules/juce_blocks_basics/protocol/Protocol Format.txt + ./modules/juce_box2d/box2d/README.txt + ./modules/juce_core/native/java/README.txt + ./modules/juce_core/native/java/app/com/roli/juce/FragmentOverlay.java + ./modules/juce_core/native/java/app/com/roli/juce/JuceHTTPStream.java + ./modules/juce_core/native/javacore/app/com/roli/juce/JuceApp.java + ./modules/juce_core/native/javacore/init/com/roli/juce/Java.java + ./modules/juce_gui_basics/native/java/app/com/roli/juce/ComponentPeerView.java + ./modules/juce_gui_basics/native/javacore/app/com/roli/juce/JuceSharingContentProvider.java + ./modules/juce_gui_basics/native/javaopt/app/com/roli/juce/JuceActivity.java + ./modules/juce_gui_extra/native/java/app/com/roli/juce/JuceWebView.java + ./modules/juce_gui_extra/native/javaopt/app/com/roli/juce/JuceFirebaseInstanceIdService.java + ./modules/juce_gui_extra/native/javaopt/app/com/roli/juce/JuceFirebaseMessagingService.java + ./modules/juce_opengl/native/java/app/com/roli/juce/JuceOpenGLView.java + ./modules/juce_video/native/java/app/com/roli/juce/CameraCaptureSessionCaptureCallback.java + ./modules/juce_video/native/java/app/com/roli/juce/CameraCaptureSessionStateCallback.java + ./modules/juce_video/native/java/app/com/roli/juce/CameraDeviceStateCallback.java + ./modules/juce_video/native/java/app/com/roli/juce/JuceOrientationEventListener.java + ./modules/juce_video/native/java/app/com/roli/juce/MediaControllerCallback.java + ./modules/juce_video/native/java/app/com/roli/juce/MediaSessionCallback.java + ./modules/juce_video/native/java/app/com/roli/juce/SystemVolumeObserver.java +Copyright: NONE +License: UNKNOWN + FIXME + +Files: ./examples/Assets/AudioLiveScrollingDisplay.h + ./examples/Assets/DSPDemos_Common.h + ./examples/Assets/DemoUtilities.h + ./examples/Assets/WavefrontObjParser.h + ./examples/Audio/AudioAppDemo.h + ./examples/Audio/AudioLatencyDemo.h + ./examples/Audio/AudioPlaybackDemo.h + ./examples/Audio/AudioRecordingDemo.h + ./examples/Audio/AudioSettingsDemo.h + ./examples/Audio/AudioSynthesiserDemo.h + ./examples/Audio/MPEDemo.h + ./examples/Audio/MidiDemo.h + ./examples/Audio/PluckedStringsDemo.h + ./examples/Audio/SimpleFFTDemo.h + ./examples/BLOCKS/BlocksDrawingDemo.h + ./examples/BLOCKS/BlocksMonitorDemo.h + ./examples/BLOCKS/BlocksSynthDemo.h + ./examples/DSP/ConvolutionDemo.h + ./examples/DSP/FIRFilterDemo.h + ./examples/DSP/GainDemo.h + ./examples/DSP/IIRFilterDemo.h + ./examples/DSP/OscillatorDemo.h + ./examples/DSP/OverdriveDemo.h + ./examples/DSP/SIMDRegisterDemo.h + ./examples/DSP/StateVariableFilterDemo.h + ./examples/DSP/WaveShaperTanhDemo.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/AudioLiveScrollingDisplay.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/WavefrontObjParser.h + ./examples/GUI/AnimationAppDemo.h + ./examples/GUI/AnimationDemo.h + ./examples/GUI/BouncingBallWavetableDemo.h + ./examples/GUI/CameraDemo.h + ./examples/GUI/CodeEditorDemo.h + ./examples/GUI/ComponentDemo.h + ./examples/GUI/ComponentTransformsDemo.h + ./examples/GUI/DialogsDemo.h + ./examples/GUI/FlexBoxDemo.h + ./examples/GUI/FontsDemo.h + ./examples/GUI/GraphicsDemo.h + ./examples/GUI/GridDemo.h + ./examples/GUI/HelloWorldDemo.h + ./examples/GUI/ImagesDemo.h + ./examples/GUI/KeyMappingsDemo.h + ./examples/GUI/LookAndFeelDemo.h + ./examples/GUI/MDIDemo.h + ./examples/GUI/MenusDemo.h + ./examples/GUI/MultiTouchDemo.h + ./examples/GUI/OpenGLAppDemo.h + ./examples/GUI/OpenGLDemo.h + ./examples/GUI/OpenGLDemo2D.h + ./examples/GUI/PropertiesDemo.h + ./examples/GUI/VideoDemo.h + ./examples/GUI/WebBrowserDemo.h + ./examples/GUI/WidgetsDemo.h + ./examples/GUI/WindowsDemo.h + ./examples/Plugins/AUv3SynthPluginDemo.h + ./examples/Plugins/ArpeggiatorPluginDemo.h + ./examples/Plugins/AudioPluginDemo.h + ./examples/Plugins/DSPModulePluginDemo.h + ./examples/Plugins/GainPluginDemo.h + ./examples/Plugins/InterAppAudioEffectPluginDemo.h + ./examples/Plugins/MultiOutSynthPluginDemo.h + ./examples/Plugins/NoiseGatePluginDemo.h + ./examples/Plugins/SamplerPluginDemo.h + ./examples/Plugins/SurroundPluginDemo.h + ./examples/Utilities/AnalyticsCollectionDemo.h + ./examples/Utilities/Box2DDemo.h + ./examples/Utilities/ChildProcessDemo.h + ./examples/Utilities/CryptographyDemo.h + ./examples/Utilities/InAppPurchasesDemo.h + ./examples/Utilities/JavaScriptDemo.h + ./examples/Utilities/LiveConstantDemo.h + ./examples/Utilities/MultithreadingDemo.h + ./examples/Utilities/NetworkingDemo.h + ./examples/Utilities/OSCDemo.h + ./examples/Utilities/PushNotificationsDemo.h + ./examples/Utilities/SystemInfoDemo.h + ./examples/Utilities/TimersAndEventsDemo.h + ./examples/Utilities/UnitTestsDemo.h + ./examples/Utilities/ValueTreesDemo.h + ./examples/Utilities/XMLandJSONDemo.h + ./extras/AudioPerformanceTest/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java + ./extras/AudioPerformanceTest/Builds/Android/app/src/main/java/com/juce/audioperformancetest/AudioPerformanceTest.java + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/BlockFinder.cpp + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/BlockFinder.h + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/Linux/main.cpp + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/MacOS/main.mm + ./extras/BLOCKS/standalone_sdk/examples/BlockFinder/Windows/main.cpp + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/main/java/com/android/vending/billing/IInAppBillingService.java + ./extras/NetworkGraphicsDemo/Builds/Android/app/src/main/java/com/juce/networkgraphicsdemo/JUCENetworkGraphicsDemo.java + ./extras/Projucer/Source/BinaryData/Templates/jucer_ComponentTemplate.cpp + ./extras/Projucer/Source/BinaryData/Templates/jucer_ComponentTemplate.h + ./modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h + ./modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp + ./modules/juce_audio_basics/buffers/juce_AudioChannelSet.h + ./modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp + ./modules/juce_audio_basics/buffers/juce_AudioDataConverters.h + ./modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h + ./modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp + ./modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h + ./modules/juce_audio_basics/juce_audio_basics.cpp + ./modules/juce_audio_basics/juce_audio_basics.h + ./modules/juce_audio_basics/juce_audio_basics.mm + ./modules/juce_audio_basics/midi/juce_MidiBuffer.cpp + ./modules/juce_audio_basics/midi/juce_MidiBuffer.h + ./modules/juce_audio_basics/midi/juce_MidiFile.cpp + ./modules/juce_audio_basics/midi/juce_MidiFile.h + ./modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp + ./modules/juce_audio_basics/midi/juce_MidiKeyboardState.h + ./modules/juce_audio_basics/midi/juce_MidiMessage.cpp + ./modules/juce_audio_basics/midi/juce_MidiMessage.h + ./modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp + ./modules/juce_audio_basics/midi/juce_MidiMessageSequence.h + ./modules/juce_audio_basics/midi/juce_MidiRPN.cpp + ./modules/juce_audio_basics/midi/juce_MidiRPN.h + ./modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp + ./modules/juce_audio_basics/mpe/juce_MPEInstrument.h + ./modules/juce_audio_basics/mpe/juce_MPEMessages.cpp + ./modules/juce_audio_basics/mpe/juce_MPEMessages.h + ./modules/juce_audio_basics/mpe/juce_MPENote.cpp + ./modules/juce_audio_basics/mpe/juce_MPENote.h + ./modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp + ./modules/juce_audio_basics/mpe/juce_MPESynthesiser.h + ./modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp + ./modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h + ./modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.cpp + ./modules/juce_audio_basics/mpe/juce_MPESynthesiserVoice.h + ./modules/juce_audio_basics/mpe/juce_MPEUtils.cpp + ./modules/juce_audio_basics/mpe/juce_MPEUtils.h + ./modules/juce_audio_basics/mpe/juce_MPEValue.cpp + ./modules/juce_audio_basics/mpe/juce_MPEValue.h + ./modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp + ./modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h + ./modules/juce_audio_basics/native/juce_mac_CoreAudioLayouts.h + ./modules/juce_audio_basics/sources/juce_AudioSource.h + ./modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_BufferingAudioSource.h + ./modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h + ./modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h + ./modules/juce_audio_basics/sources/juce_MemoryAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_MemoryAudioSource.h + ./modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_MixerAudioSource.h + ./modules/juce_audio_basics/sources/juce_PositionableAudioSource.h + ./modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h + ./modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_ReverbAudioSource.h + ./modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp + ./modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h + ./modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp + ./modules/juce_audio_basics/synthesisers/juce_Synthesiser.h + ./modules/juce_audio_basics/utilities/juce_ADSR.h + ./modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.cpp + ./modules/juce_audio_basics/utilities/juce_CatmullRomInterpolator.h + ./modules/juce_audio_basics/utilities/juce_Decibels.h + ./modules/juce_audio_basics/utilities/juce_IIRFilter.cpp + ./modules/juce_audio_basics/utilities/juce_IIRFilter.h + ./modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.cpp + ./modules/juce_audio_basics/utilities/juce_LagrangeInterpolator.h + ./modules/juce_audio_basics/utilities/juce_Reverb.h + ./modules/juce_audio_basics/utilities/juce_SmoothedValue.cpp + ./modules/juce_audio_basics/utilities/juce_SmoothedValue.h + ./modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp + ./modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h + ./modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp + ./modules/juce_audio_devices/audio_io/juce_AudioIODevice.h + ./modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp + ./modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h + ./modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h + ./modules/juce_audio_devices/juce_audio_devices.cpp + ./modules/juce_audio_devices/juce_audio_devices.h + ./modules/juce_audio_devices/juce_audio_devices.mm + ./modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp + ./modules/juce_audio_devices/midi_io/juce_MidiDevices.h + ./modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp + ./modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h + ./modules/juce_audio_devices/native/juce_MidiDataConcatenator.h + ./modules/juce_audio_devices/native/juce_android_Audio.cpp + ./modules/juce_audio_devices/native/juce_android_Midi.cpp + ./modules/juce_audio_devices/native/juce_android_Oboe.cpp + ./modules/juce_audio_devices/native/juce_android_OpenSL.cpp + ./modules/juce_audio_devices/native/juce_ios_Audio.cpp + ./modules/juce_audio_devices/native/juce_ios_Audio.h + ./modules/juce_audio_devices/native/juce_linux_ALSA.cpp + ./modules/juce_audio_devices/native/juce_linux_Bela.cpp + ./modules/juce_audio_devices/native/juce_linux_JackAudio.cpp + ./modules/juce_audio_devices/native/juce_linux_Midi.cpp + ./modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp + ./modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp + ./modules/juce_audio_devices/native/juce_win32_ASIO.cpp + ./modules/juce_audio_devices/native/juce_win32_DirectSound.cpp + ./modules/juce_audio_devices/native/juce_win32_Midi.cpp + ./modules/juce_audio_devices/native/juce_win32_WASAPI.cpp + ./modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp + ./modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h + ./modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp + ./modules/juce_audio_devices/sources/juce_AudioTransportSource.h + ./modules/juce_blocks_basics/blocks/juce_Block.cpp + ./modules/juce_blocks_basics/blocks/juce_Block.h + ./modules/juce_blocks_basics/blocks/juce_BlocksVersion.cpp + ./modules/juce_blocks_basics/blocks/juce_BlocksVersion.h + ./modules/juce_blocks_basics/blocks/juce_ControlButton.h + ./modules/juce_blocks_basics/blocks/juce_LEDGrid.h + ./modules/juce_blocks_basics/blocks/juce_LEDRow.h + ./modules/juce_blocks_basics/blocks/juce_StatusLight.h + ./modules/juce_blocks_basics/blocks/juce_TouchList.h + ./modules/juce_blocks_basics/blocks/juce_TouchSurface.h + ./modules/juce_blocks_basics/juce_blocks_basics.cpp + ./modules/juce_blocks_basics/juce_blocks_basics.h + ./modules/juce_blocks_basics/littlefoot/juce_LittleFootCompiler.h + ./modules/juce_blocks_basics/littlefoot/juce_LittleFootRemoteHeap.h + ./modules/juce_blocks_basics/littlefoot/juce_LittleFootRunner.h + ./modules/juce_blocks_basics/protocol/juce_BitPackingUtilities.h + ./modules/juce_blocks_basics/protocol/juce_BlockModels.h + ./modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h + ./modules/juce_blocks_basics/protocol/juce_HostPacketBuilder.h + ./modules/juce_blocks_basics/protocol/juce_HostPacketDecoder.h + ./modules/juce_blocks_basics/topology/internal/juce_BandwidthStatsLogger.cpp + ./modules/juce_blocks_basics/topology/internal/juce_BlockImplementation.cpp + ./modules/juce_blocks_basics/topology/internal/juce_ConnectedDeviceGroup.cpp + ./modules/juce_blocks_basics/topology/internal/juce_DepreciatedVersionReader.cpp + ./modules/juce_blocks_basics/topology/internal/juce_Detector.cpp + ./modules/juce_blocks_basics/topology/internal/juce_DetectorHolder.cpp + ./modules/juce_blocks_basics/topology/internal/juce_DeviceInfo.cpp + ./modules/juce_blocks_basics/topology/internal/juce_MIDIDeviceDetector.cpp + ./modules/juce_blocks_basics/topology/internal/juce_MidiDeviceConnection.cpp + ./modules/juce_blocks_basics/topology/juce_BlockGraph.cpp + ./modules/juce_blocks_basics/topology/juce_BlockGraph.h + ./modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp + ./modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.h + ./modules/juce_blocks_basics/topology/juce_RuleBasedTopologySource.cpp + ./modules/juce_blocks_basics/topology/juce_RuleBasedTopologySource.h + ./modules/juce_blocks_basics/topology/juce_Topology.h + ./modules/juce_blocks_basics/topology/juce_TopologySource.h + ./modules/juce_blocks_basics/visualisers/juce_BitmapLEDProgram.cpp + ./modules/juce_blocks_basics/visualisers/juce_BitmapLEDProgram.h + ./modules/juce_blocks_basics/visualisers/juce_DrumPadLEDProgram.cpp + ./modules/juce_blocks_basics/visualisers/juce_DrumPadLEDProgram.h + ./modules/juce_core/containers/juce_AbstractFifo.cpp + ./modules/juce_core/containers/juce_AbstractFifo.h + ./modules/juce_core/containers/juce_Array.h + ./modules/juce_core/containers/juce_ArrayAllocationBase.h + ./modules/juce_core/containers/juce_ArrayBase.cpp + ./modules/juce_core/containers/juce_ArrayBase.h + ./modules/juce_core/containers/juce_DynamicObject.cpp + ./modules/juce_core/containers/juce_DynamicObject.h + ./modules/juce_core/containers/juce_ElementComparator.h + ./modules/juce_core/containers/juce_HashMap.h + ./modules/juce_core/containers/juce_HashMap_test.cpp + ./modules/juce_core/containers/juce_LinkedListPointer.h + ./modules/juce_core/containers/juce_ListenerList.h + ./modules/juce_core/containers/juce_NamedValueSet.cpp + ./modules/juce_core/containers/juce_NamedValueSet.h + ./modules/juce_core/containers/juce_OwnedArray.cpp + ./modules/juce_core/containers/juce_OwnedArray.h + ./modules/juce_core/containers/juce_PropertySet.cpp + ./modules/juce_core/containers/juce_PropertySet.h + ./modules/juce_core/containers/juce_ReferenceCountedArray.cpp + ./modules/juce_core/containers/juce_ReferenceCountedArray.h + ./modules/juce_core/containers/juce_ScopedValueSetter.h + ./modules/juce_core/containers/juce_SortedSet.h + ./modules/juce_core/containers/juce_SparseSet.cpp + ./modules/juce_core/containers/juce_SparseSet.h + ./modules/juce_core/containers/juce_Variant.cpp + ./modules/juce_core/containers/juce_Variant.h + ./modules/juce_core/files/juce_DirectoryIterator.cpp + ./modules/juce_core/files/juce_DirectoryIterator.h + ./modules/juce_core/files/juce_File.cpp + ./modules/juce_core/files/juce_File.h + ./modules/juce_core/files/juce_FileFilter.cpp + ./modules/juce_core/files/juce_FileFilter.h + ./modules/juce_core/files/juce_FileInputStream.cpp + ./modules/juce_core/files/juce_FileInputStream.h + ./modules/juce_core/files/juce_FileOutputStream.cpp + ./modules/juce_core/files/juce_FileOutputStream.h + ./modules/juce_core/files/juce_FileSearchPath.cpp + ./modules/juce_core/files/juce_FileSearchPath.h + ./modules/juce_core/files/juce_MemoryMappedFile.h + ./modules/juce_core/files/juce_TemporaryFile.cpp + ./modules/juce_core/files/juce_TemporaryFile.h + ./modules/juce_core/files/juce_WildcardFileFilter.cpp + ./modules/juce_core/files/juce_WildcardFileFilter.h + ./modules/juce_core/javascript/juce_JSON.cpp + ./modules/juce_core/javascript/juce_JSON.h + ./modules/juce_core/javascript/juce_Javascript.cpp + ./modules/juce_core/javascript/juce_Javascript.h + ./modules/juce_core/juce_core.cpp + ./modules/juce_core/juce_core.h + ./modules/juce_core/juce_core.mm + ./modules/juce_core/logging/juce_FileLogger.cpp + ./modules/juce_core/logging/juce_FileLogger.h + ./modules/juce_core/logging/juce_Logger.cpp + ./modules/juce_core/logging/juce_Logger.h + ./modules/juce_core/maths/juce_BigInteger.cpp + ./modules/juce_core/maths/juce_BigInteger.h + ./modules/juce_core/maths/juce_Expression.cpp + ./modules/juce_core/maths/juce_Expression.h + ./modules/juce_core/maths/juce_MathsFunctions.h + ./modules/juce_core/maths/juce_NormalisableRange.h + ./modules/juce_core/maths/juce_Random.cpp + ./modules/juce_core/maths/juce_Random.h + ./modules/juce_core/maths/juce_Range.h + ./modules/juce_core/maths/juce_StatisticsAccumulator.h + ./modules/juce_core/memory/juce_Atomic.h + ./modules/juce_core/memory/juce_ByteOrder.h + ./modules/juce_core/memory/juce_ContainerDeletePolicy.h + ./modules/juce_core/memory/juce_HeapBlock.h + ./modules/juce_core/memory/juce_HeavyweightLeakedObjectDetector.h + ./modules/juce_core/memory/juce_LeakedObjectDetector.h + ./modules/juce_core/memory/juce_Memory.h + ./modules/juce_core/memory/juce_MemoryBlock.cpp + ./modules/juce_core/memory/juce_MemoryBlock.h + ./modules/juce_core/memory/juce_OptionalScopedPointer.h + ./modules/juce_core/memory/juce_ReferenceCountedObject.h + ./modules/juce_core/memory/juce_ScopedPointer.h + ./modules/juce_core/memory/juce_SharedResourcePointer.h + ./modules/juce_core/memory/juce_Singleton.h + ./modules/juce_core/memory/juce_WeakReference.h + ./modules/juce_core/misc/juce_ConsoleApplication.cpp + ./modules/juce_core/misc/juce_ConsoleApplication.h + ./modules/juce_core/misc/juce_Result.cpp + ./modules/juce_core/misc/juce_Result.h + ./modules/juce_core/misc/juce_RuntimePermissions.cpp + ./modules/juce_core/misc/juce_RuntimePermissions.h + ./modules/juce_core/misc/juce_Uuid.cpp + ./modules/juce_core/misc/juce_Uuid.h + ./modules/juce_core/misc/juce_WindowsRegistry.h + ./modules/juce_core/native/juce_BasicNativeHeaders.h + ./modules/juce_core/native/juce_android_Files.cpp + ./modules/juce_core/native/juce_android_JNIHelpers.cpp + ./modules/juce_core/native/juce_android_JNIHelpers.h + ./modules/juce_core/native/juce_android_Misc.cpp + ./modules/juce_core/native/juce_android_Network.cpp + ./modules/juce_core/native/juce_android_RuntimePermissions.cpp + ./modules/juce_core/native/juce_android_SystemStats.cpp + ./modules/juce_core/native/juce_android_Threads.cpp + ./modules/juce_core/native/juce_curl_Network.cpp + ./modules/juce_core/native/juce_linux_CommonFile.cpp + ./modules/juce_core/native/juce_linux_Files.cpp + ./modules/juce_core/native/juce_linux_Network.cpp + ./modules/juce_core/native/juce_linux_SystemStats.cpp + ./modules/juce_core/native/juce_linux_Threads.cpp + ./modules/juce_core/native/juce_mac_ClangBugWorkaround.h + ./modules/juce_core/native/juce_mac_Files.mm + ./modules/juce_core/native/juce_mac_Network.mm + ./modules/juce_core/native/juce_mac_Strings.mm + ./modules/juce_core/native/juce_mac_SystemStats.mm + ./modules/juce_core/native/juce_mac_Threads.mm + ./modules/juce_core/native/juce_osx_ObjCHelpers.h + ./modules/juce_core/native/juce_posix_IPAddress.h + ./modules/juce_core/native/juce_posix_NamedPipe.cpp + ./modules/juce_core/native/juce_posix_SharedCode.h + ./modules/juce_core/native/juce_win32_ComSmartPtr.h + ./modules/juce_core/native/juce_win32_Files.cpp + ./modules/juce_core/native/juce_win32_Network.cpp + ./modules/juce_core/native/juce_win32_Registry.cpp + ./modules/juce_core/native/juce_win32_SystemStats.cpp + ./modules/juce_core/native/juce_win32_Threads.cpp + ./modules/juce_core/network/juce_IPAddress.cpp + ./modules/juce_core/network/juce_IPAddress.h + ./modules/juce_core/network/juce_MACAddress.cpp + ./modules/juce_core/network/juce_MACAddress.h + ./modules/juce_core/network/juce_NamedPipe.cpp + ./modules/juce_core/network/juce_NamedPipe.h + ./modules/juce_core/network/juce_Socket.cpp + ./modules/juce_core/network/juce_Socket.h + ./modules/juce_core/network/juce_URL.cpp + ./modules/juce_core/network/juce_URL.h + ./modules/juce_core/network/juce_WebInputStream.cpp + ./modules/juce_core/network/juce_WebInputStream.h + ./modules/juce_core/streams/juce_BufferedInputStream.cpp + ./modules/juce_core/streams/juce_BufferedInputStream.h + ./modules/juce_core/streams/juce_FileInputSource.cpp + ./modules/juce_core/streams/juce_FileInputSource.h + ./modules/juce_core/streams/juce_InputSource.h + ./modules/juce_core/streams/juce_InputStream.cpp + ./modules/juce_core/streams/juce_InputStream.h + ./modules/juce_core/streams/juce_MemoryInputStream.cpp + ./modules/juce_core/streams/juce_MemoryInputStream.h + ./modules/juce_core/streams/juce_MemoryOutputStream.cpp + ./modules/juce_core/streams/juce_MemoryOutputStream.h + ./modules/juce_core/streams/juce_OutputStream.cpp + ./modules/juce_core/streams/juce_OutputStream.h + ./modules/juce_core/streams/juce_SubregionStream.cpp + ./modules/juce_core/streams/juce_SubregionStream.h + ./modules/juce_core/streams/juce_URLInputSource.cpp + ./modules/juce_core/streams/juce_URLInputSource.h + ./modules/juce_core/system/juce_CompilerSupport.h + ./modules/juce_core/system/juce_PlatformDefs.h + ./modules/juce_core/system/juce_StandardHeader.h + ./modules/juce_core/system/juce_SystemStats.cpp + ./modules/juce_core/system/juce_SystemStats.h + ./modules/juce_core/system/juce_TargetPlatform.h + ./modules/juce_core/text/juce_Base64.cpp + ./modules/juce_core/text/juce_Base64.h + ./modules/juce_core/text/juce_CharPointer_ASCII.h + ./modules/juce_core/text/juce_CharPointer_UTF16.h + ./modules/juce_core/text/juce_CharPointer_UTF32.h + ./modules/juce_core/text/juce_CharPointer_UTF8.h + ./modules/juce_core/text/juce_CharacterFunctions.cpp + ./modules/juce_core/text/juce_CharacterFunctions.h + ./modules/juce_core/text/juce_Identifier.cpp + ./modules/juce_core/text/juce_Identifier.h + ./modules/juce_core/text/juce_LocalisedStrings.cpp + ./modules/juce_core/text/juce_LocalisedStrings.h + ./modules/juce_core/text/juce_NewLine.h + ./modules/juce_core/text/juce_String.cpp + ./modules/juce_core/text/juce_String.h + ./modules/juce_core/text/juce_StringArray.cpp + ./modules/juce_core/text/juce_StringArray.h + ./modules/juce_core/text/juce_StringPairArray.cpp + ./modules/juce_core/text/juce_StringPairArray.h + ./modules/juce_core/text/juce_StringPool.cpp + ./modules/juce_core/text/juce_StringPool.h + ./modules/juce_core/text/juce_StringRef.h + ./modules/juce_core/text/juce_TextDiff.cpp + ./modules/juce_core/text/juce_TextDiff.h + ./modules/juce_core/threads/juce_ChildProcess.cpp + ./modules/juce_core/threads/juce_ChildProcess.h + ./modules/juce_core/threads/juce_CriticalSection.h + ./modules/juce_core/threads/juce_DynamicLibrary.h + ./modules/juce_core/threads/juce_HighResolutionTimer.cpp + ./modules/juce_core/threads/juce_HighResolutionTimer.h + ./modules/juce_core/threads/juce_InterProcessLock.h + ./modules/juce_core/threads/juce_Process.h + ./modules/juce_core/threads/juce_ReadWriteLock.cpp + ./modules/juce_core/threads/juce_ReadWriteLock.h + ./modules/juce_core/threads/juce_ScopedLock.h + ./modules/juce_core/threads/juce_ScopedReadLock.h + ./modules/juce_core/threads/juce_ScopedWriteLock.h + ./modules/juce_core/threads/juce_SpinLock.h + ./modules/juce_core/threads/juce_Thread.cpp + ./modules/juce_core/threads/juce_Thread.h + ./modules/juce_core/threads/juce_ThreadLocalValue.h + ./modules/juce_core/threads/juce_ThreadPool.cpp + ./modules/juce_core/threads/juce_ThreadPool.h + ./modules/juce_core/threads/juce_TimeSliceThread.cpp + ./modules/juce_core/threads/juce_TimeSliceThread.h + ./modules/juce_core/threads/juce_WaitableEvent.h + ./modules/juce_core/time/juce_PerformanceCounter.cpp + ./modules/juce_core/time/juce_PerformanceCounter.h + ./modules/juce_core/time/juce_RelativeTime.cpp + ./modules/juce_core/time/juce_RelativeTime.h + ./modules/juce_core/time/juce_Time.cpp + ./modules/juce_core/time/juce_Time.h + ./modules/juce_core/unit_tests/juce_UnitTest.cpp + ./modules/juce_core/unit_tests/juce_UnitTest.h + ./modules/juce_core/unit_tests/juce_UnitTestCategories.h + ./modules/juce_core/xml/juce_XmlDocument.cpp + ./modules/juce_core/xml/juce_XmlDocument.h + ./modules/juce_core/xml/juce_XmlElement.cpp + ./modules/juce_core/xml/juce_XmlElement.h + ./modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp + ./modules/juce_core/zip/juce_GZIPCompressorOutputStream.h + ./modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp + ./modules/juce_core/zip/juce_GZIPDecompressorInputStream.h + ./modules/juce_core/zip/juce_ZipFile.cpp + ./modules/juce_core/zip/juce_ZipFile.h + ./modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp + ./modules/juce_events/broadcasters/juce_ActionBroadcaster.h + ./modules/juce_events/broadcasters/juce_ActionListener.h + ./modules/juce_events/broadcasters/juce_AsyncUpdater.cpp + ./modules/juce_events/broadcasters/juce_AsyncUpdater.h + ./modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp + ./modules/juce_events/broadcasters/juce_ChangeBroadcaster.h + ./modules/juce_events/broadcasters/juce_ChangeListener.h + ./modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp + ./modules/juce_events/interprocess/juce_ConnectedChildProcess.h + ./modules/juce_events/interprocess/juce_InterprocessConnection.cpp + ./modules/juce_events/interprocess/juce_InterprocessConnection.h + ./modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp + ./modules/juce_events/interprocess/juce_InterprocessConnectionServer.h + ./modules/juce_events/interprocess/juce_NetworkServiceDiscovery.cpp + ./modules/juce_events/interprocess/juce_NetworkServiceDiscovery.h + ./modules/juce_events/juce_events.cpp + ./modules/juce_events/juce_events.h + ./modules/juce_events/juce_events.mm + ./modules/juce_events/messages/juce_ApplicationBase.cpp + ./modules/juce_events/messages/juce_ApplicationBase.h + ./modules/juce_events/messages/juce_CallbackMessage.h + ./modules/juce_events/messages/juce_DeletedAtShutdown.cpp + ./modules/juce_events/messages/juce_DeletedAtShutdown.h + ./modules/juce_events/messages/juce_Initialisation.h + ./modules/juce_events/messages/juce_Message.h + ./modules/juce_events/messages/juce_MessageListener.cpp + ./modules/juce_events/messages/juce_MessageListener.h + ./modules/juce_events/messages/juce_MessageManager.cpp + ./modules/juce_events/messages/juce_MessageManager.h + ./modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h + ./modules/juce_events/messages/juce_NotificationType.h + ./modules/juce_events/native/juce_android_Messaging.cpp + ./modules/juce_events/native/juce_ios_MessageManager.mm + ./modules/juce_events/native/juce_linux_EventLoop.h + ./modules/juce_events/native/juce_linux_Messaging.cpp + ./modules/juce_events/native/juce_mac_MessageManager.mm + ./modules/juce_events/native/juce_osx_MessageQueue.h + ./modules/juce_events/native/juce_win32_HiddenMessageWindow.h + ./modules/juce_events/native/juce_win32_Messaging.cpp + ./modules/juce_events/native/juce_win32_WinRTWrapper.cpp + ./modules/juce_events/native/juce_win32_WinRTWrapper.h + ./modules/juce_events/timers/juce_MultiTimer.cpp + ./modules/juce_events/timers/juce_MultiTimer.h + ./modules/juce_events/timers/juce_Timer.cpp + ./modules/juce_events/timers/juce_Timer.h + ./modules/juce_product_unlocking/juce_product_unlocking.mm + ./modules/juce_video/native/juce_android_Video.h + ./modules/juce_video/native/juce_mac_Video.h +Copyright: 2017, - ROLI Ltd. + 2018, - ROLI Ltd. + 2019, - ROLI Ltd. +License: UNKNOWN + FIXME + +Files: ./examples/Assets/Box2DTests/ApplyForce.h + ./examples/Assets/Box2DTests/BodyTypes.h + ./examples/Assets/Box2DTests/Breakable.h + ./examples/Assets/Box2DTests/Bridge.h + ./examples/Assets/Box2DTests/BulletTest.h + ./examples/Assets/Box2DTests/Cantilever.h + ./examples/Assets/Box2DTests/Car.h + ./examples/Assets/Box2DTests/Chain.h + ./examples/Assets/Box2DTests/CharacterCollision.h + ./examples/Assets/Box2DTests/CollisionFiltering.h + ./examples/Assets/Box2DTests/CollisionProcessing.h + ./examples/Assets/Box2DTests/CompoundShapes.h + ./examples/Assets/Box2DTests/Confined.h + ./examples/Assets/Box2DTests/ContinuousTest.h + ./examples/Assets/Box2DTests/DistanceTest.h + ./examples/Assets/Box2DTests/Dominos.h + ./examples/Assets/Box2DTests/DumpShell.h + ./examples/Assets/Box2DTests/DynamicTreeTest.h + ./examples/Assets/Box2DTests/EdgeShapes.h + ./examples/Assets/Box2DTests/EdgeTest.h + ./examples/Assets/Box2DTests/Gears.h + ./examples/Assets/Box2DTests/OneSidedPlatform.h + ./examples/Assets/Box2DTests/Pinball.h + ./examples/Assets/Box2DTests/PolyCollision.h + ./examples/Assets/Box2DTests/PolyShapes.h + ./examples/Assets/Box2DTests/Prismatic.h + ./examples/Assets/Box2DTests/Pulleys.h + ./examples/Assets/Box2DTests/Pyramid.h + ./examples/Assets/Box2DTests/RayCast.h + ./examples/Assets/Box2DTests/Revolute.h + ./examples/Assets/Box2DTests/RopeJoint.h + ./examples/Assets/Box2DTests/SensorTest.h + ./examples/Assets/Box2DTests/ShapeEditing.h + ./examples/Assets/Box2DTests/SliderCrank.h + ./examples/Assets/Box2DTests/SphereStack.h + ./examples/Assets/Box2DTests/TestEntries.cpp + ./examples/Assets/Box2DTests/TheoJansen.h + ./examples/Assets/Box2DTests/Tiles.h + ./examples/Assets/Box2DTests/TimeOfImpact.h + ./examples/Assets/Box2DTests/Tumbler.h + ./examples/Assets/Box2DTests/VaryingFriction.h + ./examples/Assets/Box2DTests/VaryingRestitution.h + ./examples/Assets/Box2DTests/VerticalStack.h + ./examples/Assets/Box2DTests/Web.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/ApplyForce.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/BodyTypes.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Breakable.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Bridge.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/BulletTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Cantilever.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Car.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Chain.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/CharacterCollision.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/CollisionFiltering.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/CollisionProcessing.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/CompoundShapes.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Confined.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/ContinuousTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/DistanceTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Dominos.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/DumpShell.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/DynamicTreeTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/EdgeShapes.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/EdgeTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Gears.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/OneSidedPlatform.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Pinball.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/PolyCollision.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/PolyShapes.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Prismatic.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Pulleys.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Pyramid.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/RayCast.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Revolute.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/RopeJoint.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/SensorTest.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/ShapeEditing.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/SliderCrank.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/SphereStack.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/TestEntries.cpp + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/TheoJansen.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Tiles.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/TimeOfImpact.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Tumbler.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/VaryingFriction.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/VaryingRestitution.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/VerticalStack.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Web.h + ./modules/juce_box2d/box2d/Box2D.h + ./modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.cpp + ./modules/juce_box2d/box2d/Collision/Shapes/b2ChainShape.h + ./modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.cpp + ./modules/juce_box2d/box2d/Collision/Shapes/b2CircleShape.h + ./modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.cpp + ./modules/juce_box2d/box2d/Collision/Shapes/b2EdgeShape.h + ./modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.cpp + ./modules/juce_box2d/box2d/Collision/Shapes/b2PolygonShape.h + ./modules/juce_box2d/box2d/Collision/Shapes/b2Shape.h + ./modules/juce_box2d/box2d/Collision/b2BroadPhase.cpp + ./modules/juce_box2d/box2d/Collision/b2BroadPhase.h + ./modules/juce_box2d/box2d/Collision/b2CollideCircle.cpp + ./modules/juce_box2d/box2d/Collision/b2CollideEdge.cpp + ./modules/juce_box2d/box2d/Collision/b2CollidePolygon.cpp + ./modules/juce_box2d/box2d/Collision/b2Collision.cpp + ./modules/juce_box2d/box2d/Collision/b2Collision.h + ./modules/juce_box2d/box2d/Collision/b2Distance.cpp + ./modules/juce_box2d/box2d/Collision/b2Distance.h + ./modules/juce_box2d/box2d/Collision/b2DynamicTree.cpp + ./modules/juce_box2d/box2d/Collision/b2DynamicTree.h + ./modules/juce_box2d/box2d/Collision/b2TimeOfImpact.cpp + ./modules/juce_box2d/box2d/Collision/b2TimeOfImpact.h + ./modules/juce_box2d/box2d/Common/b2BlockAllocator.cpp + ./modules/juce_box2d/box2d/Common/b2BlockAllocator.h + ./modules/juce_box2d/box2d/Common/b2GrowableStack.h + ./modules/juce_box2d/box2d/Common/b2Math.cpp + ./modules/juce_box2d/box2d/Common/b2Math.h + ./modules/juce_box2d/box2d/Common/b2Settings.cpp + ./modules/juce_box2d/box2d/Common/b2Settings.h + ./modules/juce_box2d/box2d/Common/b2StackAllocator.cpp + ./modules/juce_box2d/box2d/Common/b2StackAllocator.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndCircleContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ChainAndPolygonContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2CircleContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2Contact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2ContactSolver.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndCircleContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2EdgeAndPolygonContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonAndCircleContact.h + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.cpp + ./modules/juce_box2d/box2d/Dynamics/Contacts/b2PolygonContact.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2DistanceJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2FrictionJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2GearJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2Joint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2MouseJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2PrismaticJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2PulleyJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2RevoluteJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2RopeJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2WeldJoint.h + ./modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.cpp + ./modules/juce_box2d/box2d/Dynamics/Joints/b2WheelJoint.h + ./modules/juce_box2d/box2d/Dynamics/b2Body.cpp + ./modules/juce_box2d/box2d/Dynamics/b2Body.h + ./modules/juce_box2d/box2d/Dynamics/b2ContactManager.cpp + ./modules/juce_box2d/box2d/Dynamics/b2ContactManager.h + ./modules/juce_box2d/box2d/Dynamics/b2Fixture.cpp + ./modules/juce_box2d/box2d/Dynamics/b2Fixture.h + ./modules/juce_box2d/box2d/Dynamics/b2Island.cpp + ./modules/juce_box2d/box2d/Dynamics/b2Island.h + ./modules/juce_box2d/box2d/Dynamics/b2TimeStep.h + ./modules/juce_box2d/box2d/Dynamics/b2World.cpp + ./modules/juce_box2d/box2d/Dynamics/b2World.h + ./modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.cpp + ./modules/juce_box2d/box2d/Dynamics/b2WorldCallbacks.h + ./modules/juce_box2d/box2d/Rope/b2Rope.h +Copyright: 2006-2007, Erin Catto http:www.box2d.org + 2006-2009, Erin Catto http:www.box2d.org + 2006-2010, Erin Catto http:www.box2d.org + 2006-2011, Erin Catto http:www.box2d.org + 2007, Erin Catto http:www.box2d.org + 2007-2009, Erin Catto http:www.box2d.org + 2007-2011, Erin Catto http:www.box2d.org + 2008-2009, Erin Catto http:www.box2d.org + 2009, Erin Catto http:www.box2d.org + 2010, Erin Catto http:www.box2d.org + 2011, Erin Catto http:www.box2d.org +License: Zlib + FIXME + +Files: ./modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h + ./modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsttestplugprovider.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp + ./modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h +Copyright: 2018, Steinberg Media Technologies GmbH + 2019, Steinberg Media Technologies GmbH +License: BSD-3-clause + FIXME + +Files: ./LICENSE.md + ./examples/DemoRunner/JuceLibraryCode/AppConfig.h + ./extras/AudioPerformanceTest/JuceLibraryCode/AppConfig.h + ./extras/AudioPluginHost/JuceLibraryCode/AppConfig.h + ./extras/BinaryBuilder/JuceLibraryCode/AppConfig.h + ./extras/NetworkGraphicsDemo/JuceLibraryCode/AppConfig.h + ./extras/Projucer/JuceLibraryCode/AppConfig.h + ./extras/UnitTestRunner/JuceLibraryCode/AppConfig.h + ./extras/WindowsDLL/JuceLibraryCode/AppConfig.h +Copyright: NONE +License: GPL-3 + FIXME + +Files: ./examples/Assets/Box2DTests/Rope.h + ./examples/DemoRunner/Builds/Android/app/src/main/assets/Box2DTests/Rope.h + ./modules/juce_box2d/box2d/Common/b2Draw.cpp + ./modules/juce_box2d/box2d/Common/b2Draw.h + ./modules/juce_box2d/box2d/Common/b2Timer.cpp + ./modules/juce_box2d/box2d/Common/b2Timer.h + ./modules/juce_box2d/box2d/Rope/b2Rope.cpp +Copyright: 2011, Erin Catto http:box2d.org +License: Zlib + FIXME + +Files: ./examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt + ./extras/AudioPerformanceTest/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt + ./extras/AudioPluginHost/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt + ./extras/NetworkGraphicsDemo/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt + ./extras/Projucer/Source/BinaryData/gradle/LICENSE +Copyright: NONE +License: Apache-2.0 + FIXME + +Files: ./modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h + ./modules/juce_core/misc/juce_StdFunctionCompat.cpp + ./modules/juce_core/misc/juce_StdFunctionCompat.h +Copyright: 2017, - ROLI Ltd. +License: ISC + FIXME + +Files: ./examples/DemoRunner/Builds/VisualStudio2015/resources.rc + ./examples/DemoRunner/Builds/VisualStudio2017/resources.rc + ./examples/DemoRunner/Builds/VisualStudio2019/resources.rc +Copyright: 2018, - ROLI Ltd.0" +License: UNKNOWN + FIXME + +Files: ./modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt + ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt +Copyright: 2019, Steinberg Media Technologies GmbH +License: GPL-3 + FIXME + +Files: ./examples/DemoRunner/Builds/MacOSX/Info-App.plist + ./examples/DemoRunner/Builds/iOS/Info-App.plist +Copyright: 2018, - ROLI Ltd. +License: UNKNOWN + FIXME + +Files: ./extras/Projucer/Source/BinaryData/offlinepage.html +Copyright: NONE +License: GPL + FIXME + +Files: ./examples/DemoRunner/DemoRunner.jucer +Copyright: 2018, - ROLI Ltd." companyWebsite="https:www.juce.com/" +License: UNKNOWN + FIXME + +Files: ./modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr +Copyright: 1996-2001, Digidesign Inc. +License: UNKNOWN + FIXME + +Files: ./modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h +Copyright: const Speaker kSpeakerLfe = 1 << 3; /< Subbass (Lfe) +License: UNKNOWN + FIXME + +Files: ./extras/Projucer/Source/BinaryData/projucer_EULA.txt +Copyright: provided you comply with the provisions in clause 2, make a single copy of the Software for back-up purposes, provided that you reproduce on it all copyright and other proprietary notices that are on the original copy of the Software; +License: UNKNOWN + FIXME + +Files: ./README.md +Copyright: restrictions +License: UNKNOWN + FIXME + +Files: ./modules/juce_audio_plugin_client/AUResources.r +Copyright: s in this original Apple software (the +License: UNKNOWN + FIXME + diff --git a/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h b/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h new file mode 100644 index 00000000..789cd3ff --- /dev/null +++ b/extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h @@ -0,0 +1,109 @@ +/* + LV2 External UI extension + This work is in public domain. + + This file 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. + + If you have questions, contact Filipe Coelho (aka falkTX) + or ask in #lad channel, FreeNode IRC network. +*/ + +/** + @file lv2_external_ui.h + C header for the LV2 External UI extension . +*/ + +#ifndef LV2_EXTERNAL_UI_H +#define LV2_EXTERNAL_UI_H + +#include "ui.h" + +#define LV2_EXTERNAL_UI_URI "http://kxstudio.sf.net/ns/lv2ext/external-ui" +#define LV2_EXTERNAL_UI_PREFIX LV2_EXTERNAL_UI_URI "#" + +#define LV2_EXTERNAL_UI__Host LV2_EXTERNAL_UI_PREFIX "Host" +#define LV2_EXTERNAL_UI__Widget LV2_EXTERNAL_UI_PREFIX "Widget" + +/** This extension used to be defined by a lv2plug.in URI */ +#define LV2_EXTERNAL_UI_DEPRECATED_URI "http://lv2plug.in/ns/extensions/ui#external" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * When LV2_EXTERNAL_UI__Widget UI is instantiated, the returned + * LV2UI_Widget handle must be cast to pointer to LV2_External_UI_Widget. + * UI is created in invisible state. + */ +typedef struct _LV2_External_UI_Widget { + /** + * Host calls this function regulary. UI library implementing the + * callback may do IPC or redraw the UI. + * + * @param _this_ the UI context + */ + void (*run)(struct _LV2_External_UI_Widget * _this_); + + /** + * Host calls this function to make the plugin UI visible. + * + * @param _this_ the UI context + */ + void (*show)(struct _LV2_External_UI_Widget * _this_); + + /** + * Host calls this function to make the plugin UI invisible again. + * + * @param _this_ the UI context + */ + void (*hide)(struct _LV2_External_UI_Widget * _this_); + +} LV2_External_UI_Widget; + +#define LV2_EXTERNAL_UI_RUN(ptr) (ptr)->run(ptr) +#define LV2_EXTERNAL_UI_SHOW(ptr) (ptr)->show(ptr) +#define LV2_EXTERNAL_UI_HIDE(ptr) (ptr)->hide(ptr) + +/** + * On UI instantiation, host must supply LV2_EXTERNAL_UI__Host feature. + * LV2_Feature::data must be pointer to LV2_External_UI_Host. + */ +typedef struct _LV2_External_UI_Host { + /** + * Callback that plugin UI will call when UI (GUI window) is closed by user. + * This callback will be called during execution of LV2_External_UI_Widget::run() + * (i.e. not from background thread). + * + * After this callback is called, UI is defunct. Host must call LV2UI_Descriptor::cleanup(). + * If host wants to make the UI visible again, the UI must be reinstantiated. + * + * @note When using the depreated URI LV2_EXTERNAL_UI_DEPRECATED_URI, + * some hosts will not call LV2UI_Descriptor::cleanup() as they should, + * and may call show() again without re-initialization. + * + * @param controller Host context associated with plugin UI, as + * supplied to LV2UI_Descriptor::instantiate(). + */ + void (*ui_closed)(LV2UI_Controller controller); + + /** + * Optional (may be NULL) "user friendly" identifier which the UI + * may display to allow a user to easily associate this particular + * UI instance with the correct plugin instance as it is represented + * by the host (e.g. "track 1" or "channel 4"). + * + * If supplied by host, the string will be referenced only during + * LV2UI_Descriptor::instantiate() + */ + const char * plugin_human_id; + +} LV2_External_UI_Host; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EXTERNAL_UI_H */ diff --git a/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h b/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h new file mode 100644 index 00000000..01e28771 --- /dev/null +++ b/extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h @@ -0,0 +1,174 @@ +/* + LV2 Programs Extension + Copyright 2012 Filipe Coelho + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file lv2_programs.h + C header for the LV2 programs extension . +*/ + +#ifndef LV2_PROGRAMS_H +#define LV2_PROGRAMS_H + +#include "lv2.h" +#include "ui.h" + +#define LV2_PROGRAMS_URI "http://kxstudio.sf.net/ns/lv2ext/programs" +#define LV2_PROGRAMS_PREFIX LV2_PROGRAMS_URI "#" + +#define LV2_PROGRAMS__Host LV2_PROGRAMS_PREFIX "Host" +#define LV2_PROGRAMS__Interface LV2_PROGRAMS_PREFIX "Interface" +#define LV2_PROGRAMS__UIInterface LV2_PROGRAMS_PREFIX "UIInterface" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* LV2_Programs_Handle; + +typedef struct _LV2_Program_Descriptor { + + /** Bank number for this program. Note that this extension does not + support MIDI-style separation of bank LSB and MSB values. There is + no restriction on the set of available banks: the numbers do not + need to be contiguous, there does not need to be a bank 0, etc. */ + uint32_t bank; + + /** Program number (unique within its bank) for this program. There is + no restriction on the set of available programs: the numbers do not + need to be contiguous, there does not need to be a program 0, etc. */ + uint32_t program; + + /** Name of the program. */ + const char * name; + +} LV2_Program_Descriptor; + +/** + Programs extension, plugin data. + + When the plugin's extension_data is called with argument LV2_PROGRAMS__Interface, + the plugin MUST return an LV2_Programs_Instance structure, which remains valid + for the lifetime of the plugin. +*/ +typedef struct _LV2_Programs_Interface { + /** + * get_program() + * + * This member is a function pointer that provides a description + * of a program (named preset sound) available on this plugin. + * + * The index argument is an index into the plugin's list of + * programs, not a program number as represented by the Program + * field of the LV2_Program_Descriptor. (This distinction is + * needed to support plugins that use non-contiguous program or + * bank numbers.) + * + * This function returns a LV2_Program_Descriptor pointer that is + * guaranteed to be valid only until the next call to get_program + * or deactivate, on the same plugin instance. This function must + * return NULL if passed an index argument out of range, so that + * the host can use it to query the number of programs as well as + * their properties. + */ + const LV2_Program_Descriptor *(*get_program)(LV2_Handle handle, + uint32_t index); + + /** + * select_program() + * + * This member is a function pointer that selects a new program + * for this plugin. The program change should take effect + * immediately at the start of the next run() call. (This + * means that a host providing the capability of changing programs + * between any two notes on a track must vary the block size so as + * to place the program change at the right place. A host that + * wanted to avoid this would probably just instantiate a plugin + * for each program.) + * + * Plugins should ignore a select_program() call with an invalid + * bank or program. + * + * A plugin is not required to select any particular default + * program on activate(): it's the host's duty to set a program + * explicitly. + * + * A plugin is permitted to re-write the values of its input + * control ports when select_program is called. The host should + * re-read the input control port values and update its own + * records appropriately. (This is the only circumstance in which + * a LV2 plugin is allowed to modify its own control-input ports.) + */ + void (*select_program)(LV2_Handle handle, + uint32_t bank, + uint32_t program); + +} LV2_Programs_Interface; + +/** + Programs extension, UI data. + + When the UI's extension_data is called with argument LV2_PROGRAMS__UIInterface, + the UI MUST return an LV2_Programs_UI_Interface structure, which remains valid + for the lifetime of the UI. +*/ +typedef struct _LV2_Programs_UI_Interface { + /** + * select_program() + * + * This is exactly the same as select_program in LV2_Programs_Instance, + * but this struct relates to the UI instead of the plugin. + * + * When called, UIs should update their state to match the selected program. + */ + void (*select_program)(LV2UI_Handle handle, + uint32_t bank, + uint32_t program); + +} LV2_Programs_UI_Interface; + +/** + Feature data for LV2_PROGRAMS__Host. +*/ +typedef struct _LV2_Programs_Host { + /** + * Opaque host data. + */ + LV2_Programs_Handle handle; + + /** + * program_changed() + * + * Tell the host to reload a plugin's program. + * Parameter handle MUST be the 'handle' member of this struct. + * Parameter index is program index to change. + * When index is -1, host should reload all the programs. + * + * The plugin MUST NEVER call this function on a RT context or during run(). + * + * NOTE: This call is to inform the host about a program's bank, program or name change. + * It DOES NOT change the current selected program. + */ + void (*program_changed)(LV2_Programs_Handle handle, + int32_t index); + +} LV2_Programs_Host; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_PROGRAMS_H */ diff --git a/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp b/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp new file mode 100644 index 00000000..1c1f6162 --- /dev/null +++ b/extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp @@ -0,0 +1,2174 @@ +/* + ============================================================================== + + Juce LV2 Wrapper + + ============================================================================== +*/ + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" + +#include "juce_audio_plugin_client/utility/juce_CheckSettingMacros.h" +#include "juce_core/system/juce_TargetPlatform.h" // for JUCE_LINUX + + +#if JucePlugin_Build_LV2 + +/** Plugin requires processing with a fixed/constant block size */ +#ifndef JucePlugin_WantsLV2FixedBlockSize + #define JucePlugin_WantsLV2FixedBlockSize 0 +#endif + +/** Enable latency port */ +#ifndef JucePlugin_WantsLV2Latency + #define JucePlugin_WantsLV2Latency 1 +#endif + +/** Use non-parameter states */ +#ifndef JucePlugin_WantsLV2State + #define JucePlugin_WantsLV2State 1 +#endif + +/** States are strings, needs custom get/setStateInformationString */ +#ifndef JucePlugin_WantsLV2StateString + #define JucePlugin_WantsLV2StateString 0 +#endif + +/** Export presets */ +#ifndef JucePlugin_WantsLV2Presets + #define JucePlugin_WantsLV2Presets 1 +#endif + +/** Request time position */ +#ifndef JucePlugin_WantsLV2TimePos + #define JucePlugin_WantsLV2TimePos 1 +#endif + +/** Using string states require enabling states first */ +#if JucePlugin_WantsLV2StateString && ! JucePlugin_WantsLV2State + #undef JucePlugin_WantsLV2State + #define JucePlugin_WantsLV2State 1 +#endif + +#if JUCE_LINUX && ! JUCE_AUDIOPROCESSOR_NO_GUI + #include + #undef KeyPress +#endif + +#include +#include + +// LV2 includes.. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "includes/lv2_external_ui.h" +#include "includes/lv2_programs.h" + +#include "../utility/juce_IncludeModuleHeaders.h" + +#define JUCE_LV2_STATE_STRING_URI "urn:juce:stateString" +#define JUCE_LV2_STATE_BINARY_URI "urn:juce:stateBinary" + +//============================================================================== +// Various helper functions for creating the ttl files + +#if JUCE_MAC + #define PLUGIN_EXT ".dylib" +#elif JUCE_LINUX + #define PLUGIN_EXT ".so" +#elif JUCE_WINDOWS + #define PLUGIN_EXT ".dll" +#endif + +using namespace juce; + +/** Returns plugin type, defined in AppConfig.h or JucePluginCharacteristics.h */ +const String getPluginType() +{ + String pluginType; +#ifdef JucePlugin_LV2Category + pluginType = "lv2:" JucePlugin_LV2Category; + pluginType += ", "; +#elif JucePlugin_IsSynth + pluginType = "lv2:InstrumentPlugin, "; +#endif + pluginType += "lv2:Plugin"; + return pluginType; +} + +/** Returns plugin URI */ +static const String& getPluginURI() +{ + // JucePlugin_LV2URI might be defined as a function (eg. allowing dynamic URIs based on filename) + static const String pluginURI(JucePlugin_LV2URI); + return pluginURI; +} + +static Array usedSymbols; + +/** Converts a parameter name to an LV2 compatible symbol. */ +const String nameToSymbol (const String& name, const uint32 portIndex) +{ + String symbol, trimmedName = name.trimStart().trimEnd().toLowerCase(); + + if (trimmedName.isEmpty()) + { + symbol += "lv2_port_"; + symbol += String(portIndex+1); + } + else + { + for (int i=0; i < trimmedName.length(); ++i) + { + const juce_wchar c = trimmedName[i]; + if (i == 0 && std::isdigit(c)) + symbol += "_"; + else if (std::isalpha(c) || std::isdigit(c)) + symbol += c; + else + symbol += "_"; + } + } + + // Do not allow identical symbols + if (usedSymbols.contains(symbol)) + { + int offset = 2; + String offsetStr = "_2"; + symbol += offsetStr; + + while (usedSymbols.contains(symbol)) + { + offset += 1; + String newOffsetStr = "_" + String(offset); + symbol = symbol.replace(offsetStr, newOffsetStr); + offsetStr = newOffsetStr; + } + } + usedSymbols.add(symbol); + + return symbol; +} + +/** Prevents NaN or out of 0.0<->1.0 bounds parameter values. */ +float safeParamValue (float value) +{ + if (std::isnan(value)) + value = 0.0f; + else if (value < 0.0f) + value = 0.0f; + else if (value > 1.0f) + value = 1.0f; + return value; +} + +/** Create the manifest.ttl file contents */ +const String makeManifestFile (AudioProcessor* const filter, const String& binary) +{ + const String& pluginURI(getPluginURI()); + String text; + + // Header + text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + text += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; + text += "@prefix rdfs: .\n"; + text += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; + text += "\n"; + + // Plugin + text += "<" + pluginURI + ">\n"; + text += " a lv2:Plugin ;\n"; + text += " lv2:binary <" + binary + PLUGIN_EXT "> ;\n"; + text += " rdfs:seeAlso <" + binary + ".ttl> .\n"; + text += "\n"; + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + // UIs + if (filter->hasEditor()) + { + text += "<" + pluginURI + "#ExternalUI>\n"; + text += " a <" LV2_EXTERNAL_UI__Widget "> ;\n"; + text += " ui:binary <" + binary + PLUGIN_EXT "> ;\n"; + text += " lv2:requiredFeature <" LV2_INSTANCE_ACCESS_URI "> ;\n"; + text += " lv2:extensionData <" LV2_PROGRAMS__UIInterface "> .\n"; + text += "\n"; + + text += "<" + pluginURI + "#ParentUI>\n"; + #if JUCE_MAC + text += " a ui:CocoaUI ;\n"; + #elif JUCE_LINUX + text += " a ui:X11UI ;\n"; + #elif JUCE_WINDOWS + text += " a ui:WindowsUI ;\n"; + #endif + text += " ui:binary <" + binary + PLUGIN_EXT "> ;\n"; + text += " lv2:requiredFeature <" LV2_INSTANCE_ACCESS_URI "> ;\n"; + text += " lv2:optionalFeature ui:noUserResize ;\n"; + text += " lv2:extensionData <" LV2_PROGRAMS__UIInterface "> .\n"; + text += "\n"; + } +#endif + +#if JucePlugin_WantsLV2Presets + const String presetSeparator(pluginURI.contains("#") ? ":" : "#"); + + // Presets + for (int i = 0; i < filter->getNumPrograms(); ++i) + { + text += "<" + pluginURI + presetSeparator + "preset" + String::formatted("%03i", i+1) + ">\n"; + text += " a pset:Preset ;\n"; + text += " lv2:appliesTo <" + pluginURI + "> ;\n"; + text += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n"; + text += " rdfs:seeAlso .\n"; + text += "\n"; + } +#endif + + return text; +} + +/** Create the -plugin-.ttl file contents */ +const String makePluginFile (AudioProcessor* const filter, const int maxNumInputChannels, const int maxNumOutputChannels) +{ + const String& pluginURI(getPluginURI()); + String text; + + // Header + text += "@prefix atom: <" LV2_ATOM_PREFIX "> .\n"; + text += "@prefix doap: .\n"; + text += "@prefix foaf: .\n"; + text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + text += "@prefix rdfs: .\n"; + text += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; + text += "\n"; + + // Plugin + text += "<" + pluginURI + ">\n"; + text += " a " + getPluginType() + " ;\n"; + text += " lv2:requiredFeature <" LV2_BUF_SIZE__boundedBlockLength "> ,\n"; +#if JucePlugin_WantsLV2FixedBlockSize + text += " <" LV2_BUF_SIZE__fixedBlockLength "> ,\n"; +#endif + text += " <" LV2_URID__map "> ;\n"; + text += " lv2:extensionData <" LV2_OPTIONS__interface "> ,\n"; +#if JucePlugin_WantsLV2State + text += " <" LV2_STATE__interface "> ,\n"; +#endif + text += " <" LV2_PROGRAMS__Interface "> ;\n"; + text += "\n"; + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + // UIs + if (filter->hasEditor()) + { + text += " ui:ui <" + pluginURI + "#ExternalUI> ,\n"; + text += " <" + pluginURI + "#ParentUI> ;\n"; + text += "\n"; + } +#endif + + uint32 portIndex = 0; + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + // MIDI input + text += " lv2:port [\n"; + text += " a lv2:InputPort, atom:AtomPort ;\n"; + text += " atom:bufferType atom:Sequence ;\n"; + #if JucePlugin_WantsMidiInput + text += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; + #endif + #if JucePlugin_WantsLV2TimePos + text += " atom:supports <" LV2_TIME__Position "> ;\n"; + #endif + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_events_in\" ;\n"; + text += " lv2:name \"Events Input\" ;\n"; + text += " lv2:designation lv2:control ;\n"; + #if ! JucePlugin_IsSynth + text += " lv2:portProperty lv2:connectionOptional ;\n"; + #endif + text += " ] ;\n"; + text += "\n"; +#endif + +#if JucePlugin_ProducesMidiOutput + // MIDI output + text += " lv2:port [\n"; + text += " a lv2:OutputPort, atom:AtomPort ;\n"; + text += " atom:bufferType atom:Sequence ;\n"; + text += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_midi_out\" ;\n"; + text += " lv2:name \"MIDI Output\" ;\n"; + text += " ] ;\n"; + text += "\n"; +#endif + + // Freewheel port + text += " lv2:port [\n"; + text += " a lv2:InputPort, lv2:ControlPort ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_freewheel\" ;\n"; + text += " lv2:name \"Freewheel\" ;\n"; + text += " lv2:default 0.0 ;\n"; + text += " lv2:minimum 0.0 ;\n"; + text += " lv2:maximum 1.0 ;\n"; + text += " lv2:designation <" LV2_CORE__freeWheeling "> ;\n"; + text += " lv2:portProperty lv2:toggled, <" LV2_PORT_PROPS__notOnGUI "> ;\n"; + text += " ] ;\n"; + text += "\n"; + +#if JucePlugin_WantsLV2Latency + // Latency port + text += " lv2:port [\n"; + text += " a lv2:OutputPort, lv2:ControlPort ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_latency\" ;\n"; + text += " lv2:name \"Latency\" ;\n"; + text += " lv2:designation <" LV2_CORE__latency "> ;\n"; + text += " lv2:portProperty lv2:reportsLatency, lv2:integer ;\n"; + text += " ] ;\n"; + text += "\n"; +#endif + + // Audio inputs + for (int i=0; i < maxNumInputChannels; ++i) + { + if (i == 0) + text += " lv2:port [\n"; + else + text += " [\n"; + + text += " a lv2:InputPort, lv2:AudioPort ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_audio_in_" + String(i+1) + "\" ;\n"; + text += " lv2:name \"Audio Input " + String(i+1) + "\" ;\n"; + + if (i+1 == maxNumInputChannels) + text += " ] ;\n\n"; + else + text += " ] ,\n"; + } + + // Audio outputs + for (int i=0; i < maxNumOutputChannels; ++i) + { + if (i == 0) + text += " lv2:port [\n"; + else + text += " [\n"; + + text += " a lv2:OutputPort, lv2:AudioPort ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"lv2_audio_out_" + String(i+1) + "\" ;\n"; + text += " lv2:name \"Audio Output " + String(i+1) + "\" ;\n"; + + if (i+1 == maxNumOutputChannels) + text += " ] ;\n\n"; + else + text += " ] ,\n"; + } + + // Parameters + for (int i=0; i < filter->getNumParameters(); ++i) + { + if (i == 0) + text += " lv2:port [\n"; + else + text += " [\n"; + + text += " a lv2:InputPort, lv2:ControlPort ;\n"; + text += " lv2:index " + String(portIndex++) + " ;\n"; + text += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(i), i) + "\" ;\n"; + + if (filter->getParameterName(i).isNotEmpty()) + text += " lv2:name \"" + filter->getParameterName(i) + "\" ;\n"; + else + text += " lv2:name \"Port " + String(i+1) + "\" ;\n"; + + text += " lv2:default " + String::formatted("%f", safeParamValue(filter->getParameter(i))) + " ;\n"; + text += " lv2:minimum 0.0 ;\n"; + text += " lv2:maximum 1.0 ;\n"; + + if (! filter->isParameterAutomatable(i)) + text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n"; + + if (i+1 == filter->getNumParameters()) + text += " ] ;\n\n"; + else + text += " ] ,\n"; + } + + text += " doap:name \"" + filter->getName() + "\" ;\n"; + text += " doap:maintainer [ foaf:name \"" JucePlugin_Manufacturer "\" ] .\n"; + + return text; +} + +/** Create the presets.ttl file contents */ +const String makePresetsFile (AudioProcessor* const filter) +{ + const String& pluginURI(getPluginURI()); + String text; + + // Header + text += "@prefix atom: <" LV2_ATOM_PREFIX "> .\n"; + text += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + text += "@prefix pset: <" LV2_PRESETS_PREFIX "> .\n"; + text += "@prefix rdf: .\n"; + text += "@prefix rdfs: .\n"; + text += "@prefix state: <" LV2_STATE_PREFIX "> .\n"; + text += "@prefix xsd: .\n"; + text += "\n"; + + // Presets + const int numPrograms = filter->getNumPrograms(); + const String presetSeparator(pluginURI.contains("#") ? ":" : "#"); + + for (int i = 0; i < numPrograms; ++i) + { + std::cout << "\nSaving preset " << i+1 << "/" << numPrograms+1 << "..."; + std::cout.flush(); + + String preset; + + // Label + filter->setCurrentProgram(i); + preset += "<" + pluginURI + presetSeparator + "preset" + String::formatted("%03i", i+1) + "> a pset:Preset ;\n"; + + // State +#if JucePlugin_WantsLV2State + preset += " state:state [\n"; + #if JucePlugin_WantsLV2StateString + preset += " <" JUCE_LV2_STATE_STRING_URI ">\n"; + preset += "\"\"\"\n"; + preset += filter->getStateInformationString().replace("\r\n","\n"); + preset += "\"\"\"\n"; + #else + MemoryBlock chunkMemory; + filter->getCurrentProgramStateInformation(chunkMemory); + const String chunkString(Base64::toBase64(chunkMemory.getData(), chunkMemory.getSize())); + + preset += " <" JUCE_LV2_STATE_BINARY_URI "> [\n"; + preset += " a atom:Chunk ;\n"; + preset += " rdf:value \"" + chunkString + "\"^^xsd:base64Binary ;\n"; + preset += " ] ;\n"; + #endif + if (filter->getNumParameters() == 0) + { + preset += " ] .\n\n"; + continue; + } + + preset += " ] ;\n\n"; +#endif + + // Port values + usedSymbols.clear(); + + for (int j=0; j < filter->getNumParameters(); ++j) + { + if (j == 0) + preset += " lv2:port [\n"; + else + preset += " [\n"; + + preset += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(j), j) + "\" ;\n"; + preset += " pset:value " + String::formatted("%f", safeParamValue(filter->getParameter(j))) + " ;\n"; + + if (j+1 == filter->getNumParameters()) + preset += " ] "; + else + preset += " ] ,\n"; + } + preset += ".\n\n"; + + text += preset; + } + + return text; +} + +/** Creates manifest.ttl, plugin.ttl and presets.ttl files */ +void createLv2Files(const char* basename) +{ + const ScopedJuceInitialiser_GUI juceInitialiser; + ScopedPointer filter (createPluginFilterOfType (AudioProcessor::wrapperType_LV2)); + + String binary(basename); + String binaryTTL(binary + ".ttl"); + + std::cout << "Writing manifest.ttl..."; std::cout.flush(); + std::fstream manifest("manifest.ttl", std::ios::out); + manifest << makeManifestFile(filter, binary) << std::endl; + manifest.close(); + std::cout << " done!" << std::endl; + + std::cout << "Writing " << binary << ".ttl..."; std::cout.flush(); + std::fstream plugin(binaryTTL.toUTF8(), std::ios::out); + plugin << makePluginFile(filter, JucePlugin_MaxNumInputChannels, JucePlugin_MaxNumOutputChannels) << std::endl; + plugin.close(); + std::cout << " done!" << std::endl; + +#if JucePlugin_WantsLV2Presets + std::cout << "Writing presets.ttl..."; std::cout.flush(); + std::fstream presets("presets.ttl", std::ios::out); + presets << makePresetsFile(filter) << std::endl; + presets.close(); + std::cout << " done!" << std::endl; +#endif +} + +//============================================================================== +#if JUCE_LINUX + +class SharedMessageThread : public Thread +{ +public: + SharedMessageThread() + : Thread ("Lv2MessageThread"), + initialised (false) + { + startThread (7); + + while (! initialised) + sleep (1); + } + + ~SharedMessageThread() + { + MessageManager::getInstance()->stopDispatchLoop(); + waitForThreadToExit (5000); + } + + void run() override + { + const ScopedJuceInitialiser_GUI juceInitialiser; + + MessageManager::getInstance()->setCurrentThreadAsMessageThread(); + initialised = true; + + MessageManager::getInstance()->runDispatchLoop(); + } + +private: + volatile bool initialised; +}; +#endif + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI +//============================================================================== +/** + Lightweight DocumentWindow subclass for external ui +*/ +class JuceLv2ExternalUIWindow : public DocumentWindow +{ +public: + /** Creates a Document Window wrapper */ + JuceLv2ExternalUIWindow (AudioProcessorEditor* editor, const String& title) : + DocumentWindow (title, Colours::white, DocumentWindow::minimiseButton | DocumentWindow::closeButton, false), + closed (false), + lastPos (0, 0) + { + setOpaque (true); + setContentNonOwned (editor, true); + setSize (editor->getWidth(), editor->getHeight()); + setUsingNativeTitleBar (true); + } + + /** Close button handler */ + void closeButtonPressed() + { + saveLastPos(); + removeFromDesktop(); + closed = true; + } + + void saveLastPos() + { + lastPos = getScreenPosition(); + } + + void restoreLastPos() + { + setTopLeftPosition (lastPos.getX(), lastPos.getY()); + } + + Point getLastPos() + { + return lastPos; + } + + bool isClosed() + { + return closed; + } + + void reset() + { + closed = false; + } + +private: + bool closed; + Point lastPos; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ExternalUIWindow); +}; + +//============================================================================== +/** + Juce LV2 External UI handle +*/ +class JuceLv2ExternalUIWrapper : public LV2_External_UI_Widget +{ +public: + JuceLv2ExternalUIWrapper (AudioProcessorEditor* editor, const String& title) + : window (editor, title) + { + // external UI calls + run = doRun; + show = doShow; + hide = doHide; + } + + ~JuceLv2ExternalUIWrapper() + { + if (window.isOnDesktop()) + window.removeFromDesktop(); + } + + void close() + { + window.closeButtonPressed(); + } + + bool isClosed() + { + return window.isClosed(); + } + + void reset(const String& title) + { + window.reset(); + window.setName(title); + } + + void repaint() + { + window.repaint(); + } + + Point getScreenPosition() + { + if (window.isClosed()) + return window.getLastPos(); + else + return window.getScreenPosition(); + } + + void setScreenPos (int x, int y) + { + if (! window.isClosed()) + window.setTopLeftPosition(x, y); + } + + //============================================================================== + static void doRun (LV2_External_UI_Widget* _this_) + { + const MessageManagerLock mmLock; + JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; + + if (! self->isClosed()) + self->window.repaint(); + } + + static void doShow (LV2_External_UI_Widget* _this_) + { + const MessageManagerLock mmLock; + JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; + + if (! self->isClosed()) + { + if (! self->window.isOnDesktop()) + self->window.addToDesktop(); + + self->window.restoreLastPos(); + self->window.setVisible(true); + } + } + + static void doHide (LV2_External_UI_Widget* _this_) + { + const MessageManagerLock mmLock; + JuceLv2ExternalUIWrapper* self = (JuceLv2ExternalUIWrapper*) _this_; + + if (! self->isClosed()) + { + self->window.saveLastPos(); + self->window.setVisible(false); + } + } + +private: + JuceLv2ExternalUIWindow window; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ExternalUIWrapper); +}; + +//============================================================================== +/** + Juce LV2 Parent UI container, listens for resize events and passes them to ui-resize +*/ +class JuceLv2ParentContainer : public Component +{ +public: + JuceLv2ParentContainer (AudioProcessorEditor* editor, const LV2UI_Resize* uiResize_) + : uiResize(uiResize_) + { + setOpaque (true); + editor->setOpaque (true); + setBounds (editor->getBounds()); + + editor->setTopLeftPosition (0, 0); + addAndMakeVisible (editor); + } + + ~JuceLv2ParentContainer() + { + } + + void paint (Graphics&) {} + void paintOverChildren (Graphics&) {} + + void childBoundsChanged (Component* child) + { + const int cw = child->getWidth(); + const int ch = child->getHeight(); + +#if JUCE_LINUX + XResizeWindow (display.display, (Window) getWindowHandle(), cw, ch); +#else + setSize (cw, ch); +#endif + + if (uiResize != nullptr) + uiResize->ui_resize (uiResize->handle, cw, ch); + } + + void reset (const LV2UI_Resize* uiResize_) + { + uiResize = uiResize_; + + if (uiResize != nullptr) + uiResize->ui_resize (uiResize->handle, getWidth(), getHeight()); + } + +private: + //============================================================================== + const LV2UI_Resize* uiResize; +#if JUCE_LINUX + ScopedXDisplay display; +#endif + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2ParentContainer); +}; + +//============================================================================== +/** + Juce LV2 UI handle +*/ +class JuceLv2UIWrapper : public AudioProcessorListener, + public Timer +{ +public: + JuceLv2UIWrapper (AudioProcessor* filter_, LV2UI_Write_Function writeFunction_, LV2UI_Controller controller_, + LV2UI_Widget* widget, const LV2_Feature* const* features, bool isExternal_) + : filter (filter_), + writeFunction (writeFunction_), + controller (controller_), + isExternal (isExternal_), + controlPortOffset (0), + lastProgramCount (0), + uiTouch (nullptr), + programsHost (nullptr), + externalUIHost (nullptr), + lastExternalUIPos (-1, -1), + uiResize (nullptr) + { + jassert (filter != nullptr); + + filter->addListener(this); + + if (filter->hasEditor()) + { + editor = filter->createEditorIfNeeded(); + + if (editor == nullptr) + { + *widget = nullptr; + return; + } + } + + for (int i = 0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_UI__touch) == 0) + uiTouch = (const LV2UI_Touch*)features[i]->data; + + else if (strcmp(features[i]->URI, LV2_PROGRAMS__Host) == 0) + programsHost = (const LV2_Programs_Host*)features[i]->data; + } + + if (isExternal) + { + resetExternalUI (features); + + if (externalUIHost != nullptr) + { + String title (filter->getName()); + + if (externalUIHost->plugin_human_id != nullptr) + title = externalUIHost->plugin_human_id; + + externalUI = new JuceLv2ExternalUIWrapper (editor, title); + *widget = externalUI; + startTimer (100); + } + else + { + *widget = nullptr; + } + } + else + { + resetParentUI (features); + + if (parentContainer != nullptr) + *widget = parentContainer->getWindowHandle(); + else + *widget = nullptr; + } + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + controlPortOffset += 1; +#endif +#if JucePlugin_ProducesMidiOutput + controlPortOffset += 1; +#endif + controlPortOffset += 1; // freewheel +#if JucePlugin_WantsLV2Latency + controlPortOffset += 1; +#endif + controlPortOffset += JucePlugin_MaxNumInputChannels; + controlPortOffset += JucePlugin_MaxNumOutputChannels; + + lastProgramCount = filter->getNumPrograms(); + } + + ~JuceLv2UIWrapper() + { + PopupMenu::dismissAllActiveMenus(); + + filter->removeListener(this); + + parentContainer = nullptr; + externalUI = nullptr; + externalUIHost = nullptr; + + if (editor != nullptr) + { + filter->editorBeingDeleted (editor); + editor = nullptr; + } + } + + //============================================================================== + // LV2 core calls + + void lv2Cleanup() + { + const MessageManagerLock mmLock; + + if (isExternal) + { + if (isTimerRunning()) + stopTimer(); + + externalUIHost = nullptr; + + if (externalUI != nullptr) + { + lastExternalUIPos = externalUI->getScreenPosition(); + externalUI->close(); + } + } + else + { + if (parentContainer) + { + parentContainer->setVisible (false); + if (parentContainer->isOnDesktop()) + parentContainer->removeFromDesktop(); + } + } + } + + //============================================================================== + // Juce calls + + void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) + { + if (writeFunction != nullptr && controller != nullptr) + writeFunction (controller, index + controlPortOffset, sizeof (float), 0, &newValue); + } + + void audioProcessorChanged (AudioProcessor*) + { + if (filter != nullptr && programsHost != nullptr) + { + if (filter->getNumPrograms() != lastProgramCount) + { + programsHost->program_changed (programsHost->handle, -1); + lastProgramCount = filter->getNumPrograms(); + } + else + programsHost->program_changed (programsHost->handle, filter->getCurrentProgram()); + } + } + + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int parameterIndex) + { + if (uiTouch != nullptr) + uiTouch->touch (uiTouch->handle, parameterIndex + controlPortOffset, true); + } + + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int parameterIndex) + { + if (uiTouch != nullptr) + uiTouch->touch (uiTouch->handle, parameterIndex + controlPortOffset, false); + } + + void timerCallback() + { + if (externalUI != nullptr && externalUI->isClosed()) + { + if (externalUIHost != nullptr) + externalUIHost->ui_closed (controller); + + if (isTimerRunning()) + stopTimer(); + } + } + + //============================================================================== + void resetIfNeeded (LV2UI_Write_Function writeFunction_, LV2UI_Controller controller_, LV2UI_Widget* widget, + const LV2_Feature* const* features) + { + writeFunction = writeFunction_; + controller = controller_; + uiTouch = nullptr; + programsHost = nullptr; + + for (int i = 0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_UI__touch) == 0) + uiTouch = (const LV2UI_Touch*)features[i]->data; + + else if (strcmp(features[i]->URI, LV2_PROGRAMS__Host) == 0) + programsHost = (const LV2_Programs_Host*)features[i]->data; + } + + if (isExternal) + { + resetExternalUI (features); + *widget = externalUI; + } + else + { + resetParentUI (features); + *widget = parentContainer->getWindowHandle(); + } + } + + void repaint() + { + const MessageManagerLock mmLock; + + if (editor != nullptr) + editor->repaint(); + + if (parentContainer != nullptr) + parentContainer->repaint(); + + if (externalUI != nullptr) + externalUI->repaint(); + } + +private: + AudioProcessor* const filter; + ScopedPointer editor; + + LV2UI_Write_Function writeFunction; + LV2UI_Controller controller; + const bool isExternal; + + uint32 controlPortOffset; + int lastProgramCount; + + const LV2UI_Touch* uiTouch; + const LV2_Programs_Host* programsHost; + + ScopedPointer externalUI; + const LV2_External_UI_Host* externalUIHost; + Point lastExternalUIPos; + + ScopedPointer parentContainer; + const LV2UI_Resize* uiResize; + +#if JUCE_LINUX + ScopedXDisplay display; +#endif + + //============================================================================== + void resetExternalUI (const LV2_Feature* const* features) + { + externalUIHost = nullptr; + + for (int i = 0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_EXTERNAL_UI__Host) == 0) + { + externalUIHost = (const LV2_External_UI_Host*)features[i]->data; + break; + } + } + + if (externalUI != nullptr) + { + String title(filter->getName()); + + if (externalUIHost->plugin_human_id != nullptr) + title = externalUIHost->plugin_human_id; + + if (lastExternalUIPos.getX() != -1 && lastExternalUIPos.getY() != -1) + externalUI->setScreenPos(lastExternalUIPos.getX(), lastExternalUIPos.getY()); + + externalUI->reset(title); + startTimer (100); + } + } + + void resetParentUI (const LV2_Feature* const* features) + { + void* parent = nullptr; + uiResize = nullptr; + + for (int i = 0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_UI__parent) == 0) + parent = features[i]->data; + + else if (strcmp(features[i]->URI, LV2_UI__resize) == 0) + uiResize = (const LV2UI_Resize*)features[i]->data; + } + + if (parent != nullptr) + { + if (parentContainer == nullptr) + parentContainer = new JuceLv2ParentContainer (editor, uiResize); + + parentContainer->setVisible (false); + + if (parentContainer->isOnDesktop()) + parentContainer->removeFromDesktop(); + + parentContainer->addToDesktop (0, parent); + +#if JUCE_LINUX + Window hostWindow = (Window) parent; + Window editorWnd = (Window) parentContainer->getWindowHandle(); + XReparentWindow (display.display, editorWnd, hostWindow, 0, 0); +#endif + + parentContainer->reset (uiResize); + parentContainer->setVisible (true); + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2UIWrapper) +}; + +#endif /* JUCE_AUDIOPROCESSOR_NO_GUI */ + +//============================================================================== +/** + Juce LV2 handle +*/ +class JuceLv2Wrapper : public AudioPlayHead +{ +public: + //============================================================================== + JuceLv2Wrapper (double sampleRate_, const LV2_Feature* const* features) + : numInChans (JucePlugin_MaxNumInputChannels), + numOutChans (JucePlugin_MaxNumOutputChannels), + bufferSize (2048), + sampleRate (sampleRate_), + uridMap (nullptr), + uridAtomBlank (0), + uridAtomObject (0), + uridAtomDouble (0), + uridAtomFloat (0), + uridAtomInt (0), + uridAtomLong (0), + uridAtomSequence (0), + uridMidiEvent (0), + uridTimePos (0), + uridTimeBar (0), + uridTimeBarBeat (0), + uridTimeBeatsPerBar (0), + uridTimeBeatsPerMinute (0), + uridTimeBeatUnit (0), + uridTimeFrame (0), + uridTimeSpeed (0), + usingNominalBlockLength (false) + { + { + const MessageManagerLock mmLock; + filter = createPluginFilterOfType (AudioProcessor::wrapperType_LV2); + } + jassert (filter != nullptr); + + filter->setPlayConfigDetails (numInChans, numOutChans, 0, 0); + filter->setPlayHead (this); + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + portEventsIn = nullptr; +#endif +#if JucePlugin_ProducesMidiOutput + portMidiOut = nullptr; +#endif + + portFreewheel = nullptr; + +#if JucePlugin_WantsLV2Latency + portLatency = nullptr; +#endif + + for (int i=0; i < numInChans; ++i) + portAudioIns[i] = nullptr; + for (int i=0; i < numOutChans; ++i) + portAudioOuts[i] = nullptr; + + portControls.insertMultiple (0, nullptr, filter->getNumParameters()); + + for (int i=0; i < filter->getNumParameters(); ++i) + lastControlValues.add (filter->getParameter(i)); + + curPosInfo.resetToDefault(); + + // we need URID_Map first + for (int i=0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_URID__map) == 0) + { + uridMap = (const LV2_URID_Map*)features[i]->data; + break; + } + } + + // we require uridMap to work properly (it's set as required feature) + jassert (uridMap != nullptr); + + if (uridMap != nullptr) + { + uridAtomBlank = uridMap->map(uridMap->handle, LV2_ATOM__Blank); + uridAtomObject = uridMap->map(uridMap->handle, LV2_ATOM__Object); + uridAtomDouble = uridMap->map(uridMap->handle, LV2_ATOM__Double); + uridAtomFloat = uridMap->map(uridMap->handle, LV2_ATOM__Float); + uridAtomInt = uridMap->map(uridMap->handle, LV2_ATOM__Int); + uridAtomLong = uridMap->map(uridMap->handle, LV2_ATOM__Long); + uridAtomSequence = uridMap->map(uridMap->handle, LV2_ATOM__Sequence); + uridMidiEvent = uridMap->map(uridMap->handle, LV2_MIDI__MidiEvent); + uridTimePos = uridMap->map(uridMap->handle, LV2_TIME__Position); + uridTimeBar = uridMap->map(uridMap->handle, LV2_TIME__bar); + uridTimeBarBeat = uridMap->map(uridMap->handle, LV2_TIME__barBeat); + uridTimeBeatsPerBar = uridMap->map(uridMap->handle, LV2_TIME__beatsPerBar); + uridTimeBeatsPerMinute = uridMap->map(uridMap->handle, LV2_TIME__beatsPerMinute); + uridTimeBeatUnit = uridMap->map(uridMap->handle, LV2_TIME__beatUnit); + uridTimeFrame = uridMap->map(uridMap->handle, LV2_TIME__frame); + uridTimeSpeed = uridMap->map(uridMap->handle, LV2_TIME__speed); + + for (int i=0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_OPTIONS__options) == 0) + { + const LV2_Options_Option* options = (const LV2_Options_Option*)features[i]->data; + + for (int j=0; options[j].key != 0; ++j) + { + if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength)) + { + if (options[j].type == uridAtomInt) + { + bufferSize = *(int*)options[j].value; + usingNominalBlockLength = true; + } + else + { + std::cerr << "Host provides nominalBlockLength but has wrong value type" << std::endl; + } + break; + } + + if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength)) + { + if (options[j].type == uridAtomInt) + bufferSize = *(int*)options[j].value; + else + std::cerr << "Host provides maxBlockLength but has wrong value type" << std::endl; + + // no break, continue in case host supports nominalBlockLength + } + } + break; + } + } + } + + progDesc.bank = 0; + progDesc.program = 0; + progDesc.name = nullptr; + } + + ~JuceLv2Wrapper () + { + const MessageManagerLock mmLock; + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + ui = nullptr; +#endif + filter = nullptr; + + if (progDesc.name != nullptr) + free((void*)progDesc.name); + + portControls.clear(); + lastControlValues.clear(); + } + + //============================================================================== + // LV2 core calls + + void lv2ConnectPort (uint32 portId, void* dataLocation) + { + uint32 index = 0; + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + if (portId == index++) + { + portEventsIn = (LV2_Atom_Sequence*)dataLocation; + return; + } +#endif + +#if JucePlugin_ProducesMidiOutput + if (portId == index++) + { + portMidiOut = (LV2_Atom_Sequence*)dataLocation; + return; + } +#endif + + if (portId == index++) + { + portFreewheel = (float*)dataLocation; + return; + } + +#if JucePlugin_WantsLV2Latency + if (portId == index++) + { + portLatency = (float*)dataLocation; + return; + } +#endif + + for (int i=0; i < numInChans; ++i) + { + if (portId == index++) + { + portAudioIns[i] = (float*)dataLocation; + return; + } + } + + for (int i=0; i < numOutChans; ++i) + { + if (portId == index++) + { + portAudioOuts[i] = (float*)dataLocation; + return; + } + } + + for (int i=0; i < filter->getNumParameters(); ++i) + { + if (portId == index++) + { + portControls.set(i, (float*)dataLocation); + return; + } + } + } + + void lv2Activate() + { + jassert (filter != nullptr); + + filter->prepareToPlay (sampleRate, bufferSize); + filter->setPlayConfigDetails (numInChans, numOutChans, sampleRate, bufferSize); + + channels.calloc (numInChans + numOutChans); + +#if (JucePlugin_WantsMidiInput || JucePlugin_ProducesMidiOutput) + midiEvents.ensureSize (2048); + midiEvents.clear(); +#endif + } + + void lv2Deactivate() + { + jassert (filter != nullptr); + + filter->releaseResources(); + + channels.free(); + } + + void lv2Run (uint32 sampleCount) + { + jassert (filter != nullptr); + +#if JucePlugin_WantsLV2Latency + if (portLatency != nullptr) + *portLatency = filter->getLatencySamples(); +#endif + + if (portFreewheel != nullptr) + filter->setNonRealtime (*portFreewheel >= 0.5f); + + if (sampleCount == 0) + { + /** + LV2 pre-roll + Hosts might use this to force plugins to update its output control ports. + (plugins can only access port locations during run) */ + return; + } + + // Check for updated parameters + { + float curValue; + + for (int i = 0; i < portControls.size(); ++i) + { + if (portControls[i] != nullptr) + { + curValue = *portControls[i]; + + if (lastControlValues[i] != curValue) + { + filter->setParameter (i, curValue); + lastControlValues.setUnchecked (i, curValue); + } + } + } + } + + { + const ScopedLock sl (filter->getCallbackLock()); + + if (filter->isSuspended() && false) + { + for (int i = 0; i < numOutChans; ++i) + zeromem (portAudioOuts[i], sizeof (float) * sampleCount); + } + else + { + int i; + for (i = 0; i < numOutChans; ++i) + { + channels[i] = portAudioOuts[i]; + + if (i < numInChans && portAudioIns[i] != portAudioOuts[i]) + FloatVectorOperations::copy (portAudioOuts [i], portAudioIns[i], sampleCount); + } + + for (; i < numInChans; ++i) + channels [i] = portAudioIns[i]; + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + if (portEventsIn != nullptr) + { + midiEvents.clear(); + + LV2_ATOM_SEQUENCE_FOREACH(portEventsIn, iter) + { + const LV2_Atom_Event* event = (const LV2_Atom_Event*)iter; + + if (event == nullptr) + continue; + if (event->time.frames >= sampleCount) + break; + + #if JucePlugin_WantsMidiInput + if (event->body.type == uridMidiEvent) + { + const uint8* data = (const uint8*)(event + 1); + midiEvents.addEvent(data, event->body.size, event->time.frames); + continue; + } + #endif + #if JucePlugin_WantsLV2TimePos + if (event->body.type == uridAtomBlank || event->body.type == uridAtomObject) + { + const LV2_Atom_Object* obj = (LV2_Atom_Object*)&event->body; + + if (obj->body.otype != uridTimePos) + continue; + + LV2_Atom* bar = nullptr; + LV2_Atom* barBeat = nullptr; + LV2_Atom* beatUnit = nullptr; + LV2_Atom* beatsPerBar = nullptr; + LV2_Atom* beatsPerMinute = nullptr; + LV2_Atom* frame = nullptr; + LV2_Atom* speed = nullptr; + + lv2_atom_object_get (obj, + uridTimeBar, &bar, + uridTimeBarBeat, &barBeat, + uridTimeBeatUnit, &beatUnit, + uridTimeBeatsPerBar, &beatsPerBar, + uridTimeBeatsPerMinute, &beatsPerMinute, + uridTimeFrame, &frame, + uridTimeSpeed, &speed, + nullptr); + + // need to handle this first as other values depend on it + if (speed != nullptr) + { + /**/ if (speed->type == uridAtomDouble) + lastPositionData.speed = ((LV2_Atom_Double*)speed)->body; + else if (speed->type == uridAtomFloat) + lastPositionData.speed = ((LV2_Atom_Float*)speed)->body; + else if (speed->type == uridAtomInt) + lastPositionData.speed = ((LV2_Atom_Int*)speed)->body; + else if (speed->type == uridAtomLong) + lastPositionData.speed = ((LV2_Atom_Long*)speed)->body; + + curPosInfo.isPlaying = lastPositionData.speed != 0.0; + } + + if (bar != nullptr) + { + /**/ if (bar->type == uridAtomDouble) + lastPositionData.bar = ((LV2_Atom_Double*)bar)->body; + else if (bar->type == uridAtomFloat) + lastPositionData.bar = ((LV2_Atom_Float*)bar)->body; + else if (bar->type == uridAtomInt) + lastPositionData.bar = ((LV2_Atom_Int*)bar)->body; + else if (bar->type == uridAtomLong) + lastPositionData.bar = ((LV2_Atom_Long*)bar)->body; + } + + if (barBeat != nullptr) + { + /**/ if (barBeat->type == uridAtomDouble) + lastPositionData.barBeat = ((LV2_Atom_Double*)barBeat)->body; + else if (barBeat->type == uridAtomFloat) + lastPositionData.barBeat = ((LV2_Atom_Float*)barBeat)->body; + else if (barBeat->type == uridAtomInt) + lastPositionData.barBeat = ((LV2_Atom_Int*)barBeat)->body; + else if (barBeat->type == uridAtomLong) + lastPositionData.barBeat = ((LV2_Atom_Long*)barBeat)->body; + } + + if (beatUnit != nullptr) + { + /**/ if (beatUnit->type == uridAtomDouble) + lastPositionData.beatUnit = ((LV2_Atom_Double*)beatUnit)->body; + else if (beatUnit->type == uridAtomFloat) + lastPositionData.beatUnit = ((LV2_Atom_Float*)beatUnit)->body; + else if (beatUnit->type == uridAtomInt) + lastPositionData.beatUnit = ((LV2_Atom_Int*)beatUnit)->body; + else if (beatUnit->type == uridAtomLong) + lastPositionData.beatUnit = ((LV2_Atom_Long*)beatUnit)->body; + + if (lastPositionData.beatUnit > 0) + curPosInfo.timeSigDenominator = lastPositionData.beatUnit; + } + + if (beatsPerBar != nullptr) + { + /**/ if (beatsPerBar->type == uridAtomDouble) + lastPositionData.beatsPerBar = ((LV2_Atom_Double*)beatsPerBar)->body; + else if (beatsPerBar->type == uridAtomFloat) + lastPositionData.beatsPerBar = ((LV2_Atom_Float*)beatsPerBar)->body; + else if (beatsPerBar->type == uridAtomInt) + lastPositionData.beatsPerBar = ((LV2_Atom_Int*)beatsPerBar)->body; + else if (beatsPerBar->type == uridAtomLong) + lastPositionData.beatsPerBar = ((LV2_Atom_Long*)beatsPerBar)->body; + + if (lastPositionData.beatsPerBar > 0.0f) + curPosInfo.timeSigNumerator = lastPositionData.beatsPerBar; + } + + if (beatsPerMinute != nullptr) + { + /**/ if (beatsPerMinute->type == uridAtomDouble) + lastPositionData.beatsPerMinute = ((LV2_Atom_Double*)beatsPerMinute)->body; + else if (beatsPerMinute->type == uridAtomFloat) + lastPositionData.beatsPerMinute = ((LV2_Atom_Float*)beatsPerMinute)->body; + else if (beatsPerMinute->type == uridAtomInt) + lastPositionData.beatsPerMinute = ((LV2_Atom_Int*)beatsPerMinute)->body; + else if (beatsPerMinute->type == uridAtomLong) + lastPositionData.beatsPerMinute = ((LV2_Atom_Long*)beatsPerMinute)->body; + + if (lastPositionData.beatsPerMinute > 0.0f) + { + curPosInfo.bpm = lastPositionData.beatsPerMinute; + + if (lastPositionData.speed != 0) + curPosInfo.bpm *= std::abs(lastPositionData.speed); + } + } + + if (frame != nullptr) + { + /**/ if (frame->type == uridAtomDouble) + lastPositionData.frame = ((LV2_Atom_Double*)frame)->body; + else if (frame->type == uridAtomFloat) + lastPositionData.frame = ((LV2_Atom_Float*)frame)->body; + else if (frame->type == uridAtomInt) + lastPositionData.frame = ((LV2_Atom_Int*)frame)->body; + else if (frame->type == uridAtomLong) + lastPositionData.frame = ((LV2_Atom_Long*)frame)->body; + + if (lastPositionData.frame >= 0) + { + curPosInfo.timeInSamples = lastPositionData.frame; + curPosInfo.timeInSeconds = double(curPosInfo.timeInSamples)/sampleRate; + } + } + + if (lastPositionData.bar >= 0 && lastPositionData.beatsPerBar > 0.0f) + { + curPosInfo.ppqPositionOfLastBarStart = lastPositionData.bar * lastPositionData.beatsPerBar; + + if (lastPositionData.barBeat >= 0.0f) + curPosInfo.ppqPosition = curPosInfo.ppqPositionOfLastBarStart + lastPositionData.barBeat; + } + + lastPositionData.extraValid = (lastPositionData.beatsPerMinute > 0.0 && + lastPositionData.beatUnit > 0 && + lastPositionData.beatsPerBar > 0.0f); + } + #endif + } + } +#endif + { + AudioSampleBuffer chans (channels, jmax (numInChans, numOutChans), sampleCount); + filter->processBlock (chans, midiEvents); + } + } + } + +#if JucePlugin_WantsLV2TimePos + // update timePos for next callback + if (lastPositionData.speed != 0.0) + { + if (lastPositionData.speed > 0.0) + { + // playing forwards + lastPositionData.frame += sampleCount; + } + else + { + // playing backwards + lastPositionData.frame -= sampleCount; + + if (lastPositionData.frame < 0) + lastPositionData.frame = 0; + } + + curPosInfo.timeInSamples = lastPositionData.frame; + curPosInfo.timeInSeconds = double(curPosInfo.timeInSamples)/sampleRate; + + if (lastPositionData.extraValid) + { + const double beatsPerMinute = lastPositionData.beatsPerMinute * lastPositionData.speed; + const double framesPerBeat = 60.0 * sampleRate / beatsPerMinute; + const double addedBarBeats = double(sampleCount) / framesPerBeat; + + if (lastPositionData.bar >= 0 && lastPositionData.barBeat >= 0.0f) + { + lastPositionData.bar += std::floor((lastPositionData.barBeat+addedBarBeats)/ + lastPositionData.beatsPerBar); + lastPositionData.barBeat = std::fmod(lastPositionData.barBeat+addedBarBeats, + lastPositionData.beatsPerBar); + + if (lastPositionData.bar < 0) + lastPositionData.bar = 0; + + curPosInfo.ppqPositionOfLastBarStart = lastPositionData.bar * lastPositionData.beatsPerBar; + curPosInfo.ppqPosition = curPosInfo.ppqPositionOfLastBarStart + lastPositionData.barBeat; + } + + curPosInfo.bpm = std::abs(beatsPerMinute); + } + } +#endif + +#if JucePlugin_ProducesMidiOutput + if (portMidiOut != nullptr) + { + const uint32_t capacity = portMidiOut->atom.size; + + portMidiOut->atom.size = sizeof(LV2_Atom_Sequence_Body); + portMidiOut->atom.type = uridAtomSequence; + portMidiOut->body.unit = 0; + portMidiOut->body.pad = 0; + + if (! midiEvents.isEmpty()) + { + const uint8* midiEventData; + int midiEventSize, midiEventPosition; + MidiBuffer::Iterator i (midiEvents); + + uint32_t size, offset = 0; + LV2_Atom_Event* aev; + + while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) + { + jassert (midiEventPosition >= 0 && midiEventPosition < (int)sampleCount); + + if (sizeof(LV2_Atom_Event) + midiEventSize > capacity - offset) + break; + + aev = (LV2_Atom_Event*)((char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, portMidiOut) + offset); + aev->time.frames = midiEventPosition; + aev->body.type = uridMidiEvent; + aev->body.size = midiEventSize; + memcpy(LV2_ATOM_BODY(&aev->body), midiEventData, midiEventSize); + + size = lv2_atom_pad_size(sizeof(LV2_Atom_Event) + midiEventSize); + offset += size; + portMidiOut->atom.size += size; + } + + midiEvents.clear(); + } + } else +#endif + if (! midiEvents.isEmpty()) + { + midiEvents.clear(); + } + } + + //============================================================================== + // LV2 extended calls + + uint32_t lv2GetOptions (LV2_Options_Option* options) + { + // currently unused + ignoreUnused(options); + + return LV2_OPTIONS_SUCCESS; + } + + uint32_t lv2SetOptions (const LV2_Options_Option* options) + { + for (int j=0; options[j].key != 0; ++j) + { + if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__nominalBlockLength)) + { + if (options[j].type == uridAtomInt) + bufferSize = *(int*)options[j].value; + else + std::cerr << "Host changed nominalBlockLength but with wrong value type" << std::endl; + } + else if (options[j].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength) && ! usingNominalBlockLength) + { + if (options[j].type == uridAtomInt) + bufferSize = *(int*)options[j].value; + else + std::cerr << "Host changed maxBlockLength but with wrong value type" << std::endl; + } + else if (options[j].key == uridMap->map(uridMap->handle, LV2_CORE__sampleRate)) + { + if (options[j].type == uridAtomDouble) + sampleRate = *(double*)options[j].value; + else + std::cerr << "Host changed sampleRate but with wrong value type" << std::endl; + } + } + + return LV2_OPTIONS_SUCCESS; + } + + const LV2_Program_Descriptor* lv2GetProgram (uint32_t index) + { + jassert (filter != nullptr); + + if (progDesc.name != nullptr) + { + free((void*)progDesc.name); + progDesc.name = nullptr; + } + + if ((int)index < filter->getNumPrograms()) + { + progDesc.bank = index / 128; + progDesc.program = index % 128; + progDesc.name = strdup(filter->getProgramName(index).toUTF8()); + return &progDesc; + } + + return nullptr; + } + + void lv2SelectProgram (uint32_t bank, uint32_t program) + { + jassert (filter != nullptr); + + int realProgram = bank * 128 + program; + + if (realProgram < filter->getNumPrograms()) + { + filter->setCurrentProgram(realProgram); + + // update input control ports now + for (int i = 0; i < portControls.size(); ++i) + { + float value = filter->getParameter(i); + + if (portControls[i] != nullptr) + *portControls[i] = value; + + lastControlValues.set(i, value); + } + } + } + + LV2_State_Status lv2SaveState (LV2_State_Store_Function store, LV2_State_Handle stateHandle) + { + jassert (filter != nullptr); + +#if JucePlugin_WantsLV2StateString + String stateData(filter->getStateInformationString().replace("\r\n","\n")); + CharPointer_UTF8 charData(stateData.toUTF8()); + + store (stateHandle, + uridMap->map(uridMap->handle, JUCE_LV2_STATE_STRING_URI), + charData.getAddress(), + charData.sizeInBytes(), + uridMap->map(uridMap->handle, LV2_ATOM__String), + LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); +#else + MemoryBlock chunkMemory; + filter->getCurrentProgramStateInformation (chunkMemory); + + store (stateHandle, + uridMap->map(uridMap->handle, JUCE_LV2_STATE_BINARY_URI), + chunkMemory.getData(), + chunkMemory.getSize(), + uridMap->map(uridMap->handle, LV2_ATOM__Chunk), + LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); +#endif + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status lv2RestoreState (LV2_State_Retrieve_Function retrieve, LV2_State_Handle stateHandle, uint32_t flags) + { + jassert (filter != nullptr); + + size_t size = 0; + uint32 type = 0; + const void* data = retrieve (stateHandle, +#if JucePlugin_WantsLV2StateString + uridMap->map(uridMap->handle, JUCE_LV2_STATE_STRING_URI), +#else + uridMap->map(uridMap->handle, JUCE_LV2_STATE_BINARY_URI), +#endif + &size, &type, &flags); + + if (data == nullptr || size == 0 || type == 0) + return LV2_STATE_ERR_UNKNOWN; + +#if JucePlugin_WantsLV2StateString + if (type == uridMap->map (uridMap->handle, LV2_ATOM__String)) + { + String stateData (CharPointer_UTF8(static_cast(data))); + filter->setStateInformationString (stateData); + + #if ! JUCE_AUDIOPROCESSOR_NO_GUI + if (ui != nullptr) + ui->repaint(); + #endif + + return LV2_STATE_SUCCESS; + } +#else + if (type == uridMap->map (uridMap->handle, LV2_ATOM__Chunk)) + { + filter->setCurrentProgramStateInformation (data, size); + + #if ! JUCE_AUDIOPROCESSOR_NO_GUI + if (ui != nullptr) + ui->repaint(); + #endif + + return LV2_STATE_SUCCESS; + } +#endif + + return LV2_STATE_ERR_BAD_TYPE; + } + + //============================================================================== + // Juce calls + + bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) + { +#if JucePlugin_WantsLV2TimePos + info = curPosInfo; + return true; +#else + ignoreUnused(info); + return false; +#endif + } + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + //============================================================================== + JuceLv2UIWrapper* getUI (LV2UI_Write_Function writeFunction, LV2UI_Controller controller, LV2UI_Widget* widget, + const LV2_Feature* const* features, bool isExternal) + { + const MessageManagerLock mmLock; + + if (ui != nullptr) + ui->resetIfNeeded (writeFunction, controller, widget, features); + else + ui = new JuceLv2UIWrapper (filter, writeFunction, controller, widget, features, isExternal); + + return ui; + } +#endif + +private: +#if JUCE_LINUX + SharedResourcePointer msgThread; +#else + SharedResourcePointer sharedJuceGUI; +#endif + + ScopedPointer filter; +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + ScopedPointer ui; +#endif + HeapBlock channels; + MidiBuffer midiEvents; + int numInChans, numOutChans; + +#if (JucePlugin_WantsMidiInput || JucePlugin_WantsLV2TimePos) + LV2_Atom_Sequence* portEventsIn; +#endif +#if JucePlugin_ProducesMidiOutput + LV2_Atom_Sequence* portMidiOut; +#endif + float* portFreewheel; +#if JucePlugin_WantsLV2Latency + float* portLatency; +#endif + float* portAudioIns[JucePlugin_MaxNumInputChannels]; + float* portAudioOuts[JucePlugin_MaxNumOutputChannels]; + Array portControls; + + uint32 bufferSize; + double sampleRate; + Array lastControlValues; + AudioPlayHead::CurrentPositionInfo curPosInfo; + + struct Lv2PositionData { + int64_t bar; + float barBeat; + uint32_t beatUnit; + float beatsPerBar; + float beatsPerMinute; + int64_t frame; + double speed; + bool extraValid; + + Lv2PositionData() + : bar(-1), + barBeat(-1.0f), + beatUnit(0), + beatsPerBar(0.0f), + beatsPerMinute(0.0f), + frame(-1), + speed(0.0), + extraValid(false) {} + }; + Lv2PositionData lastPositionData; + + const LV2_URID_Map* uridMap; + LV2_URID uridAtomBlank; + LV2_URID uridAtomObject; + LV2_URID uridAtomDouble; + LV2_URID uridAtomFloat; + LV2_URID uridAtomInt; + LV2_URID uridAtomLong; + LV2_URID uridAtomSequence; + LV2_URID uridMidiEvent; + LV2_URID uridTimePos; + LV2_URID uridTimeBar; + LV2_URID uridTimeBarBeat; + LV2_URID uridTimeBeatsPerBar; // timeSigNumerator + LV2_URID uridTimeBeatsPerMinute; // bpm + LV2_URID uridTimeBeatUnit; // timeSigDenominator + LV2_URID uridTimeFrame; // timeInSamples + LV2_URID uridTimeSpeed; + + bool usingNominalBlockLength; // if false use maxBlockLength + + LV2_Program_Descriptor progDesc; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLv2Wrapper) +}; + +//============================================================================== +// LV2 descriptor functions + +static LV2_Handle juceLV2_Instantiate (const LV2_Descriptor*, double sampleRate, const char*, const LV2_Feature* const* features) +{ + return new JuceLv2Wrapper (sampleRate, features); +} + +#define handlePtr ((JuceLv2Wrapper*)handle) + +static void juceLV2_ConnectPort (LV2_Handle handle, uint32 port, void* dataLocation) +{ + handlePtr->lv2ConnectPort (port, dataLocation); +} + +static void juceLV2_Activate (LV2_Handle handle) +{ + handlePtr->lv2Activate(); +} + +static void juceLV2_Run( LV2_Handle handle, uint32 sampleCount) +{ + handlePtr->lv2Run (sampleCount); +} + +static void juceLV2_Deactivate (LV2_Handle handle) +{ + handlePtr->lv2Deactivate(); +} + +static void juceLV2_Cleanup (LV2_Handle handle) +{ + delete handlePtr; +} + +//============================================================================== +// LV2 extended functions + +static uint32_t juceLV2_getOptions (LV2_Handle handle, LV2_Options_Option* options) +{ + return handlePtr->lv2GetOptions(options); +} + +static uint32_t juceLV2_setOptions (LV2_Handle handle, const LV2_Options_Option* options) +{ + return handlePtr->lv2SetOptions(options); +} + +static const LV2_Program_Descriptor* juceLV2_getProgram (LV2_Handle handle, uint32_t index) +{ + return handlePtr->lv2GetProgram(index); +} + +static void juceLV2_selectProgram (LV2_Handle handle, uint32_t bank, uint32_t program) +{ + handlePtr->lv2SelectProgram(bank, program); +} + +static LV2_State_Status juceLV2_SaveState (LV2_Handle handle, LV2_State_Store_Function store, LV2_State_Handle stateHandle, + uint32_t, const LV2_Feature* const*) +{ + return handlePtr->lv2SaveState(store, stateHandle); +} + +static LV2_State_Status juceLV2_RestoreState (LV2_Handle handle, LV2_State_Retrieve_Function retrieve, LV2_State_Handle stateHandle, + uint32_t flags, const LV2_Feature* const*) +{ + return handlePtr->lv2RestoreState(retrieve, stateHandle, flags); +} + +#undef handlePtr + +static const void* juceLV2_ExtensionData (const char* uri) +{ + static const LV2_Options_Interface options = { juceLV2_getOptions, juceLV2_setOptions }; + static const LV2_Programs_Interface programs = { juceLV2_getProgram, juceLV2_selectProgram }; + static const LV2_State_Interface state = { juceLV2_SaveState, juceLV2_RestoreState }; + + if (strcmp(uri, LV2_OPTIONS__interface) == 0) + return &options; + if (strcmp(uri, LV2_PROGRAMS__Interface) == 0) + return &programs; + if (strcmp(uri, LV2_STATE__interface) == 0) + return &state; + + return nullptr; +} + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI +//============================================================================== +// LV2 UI descriptor functions + +static LV2UI_Handle juceLV2UI_Instantiate (LV2UI_Write_Function writeFunction, LV2UI_Controller controller, + LV2UI_Widget* widget, const LV2_Feature* const* features, bool isExternal) +{ + for (int i = 0; features[i] != nullptr; ++i) + { + if (strcmp(features[i]->URI, LV2_INSTANCE_ACCESS_URI) == 0 && features[i]->data != nullptr) + { + JuceLv2Wrapper* wrapper = (JuceLv2Wrapper*)features[i]->data; + return wrapper->getUI(writeFunction, controller, widget, features, isExternal); + } + } + + std::cerr << "Host does not support instance-access, cannot use UI" << std::endl; + return nullptr; +} + +static LV2UI_Handle juceLV2UI_InstantiateExternal (const LV2UI_Descriptor*, const char*, const char*, LV2UI_Write_Function writeFunction, + LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) +{ + return juceLV2UI_Instantiate(writeFunction, controller, widget, features, true); +} + +static LV2UI_Handle juceLV2UI_InstantiateParent (const LV2UI_Descriptor*, const char*, const char*, LV2UI_Write_Function writeFunction, + LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) +{ + return juceLV2UI_Instantiate(writeFunction, controller, widget, features, false); +} + +static void juceLV2UI_Cleanup (LV2UI_Handle handle) +{ + ((JuceLv2UIWrapper*)handle)->lv2Cleanup(); +} +#endif + +//============================================================================== +// static LV2 Descriptor objects + +static const LV2_Descriptor JuceLv2Plugin = { + strdup(getPluginURI().toRawUTF8()), + juceLV2_Instantiate, + juceLV2_ConnectPort, + juceLV2_Activate, + juceLV2_Run, + juceLV2_Deactivate, + juceLV2_Cleanup, + juceLV2_ExtensionData +}; + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI +static const LV2UI_Descriptor JuceLv2UI_External = { + strdup(String(getPluginURI() + "#ExternalUI").toRawUTF8()), + juceLV2UI_InstantiateExternal, + juceLV2UI_Cleanup, + nullptr, + nullptr +}; + +static const LV2UI_Descriptor JuceLv2UI_Parent = { + strdup(String(getPluginURI() + "#ParentUI").toRawUTF8()), + juceLV2UI_InstantiateParent, + juceLV2UI_Cleanup, + nullptr, + nullptr +}; +#endif + +static const struct DescriptorCleanup { + DescriptorCleanup() {} + ~DescriptorCleanup() + { + free((void*)JuceLv2Plugin.URI); +#if ! JUCE_AUDIOPROCESSOR_NO_GUI + free((void*)JuceLv2UI_External.URI); + free((void*)JuceLv2UI_Parent.URI); +#endif + } +} _descCleanup; + +#if JUCE_WINDOWS + #define JUCE_EXPORTED_FUNCTION extern "C" __declspec (dllexport) +#else + #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) +#endif + +//============================================================================== +// startup code.. + +JUCE_EXPORTED_FUNCTION void lv2_generate_ttl (const char* basename); +JUCE_EXPORTED_FUNCTION void lv2_generate_ttl (const char* basename) +{ + createLv2Files (basename); +} + +JUCE_EXPORTED_FUNCTION const LV2_Descriptor* lv2_descriptor (uint32 index); +JUCE_EXPORTED_FUNCTION const LV2_Descriptor* lv2_descriptor (uint32 index) +{ + return (index == 0) ? &JuceLv2Plugin : nullptr; +} + +#if ! JUCE_AUDIOPROCESSOR_NO_GUI +JUCE_EXPORTED_FUNCTION const LV2UI_Descriptor* lv2ui_descriptor (uint32 index); +JUCE_EXPORTED_FUNCTION const LV2UI_Descriptor* lv2ui_descriptor (uint32 index) +{ + switch (index) + { + case 0: + return &JuceLv2UI_External; + case 1: + return &JuceLv2UI_Parent; + default: + return nullptr; + } +} +#endif + +#endif diff --git a/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp b/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp new file mode 100644 index 00000000..dc507e12 --- /dev/null +++ b/extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp @@ -0,0 +1,27 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2017 - ROLI Ltd. + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 5 End-User License + Agreement and JUCE 5 Privacy Policy (both updated and effective as of the + 27th April 2017). + + End User License Agreement: www.juce.com/juce-5-licence + Privacy Policy: www.juce.com/juce-5-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +#include "LV2/juce_LV2_Wrapper.cpp" diff --git a/extra/juce_audio_processors/format_types/juce_VSTInterface.h b/extra/juce_audio_processors/format_types/juce_VSTInterface.h new file mode 100644 index 00000000..f531e638 --- /dev/null +++ b/extra/juce_audio_processors/format_types/juce_VSTInterface.h @@ -0,0 +1,813 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2017 - ROLI Ltd. + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 5 End-User License + Agreement and JUCE 5 Privacy Policy (both updated and effective as of the + 27th April 2017). + + End User License Agreement: www.juce.com/juce-5-licence + Privacy Policy: www.juce.com/juce-5-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +/* + Copyright © 2019 IOhannes m zmölnig + + Provide additional structs & enum-aliases, to allow compilation with JUCE-5.4.1 + + The names of the struct-members and enum-aliases have been derived by comparing + juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp of + both JUCE-5.3.2 and JUCE-5.4.1 + */ + +#define JUCE_VSTINTERFACE_H_INCLUDED + +using namespace juce; + +#if JUCE_MSVC + #define VSTINTERFACECALL __cdecl + #pragma pack(push) + #pragma pack(8) +#elif JUCE_MAC || JUCE_IOS + #define VSTINTERFACECALL + #if JUCE_64BIT + #pragma options align=power + #else + #pragma options align=mac68k + #endif +#else + #define VSTINTERFACECALL + #pragma pack(push, 8) +#endif + +#define VSTCALLBACK VSTINTERFACECALL + +const int32 juceVstInterfaceVersion = 2400; +#define kVstVersion 2400 +const int32 juceVstInterfaceIdentifier = 0x56737450; // The "magic" identifier in the SDK is 'VstP'. + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstEffectInterface +{ + int32 interfaceIdentifier; + pointer_sized_int (VSTINTERFACECALL* dispatchFunction) (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt); + void (VSTINTERFACECALL* processAudioFunction) (VstEffectInterface*, float** inputs, float** outputs, int32 numSamples); + void (VSTINTERFACECALL* setParameterValueFunction) (VstEffectInterface*, int32 parameterIndex, float value); + float (VSTINTERFACECALL* getParameterValueFunction) (VstEffectInterface*, int32 parameterIndex); + int32 numPrograms; + int32 numParameters; + int32 numInputChannels; + int32 numOutputChannels; + int32 flags; + pointer_sized_int hostSpace1; + pointer_sized_int hostSpace2; + int32 latency; + int32 deprecated1; + int32 deprecated2; + float deprecated3; + void* effectPointer; + void* userPointer; + int32 plugInIdentifier; + int32 plugInVersion; + void (VSTINTERFACECALL* processAudioInplaceFunction) (VstEffectInterface*, float** inputs, float** outputs, int32 numSamples); + void (VSTINTERFACECALL* processDoubleAudioInplaceFunction) (VstEffectInterface*, double** inputs, double** outputs, int32 numSamples); + char emptySpace[56]; +}; + +struct AEffect; +typedef pointer_sized_int (VSTINTERFACECALL*AEffectDispatcherProc)(AEffect*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt); +typedef void (VSTINTERFACECALL*AEffectProcessProc)(AEffect*, float** inputs, float** outputs, int32 numSamples); +typedef void (VSTINTERFACECALL*AEffectProcessDoubleProc)(AEffect*, double** inputs, double** outputs, int32 numSamples); +typedef float (VSTINTERFACECALL*AEffectGetParameterProc)(AEffect*, int32 parameterIndex); +typedef void (VSTINTERFACECALL*AEffectSetParameterProc)(AEffect*, int32 parameterIndex, float value); + +struct AEffect +{ + int32 magic; + AEffectDispatcherProc dispatcher; + AEffectProcessProc process; + AEffectSetParameterProc setParameter; + AEffectGetParameterProc getParameter; + int32 numPrograms; + int32 numParams; + int32 numInputs; + int32 numOutputs; + int32 flags; + pointer_sized_int hostSpace1; + pointer_sized_int hostSpace2; + int32 initialDelay; + int32 deprecated1; + int32 deprecated2; + float deprecated3; + void* object; + void* userPointer; + int32 uniqueID; + int32 version; + AEffectProcessProc processReplacing; + AEffectProcessDoubleProc processDoubleReplacing; + char emptySpace[56]; +}; + + +typedef pointer_sized_int (VSTINTERFACECALL* VstHostCallback) (VstEffectInterface*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt); +typedef pointer_sized_int (VSTINTERFACECALL* audioMasterCallback) (AEffect*, int32 op, int32 index, pointer_sized_int value, void* ptr, float opt); + +enum VstEffectInterfaceFlags +{ + vstEffectFlagHasEditor = 1, + vstEffectFlagInplaceAudio = 16, + vstEffectFlagDataInChunks = 32, + vstEffectFlagIsSynth = 256, + vstEffectFlagInplaceDoubleAudio = 4096 + + , effFlagsHasEditor = vstEffectFlagHasEditor + , effFlagsNoSoundInStop = 0 // FIXXME + , effFlagsProgramChunks = vstEffectFlagDataInChunks + + , effFlagsCanReplacing = vstEffectFlagInplaceAudio + , effFlagsIsSynth = vstEffectFlagIsSynth + , effFlagsCanDoubleReplacing = vstEffectFlagInplaceDoubleAudio +}; + +//============================================================================== +enum VstHostToPlugInOpcodes +{ + plugInOpcodeOpen, + plugInOpcodeClose, + plugInOpcodeSetCurrentProgram, + plugInOpcodeGetCurrentProgram, + plugInOpcodeSetCurrentProgramName, + plugInOpcodeGetCurrentProgramName, + plugInOpcodeGetParameterLabel, + plugInOpcodeGetParameterText, + plugInOpcodeGetParameterName, + plugInOpcodeSetSampleRate = plugInOpcodeGetParameterName + 2, + plugInOpcodeSetBlockSize, + plugInOpcodeResumeSuspend, + plugInOpcodeGetEditorBounds, + plugInOpcodeOpenEditor, + plugInOpcodeCloseEditor, + plugInOpcodeDrawEditor, + plugInOpcodeGetMouse, + plugInOpcodeEditorIdle = plugInOpcodeGetMouse + 2, + plugInOpcodeeffEditorTop, + plugInOpcodeSleepEditor, + plugInOpcodeIdentify, + plugInOpcodeGetData, + plugInOpcodeSetData, + plugInOpcodePreAudioProcessingEvents, + plugInOpcodeIsParameterAutomatable, + plugInOpcodeParameterValueForText, + plugInOpcodeGetProgramName = plugInOpcodeParameterValueForText + 2, + plugInOpcodeConnectInput = plugInOpcodeGetProgramName + 2, + plugInOpcodeConnectOutput, + plugInOpcodeGetInputPinProperties, + plugInOpcodeGetOutputPinProperties, + plugInOpcodeGetPlugInCategory, + plugInOpcodeSetSpeakerConfiguration = plugInOpcodeGetPlugInCategory + 7, + plugInOpcodeSetBypass = plugInOpcodeSetSpeakerConfiguration + 2, + plugInOpcodeGetPlugInName, + plugInOpcodeGetManufacturerName = plugInOpcodeGetPlugInName + 2, + plugInOpcodeGetManufacturerProductName, + plugInOpcodeGetManufacturerVersion, + plugInOpcodeManufacturerSpecific, + plugInOpcodeCanPlugInDo, + plugInOpcodeGetTailSize, + plugInOpcodeIdle, + plugInOpcodeKeyboardFocusRequired = plugInOpcodeIdle + 4, + plugInOpcodeGetVstInterfaceVersion, + plugInOpcodeGetCurrentMidiProgram = plugInOpcodeGetVstInterfaceVersion + 5, + plugInOpcodeGetSpeakerArrangement = plugInOpcodeGetCurrentMidiProgram + 6, + plugInOpcodeNextPlugInUniqueID, + plugInOpcodeStartProcess, + plugInOpcodeStopProcess, + plugInOpcodeSetNumberOfSamplesToProcess, + plugInOpcodeSetSampleFloatType = plugInOpcodeSetNumberOfSamplesToProcess + 4, + pluginOpcodeGetNumMidiInputChannels, + pluginOpcodeGetNumMidiOutputChannels, + plugInOpcodeMaximum = pluginOpcodeGetNumMidiOutputChannels + + , effOpen = plugInOpcodeOpen + , effClose = plugInOpcodeClose + , effSetProgram = plugInOpcodeSetCurrentProgram + , effGetProgram = plugInOpcodeGetCurrentProgram + , effSetProgramName = plugInOpcodeSetCurrentProgramName + , effGetProgramName = plugInOpcodeGetCurrentProgramName + , effGetParamLabel = plugInOpcodeGetParameterLabel + , effGetParamDisplay = plugInOpcodeGetParameterText + , effGetParamName = plugInOpcodeGetParameterName + , effSetSampleRate = plugInOpcodeSetSampleRate + , effSetBlockSize = plugInOpcodeSetBlockSize + , effMainsChanged = plugInOpcodeResumeSuspend + , effEditGetRect = plugInOpcodeGetEditorBounds + , effEditOpen = plugInOpcodeOpenEditor + , effEditClose = plugInOpcodeCloseEditor + , effIdentify = plugInOpcodeIdentify + , effGetChunk = plugInOpcodeGetData + , effSetChunk = plugInOpcodeSetData + , effProcessEvents = plugInOpcodePreAudioProcessingEvents + , effCanBeAutomated = plugInOpcodeIsParameterAutomatable + , effString2Parameter = plugInOpcodeParameterValueForText + , effGetProgramNameIndexed = plugInOpcodeGetProgramName + , effGetInputProperties = plugInOpcodeGetInputPinProperties + , effGetOutputProperties = plugInOpcodeGetOutputPinProperties + , effGetPlugCategory = plugInOpcodeGetPlugInCategory + , effSetSpeakerArrangement = plugInOpcodeSetSpeakerConfiguration + , effSetBypass = plugInOpcodeSetBypass + , effGetEffectName = plugInOpcodeGetPlugInName + , effGetProductString = plugInOpcodeGetManufacturerProductName + , effGetVendorString = plugInOpcodeGetManufacturerName + , effGetVendorVersion = plugInOpcodeGetManufacturerVersion + , effVendorSpecific = plugInOpcodeManufacturerSpecific + , effCanDo = plugInOpcodeCanPlugInDo + , effGetTailSize = plugInOpcodeGetTailSize + , effKeysRequired = plugInOpcodeKeyboardFocusRequired + , effGetVstVersion = plugInOpcodeGetVstInterfaceVersion + , effGetCurrentMidiProgram = plugInOpcodeGetCurrentMidiProgram + , effGetSpeakerArrangement = plugInOpcodeGetSpeakerArrangement + , effSetTotalSampleToProcess = plugInOpcodeSetNumberOfSamplesToProcess + , effSetProcessPrecision = plugInOpcodeSetSampleFloatType + , effGetNumMidiInputChannels = pluginOpcodeGetNumMidiInputChannels + , effGetNumMidiOutputChannels = pluginOpcodeGetNumMidiOutputChannels + + , effConnectInput = plugInOpcodeConnectInput + , effConnectOutput = plugInOpcodeConnectOutput + , effEditIdle = plugInOpcodeEditorIdle + , effIdle = plugInOpcodeIdle + , effShellGetNextPlugin = plugInOpcodeNextPlugInUniqueID + , effStartProcess = plugInOpcodeStartProcess + , effStopProcess = plugInOpcodeStopProcess +}; + + +enum VstPlugInToHostOpcodes +{ + hostOpcodeParameterChanged, + hostOpcodeVstVersion, + hostOpcodeCurrentId, + hostOpcodeIdle, + hostOpcodePinConnected, + hostOpcodePlugInWantsMidi = hostOpcodePinConnected + 2, + hostOpcodeGetTimingInfo, + hostOpcodePreAudioProcessingEvents, + hostOpcodeSetTime, + hostOpcodeTempoAt, + hostOpcodeGetNumberOfAutomatableParameters, + hostOpcodeGetParameterInterval, + hostOpcodeIOModified, + hostOpcodeNeedsIdle, + hostOpcodeWindowSize, + hostOpcodeGetSampleRate, + hostOpcodeGetBlockSize, + hostOpcodeGetInputLatency, + hostOpcodeGetOutputLatency, + hostOpcodeGetPreviousPlugIn, + hostOpcodeGetNextPlugIn, + hostOpcodeWillReplace, + hostOpcodeGetCurrentAudioProcessingLevel, + hostOpcodeGetAutomationState, + hostOpcodeOfflineStart, + hostOpcodeOfflineReadSource, + hostOpcodeOfflineWrite, + hostOpcodeOfflineGetCurrentPass, + hostOpcodeOfflineGetCurrentMetaPass, + hostOpcodeSetOutputSampleRate, + hostOpcodeGetOutputSpeakerConfiguration, + hostOpcodeGetManufacturerName, + hostOpcodeGetProductName, + hostOpcodeGetManufacturerVersion, + hostOpcodeManufacturerSpecific, + hostOpcodeSetIcon, + hostOpcodeCanHostDo, + hostOpcodeGetLanguage, + hostOpcodeOpenEditorWindow, + hostOpcodeCloseEditorWindow, + hostOpcodeGetDirectory, + hostOpcodeUpdateView, + hostOpcodeParameterChangeGestureBegin, + hostOpcodeParameterChangeGestureEnd + + , audioMasterProcessEvents = hostOpcodePreAudioProcessingEvents + , audioMasterWantMidi = hostOpcodePlugInWantsMidi + , audioMasterVendorSpecific = hostOpcodeManufacturerSpecific + , audioMasterAutomate = hostOpcodeParameterChanged + , audioMasterBeginEdit = hostOpcodeParameterChangeGestureBegin + , audioMasterEndEdit = hostOpcodeParameterChangeGestureEnd + , audioMasterUpdateDisplay = hostOpcodeUpdateView + , audioMasterIOChanged = hostOpcodeIOModified + , audioMasterCanDo = hostOpcodeCanHostDo + , audioMasterGetCurrentProcessLevel = hostOpcodeGetCurrentAudioProcessingLevel + , audioMasterGetTime = hostOpcodeGetTimingInfo + , audioMasterSizeWindow = hostOpcodeWindowSize + , audioMasterVersion = hostOpcodeVstVersion + + , audioMasterCloseWindow = hostOpcodeCloseEditorWindow + , audioMasterCurrentId = hostOpcodeCurrentId + , audioMasterGetAutomationState = hostOpcodeGetAutomationState + , audioMasterGetBlockSize = hostOpcodeGetBlockSize + , audioMasterGetDirectory = hostOpcodeGetDirectory + , audioMasterGetInputLatency = hostOpcodeGetInputLatency + , audioMasterGetLanguage = hostOpcodeGetLanguage + , audioMasterGetNextPlug = hostOpcodeGetNextPlugIn + , audioMasterGetNumAutomatableParameters = hostOpcodeGetNumberOfAutomatableParameters + , audioMasterGetOutputLatency = hostOpcodeGetOutputLatency + , audioMasterGetOutputSpeakerArrangement = hostOpcodeGetOutputSpeakerConfiguration + , audioMasterGetParameterQuantization = hostOpcodeGetParameterInterval + , audioMasterGetPreviousPlug = hostOpcodeGetPreviousPlugIn + , audioMasterGetProductString = hostOpcodeGetProductName + , audioMasterGetSampleRate = hostOpcodeGetSampleRate + , audioMasterGetVendorString = hostOpcodeGetManufacturerName + , audioMasterGetVendorVersion = hostOpcodeGetManufacturerVersion + , audioMasterIdle = hostOpcodeIdle + , audioMasterNeedIdle = hostOpcodeNeedsIdle + , audioMasterOfflineGetCurrentMetaPass = hostOpcodeOfflineGetCurrentMetaPass + , audioMasterOfflineGetCurrentPass = hostOpcodeOfflineGetCurrentPass + , audioMasterOfflineRead = hostOpcodeOfflineReadSource + , audioMasterOfflineStart = hostOpcodeOfflineStart + , audioMasterOfflineWrite = hostOpcodeOfflineWrite + , audioMasterOpenWindow = hostOpcodeOpenEditorWindow + , audioMasterPinConnected = hostOpcodePinConnected + , audioMasterSetIcon = hostOpcodeSetIcon + , audioMasterSetOutputSampleRate = hostOpcodeSetOutputSampleRate + , audioMasterSetTime = hostOpcodeSetTime + , audioMasterTempoAt = hostOpcodeTempoAt + , audioMasterWillReplaceOrAccumulate = hostOpcodeWillReplace + +}; + +//============================================================================== +enum VstProcessingSampleType +{ + vstProcessingSampleTypeFloat, + vstProcessingSampleTypeDouble + + , kVstProcessPrecision32 = vstProcessingSampleTypeFloat + , kVstProcessPrecision64 = vstProcessingSampleTypeDouble +}; + +//============================================================================== +// These names must be identical to the Steinberg SDK so JUCE users can set +// exactly what they want. +typedef enum VstPlugInCategory +{ + kPlugCategUnknown, + kPlugCategEffect, + kPlugCategSynth, + kPlugCategAnalysis, + kPlugCategMastering, + kPlugCategSpacializer, + kPlugCategRoomFx, + kPlugSurroundFx, + kPlugCategRestoration, + kPlugCategOfflineProcess, + kPlugCategShell, + kPlugCategGenerator +} VstPlugCategory; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstEditorBounds +{ + int16 upper; + int16 leftmost; + int16 lower; + int16 rightmost; +}; +struct ERect { + int16 top; + int16 left; + int16 bottom; + int16 right; +}; + +//============================================================================== +enum VstMaxStringLengths +{ + vstMaxNameLength = 64, + vstMaxParameterOrPinLabelLength = 64, + vstMaxParameterOrPinShortLabelLength = 8, + vstMaxCategoryLength = 24, + vstMaxManufacturerStringLength = 64, + vstMaxPlugInNameStringLength = 64 + + , kVstMaxLabelLen = vstMaxParameterOrPinLabelLength + , kVstMaxShortLabelLen = vstMaxParameterOrPinShortLabelLength + , kVstMaxProductStrLen = vstMaxPlugInNameStringLength + , kVstMaxVendorStrLen = vstMaxManufacturerStringLength +}; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstPinInfo +{ + char text[vstMaxParameterOrPinLabelLength]; + int32 flags; + int32 configurationType; + char shortText[vstMaxParameterOrPinShortLabelLength]; + char unused[48]; +}; +struct VstPinProperties +{ + char label[vstMaxParameterOrPinLabelLength]; + int32 flags; + int32 arrangementType; + char shortLabel[vstMaxParameterOrPinShortLabelLength]; + char unused[48]; +}; + +enum VstPinInfoFlags +{ + vstPinInfoFlagIsActive = 1, + vstPinInfoFlagIsStereo = 2, + vstPinInfoFlagValid = 4 + + , kVstPinIsActive = vstPinInfoFlagIsActive + , kVstPinUseSpeaker = vstPinInfoFlagValid + , kVstPinIsStereo = vstPinInfoFlagIsStereo +}; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstEvent +{ + int32 type; + int32 byteSize; // size; + int32 deltaFrames; //? sampleOffset; + int32 flags; + char content[16]; +}; + +enum VstEventTypes +{ + vstMidiEventType = 1, + vstSysExEventType = 6, + kVstMidiType = vstMidiEventType, + kVstSysExType = vstSysExEventType +}; + +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstEvents +{ + int32 numEvents; + pointer_sized_int future; + VstEvent* events[2]; +}; + +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstMidiEvent +{ + int32 type; + int32 byteSize; // size; + int32 deltaFrames; //? sampleOffset; + int32 flags; + int32 noteLength; // noteSampleLength; + int32 noteOffset; // noteSampleOffset; + char midiData[4]; + char detune; // tuning; + char noteOffVelocity; // noteVelocityOff; + char future1; + char future2; +}; + +enum VstMidiEventFlags +{ + vstMidiEventIsRealtime = 1 +}; + +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstSysExEvent +{ + int32 type; + int32 byteSize; // size; + int32 deltaFrames; //? offsetSamples; + int32 flags; + int32 dumpBytes; // sysExDumpSize; + pointer_sized_int resvd1; // future1; + char* sysexDump; // sysExDump; + pointer_sized_int resvd2; // future2; +}; +typedef VstSysExEvent VstMidiSysexEvent; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstTimingInformation +{ + double samplePosition; + double sampleRate; + double systemTimeNanoseconds; + double musicalPosition; + double tempoBPM; + double lastBarPosition; + double loopStartPosition; + double loopEndPosition; + int32 timeSignatureNumerator; + int32 timeSignatureDenominator; + int32 smpteOffset; + int32 smpteRate; + int32 samplesToNearestClock; + int32 flags; +}; +struct VstTimeInfo +{ + double samplePos; + double sampleRate; + double systemTimeNanoseconds; + double ppqPos; + double tempo; + double barStartPos; + double cycleStartPos; + double cycleEndPos; + int32 timeSigNumerator; + int32 timeSigDenominator; + int32 smpteOffset; + int32 smpteFrameRate; + int32 samplesToNearestClock; + int32 flags; +}; + +enum VstTimingInformationFlags +{ + vstTimingInfoFlagTransportChanged = 1, + vstTimingInfoFlagCurrentlyPlaying = 2, + vstTimingInfoFlagLoopActive = 4, + vstTimingInfoFlagCurrentlyRecording = 8, + vstTimingInfoFlagAutomationWriteModeActive = 64, + vstTimingInfoFlagAutomationReadModeActive = 128, + vstTimingInfoFlagNanosecondsValid = 256, + vstTimingInfoFlagMusicalPositionValid = 512, + vstTimingInfoFlagTempoValid = 1024, + vstTimingInfoFlagLastBarPositionValid = 2048, + vstTimingInfoFlagLoopPositionValid = 4096, + vstTimingInfoFlagTimeSignatureValid = 8192, + vstTimingInfoFlagSmpteValid = 16384, + vstTimingInfoFlagNearestClockValid = 32768 + + , kVstTransportPlaying = vstTimingInfoFlagCurrentlyPlaying + , kVstTransportCycleActive = vstTimingInfoFlagLoopActive + , kVstTransportRecording = vstTimingInfoFlagCurrentlyRecording + , kVstPpqPosValid = vstTimingInfoFlagMusicalPositionValid + , kVstTempoValid = vstTimingInfoFlagTempoValid + , kVstBarsValid = vstTimingInfoFlagLastBarPositionValid + , kVstCyclePosValid = vstTimingInfoFlagLoopPositionValid + , kVstTimeSigValid = vstTimingInfoFlagTimeSignatureValid + , kVstSmpteValid = vstTimingInfoFlagSmpteValid + , kVstClockValid = vstTimingInfoFlagNearestClockValid + + , kVstAutomationReading = vstTimingInfoFlagAutomationReadModeActive + , kVstAutomationWriting = vstTimingInfoFlagAutomationWriteModeActive + , kVstNanosValid = vstTimingInfoFlagNanosecondsValid + , kVstTransportChanged = vstTimingInfoFlagTransportChanged +}; + +//============================================================================== +enum VstSmpteRates +{ + vstSmpteRateFps24, + vstSmpteRateFps25, + vstSmpteRateFps2997, + vstSmpteRateFps30, + vstSmpteRateFps2997drop, + vstSmpteRateFps30drop, + + vstSmpteRate16mmFilm, + vstSmpteRate35mmFilm, + + vstSmpteRateFps239 = vstSmpteRate35mmFilm + 3, + vstSmpteRateFps249, + vstSmpteRateFps599, + vstSmpteRateFps60 + + , kVstSmpte239fps = vstSmpteRateFps239 + , kVstSmpte24fps = vstSmpteRateFps24 + , kVstSmpte25fps = vstSmpteRateFps25 + , kVstSmpte2997fps = vstSmpteRateFps2997 + , kVstSmpte30fps = vstSmpteRateFps30 + , kVstSmpte2997dfps = vstSmpteRateFps2997drop + , kVstSmpte30dfps = vstSmpteRateFps30drop + , kVstSmpteFilm16mm = vstSmpteRate16mmFilm + , kVstSmpteFilm35mm = vstSmpteRate35mmFilm + , kVstSmpte249fps = vstSmpteRateFps249 + , kVstSmpte599fps = vstSmpteRateFps599 + , kVstSmpte60fps = vstSmpteRateFps60 +}; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstIndividualSpeakerInfo +{ + float azimuthalAngle; + float elevationAngle; + float radius; + float reserved; + char label[vstMaxNameLength]; + int32 type; + char unused[28]; +}; +typedef VstIndividualSpeakerInfo VstSpeakerProperties; + +enum VstIndividualSpeakerType +{ + vstIndividualSpeakerTypeUndefined = 0x7fffffff, + vstIndividualSpeakerTypeMono = 0, + vstIndividualSpeakerTypeLeft, + vstIndividualSpeakerTypeRight, + vstIndividualSpeakerTypeCentre, + vstIndividualSpeakerTypeLFE, + vstIndividualSpeakerTypeLeftSurround, + vstIndividualSpeakerTypeRightSurround, + vstIndividualSpeakerTypeLeftCentre, + vstIndividualSpeakerTypeRightCentre, + vstIndividualSpeakerTypeSurround, + vstIndividualSpeakerTypeCentreSurround = vstIndividualSpeakerTypeSurround, + vstIndividualSpeakerTypeLeftRearSurround, + vstIndividualSpeakerTypeRightRearSurround, + vstIndividualSpeakerTypeTopMiddle, + vstIndividualSpeakerTypeTopFrontLeft, + vstIndividualSpeakerTypeTopFrontCentre, + vstIndividualSpeakerTypeTopFrontRight, + vstIndividualSpeakerTypeTopRearLeft, + vstIndividualSpeakerTypeTopRearCentre, + vstIndividualSpeakerTypeTopRearRight, + vstIndividualSpeakerTypeLFE2 + + , kSpeakerL = vstIndividualSpeakerTypeLeft + , kSpeakerR = vstIndividualSpeakerTypeRight + , kSpeakerC = vstIndividualSpeakerTypeCentre + , kSpeakerLfe = vstIndividualSpeakerTypeLFE + , kSpeakerLs = vstIndividualSpeakerTypeLeftSurround + , kSpeakerRs = vstIndividualSpeakerTypeRightSurround + , kSpeakerLc = vstIndividualSpeakerTypeLeftCentre + , kSpeakerRc = vstIndividualSpeakerTypeRightCentre + , kSpeakerS = vstIndividualSpeakerTypeSurround + , kSpeakerSl = vstIndividualSpeakerTypeLeftRearSurround + , kSpeakerSr = vstIndividualSpeakerTypeRightRearSurround + , kSpeakerTm = vstIndividualSpeakerTypeTopMiddle + , kSpeakerTfl = vstIndividualSpeakerTypeTopFrontLeft + , kSpeakerTfc = vstIndividualSpeakerTypeTopFrontCentre + , kSpeakerTfr = vstIndividualSpeakerTypeTopFrontRight + , kSpeakerTrl = vstIndividualSpeakerTypeTopRearLeft + , kSpeakerTrc = vstIndividualSpeakerTypeTopRearCentre + , kSpeakerTrr = vstIndividualSpeakerTypeTopRearRight + , kSpeakerLfe2 = vstIndividualSpeakerTypeLFE2 +}; + +/** Structure used for VSTs + + @tags{Audio} +*/ +struct VstSpeakerConfiguration +{ + int32 type; + int32 numChannels; // numberOfChannels; + VstIndividualSpeakerInfo speakers[8]; +}; +typedef VstSpeakerConfiguration VstSpeakerArrangement; + +enum VstSpeakerConfigurationType +{ + vstSpeakerConfigTypeUser = -2, + vstSpeakerConfigTypeEmpty = -1, + vstSpeakerConfigTypeMono = 0, + vstSpeakerConfigTypeLR, + vstSpeakerConfigTypeLsRs, + vstSpeakerConfigTypeLcRc, + vstSpeakerConfigTypeSlSr, + vstSpeakerConfigTypeCLfe, + vstSpeakerConfigTypeLRC, + vstSpeakerConfigTypeLRS, + vstSpeakerConfigTypeLRCLfe, + vstSpeakerConfigTypeLRLfeS, + vstSpeakerConfigTypeLRCS, + vstSpeakerConfigTypeLRLsRs, + vstSpeakerConfigTypeLRCLfeS, + vstSpeakerConfigTypeLRLfeLsRs, + vstSpeakerConfigTypeLRCLsRs, + vstSpeakerConfigTypeLRCLfeLsRs, + vstSpeakerConfigTypeLRCLsRsCs, + vstSpeakerConfigTypeLRLsRsSlSr, + vstSpeakerConfigTypeLRCLfeLsRsCs, + vstSpeakerConfigTypeLRLfeLsRsSlSr, + vstSpeakerConfigTypeLRCLsRsLcRc, + vstSpeakerConfigTypeLRCLsRsSlSr, + vstSpeakerConfigTypeLRCLfeLsRsLcRc, + vstSpeakerConfigTypeLRCLfeLsRsSlSr, + vstSpeakerConfigTypeLRCLsRsLcRcCs, + vstSpeakerConfigTypeLRCLsRsCsSlSr, + vstSpeakerConfigTypeLRCLfeLsRsLcRcCs, + vstSpeakerConfigTypeLRCLfeLsRsCsSlSr, + vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2 + + , kSpeakerArrMono = vstSpeakerConfigTypeMono + , kSpeakerArrStereo = vstSpeakerConfigTypeLR + , kSpeakerArrStereoCLfe = vstSpeakerConfigTypeCLfe + , kSpeakerArrStereoCenter = vstSpeakerConfigTypeLcRc + , kSpeakerArrStereoSide = vstSpeakerConfigTypeSlSr + , kSpeakerArrStereoSurround = vstSpeakerConfigTypeLsRs + , kSpeakerArr30Cine = vstSpeakerConfigTypeLRC + , kSpeakerArr31Cine = vstSpeakerConfigTypeLRCLfe + , kSpeakerArr40Cine = vstSpeakerConfigTypeLRCS + , kSpeakerArr41Cine = vstSpeakerConfigTypeLRCLfeS + , kSpeakerArr60Cine = vstSpeakerConfigTypeLRCLsRsCs + , kSpeakerArr61Cine = vstSpeakerConfigTypeLRCLfeLsRsCs + , kSpeakerArr70Cine = vstSpeakerConfigTypeLRCLsRsLcRc // create7point0SDDS + , kSpeakerArr71Cine = vstSpeakerConfigTypeLRCLfeLsRsLcRc + , kSpeakerArr80Cine = vstSpeakerConfigTypeLRCLsRsLcRcCs + , kSpeakerArr81Cine = vstSpeakerConfigTypeLRCLfeLsRsLcRcCs + , kSpeakerArr30Music = vstSpeakerConfigTypeLRS + , kSpeakerArr31Music = vstSpeakerConfigTypeLRLfeS + , kSpeakerArr40Music = vstSpeakerConfigTypeLRLsRs + , kSpeakerArr41Music = vstSpeakerConfigTypeLRLfeLsRs + , kSpeakerArr60Music = vstSpeakerConfigTypeLRLsRsSlSr + , kSpeakerArr61Music = vstSpeakerConfigTypeLRLfeLsRsSlSr + , kSpeakerArr70Music = vstSpeakerConfigTypeLRCLsRsSlSr // create7point0 + , kSpeakerArr71Music = vstSpeakerConfigTypeLRCLfeLsRsSlSr + , kSpeakerArr80Music = vstSpeakerConfigTypeLRCLsRsCsSlSr + , kSpeakerArr81Music = vstSpeakerConfigTypeLRCLfeLsRsCsSlSr + , kSpeakerArr50 = vstSpeakerConfigTypeLRCLsRs + , kSpeakerArr51 = vstSpeakerConfigTypeLRCLfeLsRs + , kSpeakerArr102 = vstSpeakerConfigTypeLRCLfeLsRsTflTfcTfrTrlTrrLfe2 + , kSpeakerArrEmpty = vstSpeakerConfigTypeEmpty + , kSpeakerArrUserDefined = vstSpeakerConfigTypeUser +}; + +#if JUCE_BIG_ENDIAN + #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (a | (((uint32) b) << 8) | (((uint32) c) << 16) | (((uint32) d) << 24)) +#else + #define JUCE_MULTICHAR_CONSTANT(a, b, c, d) (d | (((uint32) c) << 8) | (((uint32) b) << 16) | (((uint32) a) << 24)) +#endif + +enum PresonusExtensionConstants +{ + presonusVendorID = JUCE_MULTICHAR_CONSTANT ('P', 'r', 'e', 'S'), + presonusSetContentScaleFactor = JUCE_MULTICHAR_CONSTANT ('A', 'e', 'C', 's') +}; + +//============================================================================== +/** Structure used for VSTs + + @tags{Audio} +*/ +struct vst2FxBank +{ + int32 magic1; + int32 size; + int32 magic2; + int32 version1; + int32 fxID; + int32 version2; + int32 elements; + int32 current; + char shouldBeZero[124]; + int32 chunkSize; + char chunk[1]; +}; + +#if JUCE_MSVC + #pragma pack(pop) +#elif JUCE_MAC || JUCE_IOS + #pragma options align=reset +#else + #pragma pack(pop) +#endif diff --git a/extra/lv2-ttl-generator/GNUmakefile b/extra/lv2-ttl-generator/GNUmakefile new file mode 100644 index 00000000..024f2a1f --- /dev/null +++ b/extra/lv2-ttl-generator/GNUmakefile @@ -0,0 +1,16 @@ +#!/usr/bin/makefile -f + +all: build + +build: lv2_ttl_generator +mingw: lv2_ttl_generator.exe + +lv2_ttl_generator: lv2_ttl_generator.c + $(CXX) lv2_ttl_generator.c -o lv2_ttl_generator -ldl + +lv2_ttl_generator.exe: lv2_ttl_generator.c + $(CXX) lv2_ttl_generator.c -o lv2_ttl_generator.exe -static + touch lv2_ttl_generator + +clean: + rm -f lv2_ttl_generator lv2_ttl_generator.exe diff --git a/extra/lv2-ttl-generator/generate-ttl.sh b/extra/lv2-ttl-generator/generate-ttl.sh new file mode 100755 index 00000000..d5ef597e --- /dev/null +++ b/extra/lv2-ttl-generator/generate-ttl.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +#set -e +#echo "Please run this script from the _bin folder" + +error() { + echo "$@" 1>&2 +} + +SCRIPTPATH=$(cd ${0%/*}; pwd) + +if [ -f ${SCRIPTPATH}/lv2_ttl_generator.exe ]; then + GEN=${SCRIPTPATH}/lv2_ttl_generator.exe + EXT=dll +else + GEN=${SCRIPTPATH}/lv2_ttl_generator + EXT=so +fi +if [ ! -x "${GEN}" ]; then + error "unable to find lv2_ttl_generator" + exit 1 +fi + +SEARCHPATH=$1 +if [ "x${SEARCHPATH}" = "x" ]; then + if [ -d "lv2" ]; then + SEARCHPATH="lv2" + fi + if [ ! -d "${SEARCHPATH}" ]; then + SEARCHPATH=. + fi +fi +if [ ! -d "${SEARCHPATH}" ]; then + error "cannot search plugins in non-existing directory ${SEARCHPATH}" + exit 1 +fi + + +find ${SEARCHPATH} -type d -name "*.lv2" -exec /bin/sh -c "cd {}; ${GEN} ./*.${EXT}" \; + diff --git a/extra/lv2-ttl-generator/lv2_ttl_generator.c b/extra/lv2-ttl-generator/lv2_ttl_generator.c new file mode 100644 index 00000000..bd19f416 --- /dev/null +++ b/extra/lv2-ttl-generator/lv2_ttl_generator.c @@ -0,0 +1,81 @@ +/* + * JUCE LV2 *.ttl generator + */ + +#include +#include + +#ifdef _WIN32 + #include + #define TTL_GENERATOR_WINDOWS +#else + #include +#endif + +#ifndef nullptr + #define nullptr (0) +#endif + +typedef void (*TTL_Generator_Function)(const char* basename); + +int main(int argc, char* argv[]) +{ + if (argc != 2) + { + printf("usage: %s /path/to/plugin-DLL\n", argv[0]); + return 1; + } + +#ifdef TTL_GENERATOR_WINDOWS + const HMODULE handle = LoadLibraryA(argv[1]); +#else + void* const handle = dlopen(argv[1], RTLD_LAZY); +#endif + + if (! handle) + { +#ifdef TTL_GENERATOR_WINDOWS + printf("Failed to open plugin DLL\n"); +#else + printf("Failed to open plugin DLL, error was:\n%s\n", dlerror()); +#endif + return 2; + } + +#ifdef TTL_GENERATOR_WINDOWS + const TTL_Generator_Function ttlFn = (TTL_Generator_Function)GetProcAddress(handle, "lv2_generate_ttl"); +#else + const TTL_Generator_Function ttlFn = (TTL_Generator_Function)dlsym(handle, "lv2_generate_ttl"); +#endif + + if (ttlFn != NULL) + { + char basename[strlen(argv[1])+1]; + +#ifdef TTL_GENERATOR_WINDOWS + if (char* base2 = strrchr(argv[1], '\\')) +#else + if (char* base2 = strrchr(argv[1], '/')) +#endif + { + strcpy(basename, base2+1); + basename[strrchr(base2, '.')-base2-1] = '\0'; + } + else + strcpy(basename, argv[1]); + + printf("Generate ttl data for '%s', basename: '%s'\n", argv[1], basename); + + ttlFn(basename); + } + else + printf("Failed to find 'lv2_generate_ttl' function\n"); + +#ifdef TTL_GENERATOR_WINDOWS + FreeLibrary(handle); +#else + dlclose(handle); +#endif + + return 0; +} diff --git a/extra/lv2-ttl-generator/readme.txt b/extra/lv2-ttl-generator/readme.txt new file mode 100644 index 00000000..0bd3ab5e --- /dev/null +++ b/extra/lv2-ttl-generator/readme.txt @@ -0,0 +1,7 @@ +this lv2_ttl_generator is taken from DISTRHO by Filipe Coelho (aka 'falkTX') + +http://distrho.sourceforge.net +https://github.com/falkTX/DISTRHO + + +this small tool creates the needed .ttl files out of the plug-in binaries (.so) for the .lv2 bundle diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 00000000..cd3fa3d5 --- /dev/null +++ b/gbp.conf @@ -0,0 +1,6 @@ +# Configuration file for git-buildpackage and friends + +[DEFAULT] +pristine-tar = True +sign-tags = True +compression = xz diff --git a/gbp/postclone.sh b/gbp/postclone.sh new file mode 100755 index 00000000..5790ec6d --- /dev/null +++ b/gbp/postclone.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +## script to initialize a cloned repository +## with per (local) repository settings. + +# - ignore quilt's .pc/ directory +# - enable the "--follow-tags" mode for pushing + +echo "tuning git-repository for ${NAME}" +git config push.followTags true && echo "enabled push.followTags" + +GITEXCLUDE=".git/info/exclude" +egrep "^/?\.pc/?$" "${GITEXCLUDE}" >/dev/null 2>&1 \ + || (echo "/.pc/" >> "${GITEXCLUDE}" && echo "ignoring /.pc/") diff --git a/juce-modules-source.doc b/juce-modules-source.doc new file mode 100644 index 00000000..ab3c3307 --- /dev/null +++ b/juce-modules-source.doc @@ -0,0 +1 @@ +BREAKING-CHANGES.txt diff --git a/juce-modules-source.install b/juce-modules-source.install new file mode 100644 index 00000000..4899195b --- /dev/null +++ b/juce-modules-source.install @@ -0,0 +1,3 @@ +modules/* /usr/share/juce/modules +debian/extra/juce_audio_plugin_client/* /usr/share/juce/modules/juce_audio_plugin_client/ +debian/extra/juce_audio_processors/format_types/juce_VSTInterface.h /usr/share/juce/modules/juce_audio_processors/format_types/ diff --git a/juce-tools.install b/juce-tools.install new file mode 100644 index 00000000..055151eb --- /dev/null +++ b/juce-tools.install @@ -0,0 +1,4 @@ +extras/Projucer/Builds/LinuxMakefile/build/Projucer usr/bin +debian/artifacts/juce.png usr/share/pixmaps/ +debian/Projucer.desktop usr/share/applications/ +usr/lib diff --git a/juce-tools.manpages b/juce-tools.manpages new file mode 100644 index 00000000..08dbe247 --- /dev/null +++ b/juce-tools.manpages @@ -0,0 +1 @@ +debian/artifacts/Projucer.1 diff --git a/juce-tools.mime b/juce-tools.mime new file mode 100644 index 00000000..643f3da6 --- /dev/null +++ b/juce-tools.mime @@ -0,0 +1 @@ +application/x-juce; Projucer '%s'; edit=Projucer '%s'; test=test "$DISPLAY" != ""; priority=2 diff --git a/juce-tools.sharedmimeinfo b/juce-tools.sharedmimeinfo new file mode 100644 index 00000000..043dfa0b --- /dev/null +++ b/juce-tools.sharedmimeinfo @@ -0,0 +1,8 @@ + + + + + JUCE project + + + diff --git a/libjuce-doc.doc-base b/libjuce-doc.doc-base new file mode 100644 index 00000000..6c987e32 --- /dev/null +++ b/libjuce-doc.doc-base @@ -0,0 +1,12 @@ +Document: libjuce-doc +Title: JUCE - reference manual +Author: Julian Storer / ROLI Ltd. +Abstract: This is the API documentation for JUCE (Jules' Utility Class + Extensions), an all-encompassing C++ framework for developing cross-platform + software (with a special focus on GUI, graphics and sound) +Section: Programming + +Format: HTML +Index: /usr/share/doc/juce-modules-source/apiref/index.html +Files: /usr/share/doc/juce-modules-source/apiref/*.html + diff --git a/libjuce-doc.install b/libjuce-doc.install new file mode 100644 index 00000000..49e157f2 --- /dev/null +++ b/libjuce-doc.install @@ -0,0 +1 @@ +doxygen/doc/* /usr/share/doc/juce-modules-source/apiref diff --git a/patches/LV2-audioprocessor.patch b/patches/LV2-audioprocessor.patch new file mode 100644 index 00000000..e8cf7b34 --- /dev/null +++ b/patches/LV2-audioprocessor.patch @@ -0,0 +1,73 @@ +From: Filipe Coelho +Date: Sat, 10 Feb 2018 00:00:00 +0100 +Subject: LV2 fixes for autiodprocessor +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 8bit + +Origin: https://github.com/DISTRHO/juce/tree/9f6cdc3659df13169285464ee1d13ef14357f833 +Reviewed-by: IOhannes m zmölnig +--- + .../juce_audio_processors/processors/juce_AudioProcessor.h | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +--- juce.orig/modules/juce_audio_processors/processors/juce_AudioProcessor.h ++++ juce/modules/juce_audio_processors/processors/juce_AudioProcessor.h +@@ -927,6 +927,7 @@ + */ + virtual void setNonRealtime (bool isNonRealtime) noexcept; + ++ #if ! JUCE_AUDIOPROCESSOR_NO_GUI + //============================================================================== + /** Creates the processor's GUI. + +@@ -973,6 +974,7 @@ + This may call createEditor() internally to create the component. + */ + AudioProcessorEditor* createEditorIfNeeded(); ++ #endif + + //============================================================================== + /** Returns the default number of steps for a parameter. +@@ -1108,6 +1110,11 @@ + virtual void processorLayoutsChanged(); + + //============================================================================== ++ /** LV2 specific calls, saving/restore as string. */ ++ virtual String getStateInformationString () { return String(); } ++ virtual void setStateInformationString (const String&) {} ++ ++ //============================================================================== + /** Adds a listener that will be called when an aspect of this processor changes. */ + virtual void addListener (AudioProcessorListener* newListener); + +@@ -1177,9 +1184,11 @@ + + virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const { return {}; } + ++ #if ! JUCE_AUDIOPROCESSOR_NO_GUI + //============================================================================== + /** Not for public use - this is called before deleting an editor component. */ + void editorBeingDeleted (AudioProcessorEditor*) noexcept; ++ #endif + + /** Flags to indicate the type of plugin context in which a processor is being used. */ + enum WrapperType +@@ -1193,6 +1202,7 @@ + wrapperType_AAX, + wrapperType_Standalone, + wrapperType_Unity ++ , wrapperType_LV2 + }; + + /** When loaded by a plugin wrapper, this flag will be set to indicate the type +@@ -1453,7 +1463,9 @@ + + //============================================================================== + Array listeners; ++ #if ! JUCE_AUDIOPROCESSOR_NO_GUI + Component::SafePointer activeEditor; ++ #endif + double currentSampleRate = 0; + int blockSize = 0, latencySamples = 0; + bool suspended = false, nonRealtime = false; diff --git a/patches/debian_fixed-defines.patch b/patches/debian_fixed-defines.patch new file mode 100644 index 00000000..7486e104 --- /dev/null +++ b/patches/debian_fixed-defines.patch @@ -0,0 +1,102 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Sun, 11 Feb 2018 00:00:00 +0100 +Subject: clamp a few defines to fixed values + + on Debian we only ever allow using the system provided libraries + (zlib, flac, oggvorbis,...) +Origin: Debian +Forwarded: not-needed +--- + .../utility/juce_CheckSettingMacros.h | 25 +++++++++++++++++ + modules/juce_core/juce_core.h | 32 +++++++++++++++++++++- + 2 files changed, 56 insertions(+), 1 deletion(-) + +--- juce.orig/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h ++++ juce/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +@@ -24,6 +24,30 @@ + ============================================================================== + */ + ++/* Debian specific overrides */ ++#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) ++# warning JUCE/Debian using default LV2URI ++# define JucePlugin_LV2URI JucePlugin_Name ++#endif ++ ++#if JucePlugin_Build_AU ++# warning JUCE/Debian disabled AU support ++# undef JucePlugin_Build_AU ++# define JucePlugin_Build_AU 0 ++#endif ++ ++#if JucePlugin_Build_RTAS ++# warning JUCE/Debian disabled RTAS support ++# undef JucePlugin_Build_RTAS ++# define JucePlugin_Build_RTAS 0 ++#endif ++ ++#if JucePlugin_Build_AAX ++# warning JUCE/Debian disabled AAX support ++# undef JucePlugin_Build_AAX ++# define JucePlugin_Build_AAX 0 ++#endif ++ + // The following checks should cause a compile error if you've forgotten to + // define all your plugin settings properly.. + +@@ -40,6 +64,7 @@ + #endif + #define JUCE_CHECKSETTINGMACROS_H + ++ + #ifndef JucePlugin_IsSynth + #error "You need to define the JucePlugin_IsSynth value!" + #endif +--- juce.orig/modules/juce_core/juce_core.h ++++ juce/modules/juce_core/juce_core.h +@@ -64,6 +64,36 @@ + + #include "system/juce_TargetPlatform.h" + ++/** Debian specific constants ++ - Debian, we don't use embedded libraries ++*/ ++#ifdef JUCE_INCLUDE_ZLIB_CODE ++# undef JUCE_INCLUDE_ZLIB_CODE ++#endif ++#define JUCE_INCLUDE_ZLIB_CODE 0 ++ ++#ifdef JUCE_INCLUDE_FLAC_CODE ++# undef JUCE_INCLUDE_FLAC_CODE ++#endif ++#define JUCE_INCLUDE_FLAC_CODE 0 ++ ++#ifdef JUCE_INCLUDE_OGGVORBIS_CODE ++# undef JUCE_INCLUDE_OGGVORBIS_CODE ++#endif ++#define JUCE_INCLUDE_OGGVORBIS_CODE 0 ++ ++#ifdef JUCE_INCLUDE_JPEGLIB_CODE ++# undef JUCE_INCLUDE_JPEGLIB_CODE ++#endif ++#define JUCE_INCLUDE_JPEGLIB_CODE 0 ++ ++#ifdef JUCE_INCLUDE_PNGLIB_CODE ++# undef JUCE_INCLUDE_PNGLIB_CODE ++#endif ++#define JUCE_INCLUDE_PNGLIB_CODE 0 ++/** Debian specifics END ++*/ ++ + //============================================================================== + /** Config: JUCE_FORCE_DEBUG + +@@ -123,7 +153,7 @@ + specify the path where your zlib headers live. + */ + #ifndef JUCE_INCLUDE_ZLIB_CODE +- #define JUCE_INCLUDE_ZLIB_CODE 1 ++ #define JUCE_INCLUDE_ZLIB_CODE 0 + #endif + + #ifndef JUCE_ZLIB_INCLUDE_PATH diff --git a/patches/debian_gpl_variant.patch b/patches/debian_gpl_variant.patch new file mode 100644 index 00000000..22499ffe --- /dev/null +++ b/patches/debian_gpl_variant.patch @@ -0,0 +1,20 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Thu, 9 Nov 2017 00:00:00 +0100 +Subject: Build GPL-3 variant of Projucer + +Forwarded: not-needed +--- + extras/Projucer/JuceLibraryCode/AppConfig.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- juce.orig/extras/Projucer/JuceLibraryCode/AppConfig.h ++++ juce/extras/Projucer/JuceLibraryCode/AppConfig.h +@@ -32,7 +32,7 @@ + // BEGIN SECTION A + + #ifndef JUCER_ENABLE_GPL_MODE +- #define JUCER_ENABLE_GPL_MODE 0 ++ #define JUCER_ENABLE_GPL_MODE 1 + #endif + + // END SECTION A diff --git a/patches/debian_link_systemlibs.patch b/patches/debian_link_systemlibs.patch new file mode 100644 index 00000000..4be7166e --- /dev/null +++ b/patches/debian_link_systemlibs.patch @@ -0,0 +1,61 @@ +Description: have Projucer link against the system libraries + since the Debian package has removed 3rd-party libraries (jpeg, png, flag, + ogg/vorbis), we must use against the system libraries. +Author: IOhannes m zmölnig +Origin: Debian +Forwarded: no +Last-Update: 2019-08-21 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- juce.orig/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h ++++ juce/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +@@ -464,6 +464,39 @@ + if (isCurlEnabled() && ! isLoadCurlSymbolsLazilyEnabled()) + packages.add ("libcurl"); + ++ // on Debian, a number of 3rd-party libs have been stripped away, ++ // so we need to link to the system libraries ++ if (project.getEnabledModules().isModuleEnabled ("juce_core")) ++ { ++ packages.add ("zlib"); ++ } ++ if (project.getEnabledModules().isModuleEnabled ("juce_graphics")) ++ { ++ packages.add ("libjpeg"); ++ packages.add ("libpng"); ++ } ++ if (project.getEnabledModules().isModuleEnabled ("juce_audio_formats")) ++ { ++ if(project.isConfigFlagEnabled ("JUCE_USE_FLAC", true)) ++ { ++ packages.add ("flac"); ++ } ++ ++ if(project.isConfigFlagEnabled ("JUCE_USE_OGGVORBIS", true)) ++ { ++ packages.add ("vorbis"); ++ packages.add ("vorbisfile"); ++ packages.add ("vorbisenc"); ++ packages.add ("ogg"); ++ } ++ } ++ if (project.getEnabledModules().isModuleEnabled ("juce_audio_devices")) ++ { ++ if(project.isConfigFlagEnabled ("JUCE_JACK", true)) ++ { ++ packages.add ("jack"); ++ } ++ } + packages.removeDuplicates (false); + + return packages; +@@ -563,6 +596,9 @@ + StringArray result (linuxLibs); + + auto libraries = StringArray::fromTokens (getExternalLibrariesString(), ";", "\"'"); ++#ifdef DEBIAN_JUCERPROJECT_LIBS ++ libraries.addArray(StringArray::fromTokens (DEBIAN_JUCERPROJECT_LIBS, ";", "\"'")); ++#endif + libraries.removeEmptyStrings(); + + for (auto& lib : libraries) diff --git a/patches/debian_no-update-check.patch b/patches/debian_no-update-check.patch new file mode 100644 index 00000000..3cf23572 --- /dev/null +++ b/patches/debian_no-update-check.patch @@ -0,0 +1,21 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Thu, 9 Nov 2017 00:00:00 +0100 +Subject: prevent Projucer from checking for updates + + The check-for-updates only makes sense for user-installed Projucer, not for + the Debian packaged version. +Forwarded: not-needed +--- + extras/Projucer/Source/Application/jucer_AutoUpdater.cpp | 1 + + 1 file changed, 1 insertion(+) + +--- juce.orig/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp ++++ juce/extras/Projucer/Source/Application/jucer_AutoUpdater.cpp +@@ -42,6 +42,7 @@ + + void LatestVersionCheckerAndUpdater::checkForNewVersion (bool showAlerts) + { ++ return; // DONT check for new versions on Debian + if (! isThreadRunning()) + { + showAlertWindows = showAlerts; diff --git a/patches/debian_no-usagedata.patch b/patches/debian_no-usagedata.patch new file mode 100644 index 00000000..c3ae4901 --- /dev/null +++ b/patches/debian_no-usagedata.patch @@ -0,0 +1,26 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Mon, 26 Mar 2018 00:00:00 +0200 +Subject: default to not-sending usage-data to ROLI + + we prefer to have privacy enabled by default... +Forwarded: no +--- + .../Application/Windows/jucer_ApplicationUsageDataWindowComponent.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- juce.orig/extras/Projucer/Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h ++++ juce/extras/Projucer/Source/Application/Windows/jucer_ApplicationUsageDataWindowComponent.h +@@ -69,10 +69,10 @@ + + auto* controller = ProjucerApplication::getApp().licenseController.get(); + +- if (controller != nullptr && controller->getState().applicationUsageDataState == LicenseState::ApplicationUsageData::disabled) +- shareApplicationUsageDataToggle->setToggleState (false, dontSendNotification); +- else ++ if (controller != nullptr && controller->getState().applicationUsageDataState == LicenseState::ApplicationUsageData::enabled) + shareApplicationUsageDataToggle->setToggleState (true, dontSendNotification); ++ else ++ shareApplicationUsageDataToggle->setToggleState (false, dontSendNotification); + + addAndMakeVisible (shareApplicationUsageDataLabel); + shareApplicationUsageDataLabel.setFont (Font (14.0f)); diff --git a/patches/debian_python3.patch b/patches/debian_python3.patch new file mode 100644 index 00000000..3136281d --- /dev/null +++ b/patches/debian_python3.patch @@ -0,0 +1,21 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Sat, 10 Feb 2018 00:00:00 +0100 +Subject: use Python3 rather than Python2 + + for building the documentation +Forwarded: no +--- + doxygen/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- juce.orig/doxygen/Makefile ++++ juce/doxygen/Makefile +@@ -8,7 +8,7 @@ + doxygen + + build/juce_modules.dox: process_source_files.py $(SOURCE_FILES) +- python $< ../modules build ++ python3 $< ../modules build + + clean: + rm -rf build doc diff --git a/patches/debian_system_modules.patch b/patches/debian_system_modules.patch new file mode 100644 index 00000000..38bfb382 --- /dev/null +++ b/patches/debian_system_modules.patch @@ -0,0 +1,22 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Tue, 19 Dec 2017 00:00:00 +0100 +Subject: default JUCE-module path for Projucer + + On Debian we have the module-sources installed in /usr/share/juce/modules + and should use those if possible. +Forwarded: not-needed +--- + extras/Projucer/Source/Settings/jucer_StoredSettings.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- juce.orig/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp ++++ juce/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp +@@ -385,7 +385,7 @@ + } + else if (key == Ids::defaultJuceModulePath) + { +- return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "~/JUCE/modules"); ++ return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "/usr/share/juce/modules"); + } + else if (key == Ids::defaultUserModulePath) + { diff --git a/patches/debian_unittests_globalpaths.patch b/patches/debian_unittests_globalpaths.patch new file mode 100644 index 00000000..fb6094d2 --- /dev/null +++ b/patches/debian_unittests_globalpaths.patch @@ -0,0 +1,57 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Wed, 11 Apr 2018 00:00:00 +0200 +Subject: Use global paths for JUCE modules in UnitTests + +Forwarded: not-needed +--- + extras/UnitTestRunner/UnitTestRunner.jucer | 38 +++++++++++++++--------------- + 1 file changed, 19 insertions(+), 19 deletions(-) + +--- juce.orig/extras/UnitTestRunner/UnitTestRunner.jucer ++++ juce/extras/UnitTestRunner/UnitTestRunner.jucer +@@ -123,26 +123,26 @@ + + + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- ++ useGlobalPath="1"/> ++ + + + diff --git a/patches/debian_vst.patch b/patches/debian_vst.patch new file mode 100644 index 00000000..2ff02c5e --- /dev/null +++ b/patches/debian_vst.patch @@ -0,0 +1,56 @@ +Description: provide missing VST2 replacement header + backprted from the original JUCE-5.3.1 header +Author: IOhannes m zmölnig +Last-Update: 2019-01-12 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- juce.orig/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp ++++ juce/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +@@ -101,8 +101,7 @@ + // field in the Projucer. The VST2 SDK can be obtained from the + // vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. You + // also need a VST2 license from Steinberg to distribute VST2 plug-ins. +-#include "pluginterfaces/vst2.x/aeffect.h" +-#include "pluginterfaces/vst2.x/aeffectx.h" ++#include "../../juce_audio_processors/format_types/juce_VSTInterface.h" + } + + using namespace juce; +@@ -124,7 +123,6 @@ + #pragma pack (push, 8) + #endif + +-#define JUCE_VSTINTERFACE_H_INCLUDED 1 + + #include "../utility/juce_IncludeModuleHeaders.h" + #include "../utility/juce_FakeMouseMoveGenerator.h" +--- juce.orig/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp ++++ juce/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +@@ -49,7 +49,6 @@ + #endif + + #define VST_FORCE_DEPRECATED 0 +-#define JUCE_VSTINTERFACE_H_INCLUDED 1 + + namespace Vst2 + { +@@ -58,8 +57,7 @@ + // paths or use the "VST (Legacy) SDK Folder" field in the Projucer. The VST2 + // SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3 + // SDK or JUCE version 5.3.2. +-#include +-#include ++#include "../../juce_audio_processors/format_types/juce_VSTInterface.h" + } + + #include "juce_VSTCommon.h" +@@ -81,6 +79,9 @@ + + #include "juce_VSTMidiEventList.h" + ++#define resvd2 hostSpace2 ++#define nanoSeconds systemTimeNanoseconds ++ + #if JUCE_MINGW + #ifndef WM_APPCOMMAND + #define WM_APPCOMMAND 0x0319 diff --git a/patches/jack-client-name.patch b/patches/jack-client-name.patch new file mode 100644 index 00000000..ab7c4164 --- /dev/null +++ b/patches/jack-client-name.patch @@ -0,0 +1,28 @@ +From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= +Date: Thu, 12 Apr 2018 00:00:00 +0200 +Subject: meaningful default JACK client name + + rather than "JUCEJack" for all jack standalone apps, + use the . + +Bug: https://github.com/WeAreROLI/JUCE/issues/331 +Forwarded: https://github.com/WeAreROLI/JUCE/pull/351 +--- + modules/juce_audio_devices/native/juce_linux_JackAudio.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- juce.orig/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp ++++ juce/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +@@ -105,7 +105,11 @@ + + //============================================================================== + #ifndef JUCE_JACK_CLIENT_NAME +- #define JUCE_JACK_CLIENT_NAME "JUCEJack" ++ #ifdef JucePlugin_Name ++ # define JUCE_JACK_CLIENT_NAME JucePlugin_Name ++ #else ++ # define JUCE_JACK_CLIENT_NAME "JUCEJack" ++ #endif + #endif + + struct JackPortIterator diff --git a/patches/series b/patches/series new file mode 100644 index 00000000..78e70087 --- /dev/null +++ b/patches/series @@ -0,0 +1,12 @@ +jack-client-name.patch +LV2-audioprocessor.patch +debian_fixed-defines.patch +debian_gpl_variant.patch +debian_no-update-check.patch +debian_no-usagedata.patch +debian_system_modules.patch +debian_python3.patch +debian_unittests_globalpaths.patch +debian_vst.patch +debian_link_systemlibs.patch +spelling.patch diff --git a/patches/spelling.patch b/patches/spelling.patch new file mode 100644 index 00000000..ba5f005c --- /dev/null +++ b/patches/spelling.patch @@ -0,0 +1,17 @@ +Description: fixed spelling mistakes +Author: IOhannes m zmölnig +Forwarded: no +Last-Update: 2019-01-12 +--- +This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ +--- juce.orig/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h ++++ juce/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +@@ -453,7 +453,7 @@ + + props.add (new TextPropertyComponent (subprojectsValue, "Xcode Subprojects", 8192, true), + "Paths to Xcode projects that should be added to the build (one per line). " +- "The names of the required build products can be specified after a colon, comma seperated, " ++ "The names of the required build products can be specified after a colon, comma separated, " + "e.g. \"path/to/MySubProject.xcodeproj: MySubProject, OtherTarget\". " + "If no build products are specified, all build products associated with a subproject will be added."); + diff --git a/rules b/rules new file mode 100755 index 00000000..79422bef --- /dev/null +++ b/rules @@ -0,0 +1,87 @@ +#!/usr/bin/make -f +# -*- mode: makefile; coding: utf-8 -*- +# Copyright © 2015 IOhannes m zmölnig +# Description: Main Debian packaging script for JUCE + +## export dummy TARGET_ARCH that doesn't do much, +## but disables "-march=native" optimization +export TARGET_ARCH=-Wl,--as-needed + +DEB_SRCDIR=extras/Projucer/Builds/LinuxMakefile +DEBIAN_BUILD_ARTIFACTS = debian/artifacts + +DEB_COPYRIGHT_CHECK_IGNORE_REGEX = \ + \.git/.*|debian/.*|.*\.gif|.*\.jpg|.*\.JPG|.*\.png|.*\.ico|.*\.icns|.*\.wav|.*\.caf|.*\.ogg|.*\.mp3|.*\.pdf|.*\.keystore|.*\.nib|.*/gradle-wrapper\.jar|.*\.zip + + +#DEB_COPYRIGHT_CHECK_IGNORE_REGEX = \ +#^((.*\.jpg)|(.*\.JPG)|(.*\.gif)|(.*\.png)|(.*\.ico)|(.*\.icns)|(gradle-wrapper\.jar)|(.*\.mp3)|(.*\.caf)|(.*\.nib)|examples/InAppPurchase/Signing/InAppPurchase\.keystore|examples/(InAppPurchase/BinaryData/(Robot|Ed|Jules|JB|Fabian|Lukasz)[012]\.ogg|AUv3Synth|PlugInSamples/MultiOutSynth)/Source/BinaryData/singing\.ogg|examples/Demo/Resources/cello\.wav|examples/Demo/Resources/icons\.zip|modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources\.rsr|examples/ComponentTutorialExample/Introduction to Components - Part 1\.pdf|debian/(changelog|copyright(|_hints|_newhints)))$ + +LDFLAGS += $(shell pkg-config --libs libjpeg libpng zlib) + +# JUCE uses some c++11 features requiring atomic_store_8 and +# atomic_load_8, so we need to link with libatomic on +# armel, powerpc, powerpcspe, m68k, mips, mipsel, sh4, ... +# see also: +# - https://gcc.gnu.org/wiki/Atomic +# - https://gcc.gnu.org/wiki/Atomic/GCCMM/LIbrary +# - the 'clasp' packaging +noatomicarch = $(shell dpkg-architecture -qDEB_HOST_ARCH | egrep -x "(armel|armhf|powerpc|powerpcspe|m68k|mips|mipsel|sh4|riscv64)") +# link with libatomic on architectures without built-in atomic +ifeq ($(if $(noatomicarch),atomic), atomic) + LDFLAGS += -latomic + CPPFLAGS += -DDEBIAN_JUCERPROJECT_LIBS='\"atomic\"' +endif + +%: + dh $@ + +override_dh_auto_build-arch: + cp $(CURDIR)/examples/DemoRunner/Builds/iOS/DemoRunner/Images.xcassets/AppIcon.appiconset/Icon.png \ + $(DEBIAN_BUILD_ARTIFACTS)/juce.png + dh_auto_build -D $(DEB_SRCDIR) -- \ + V=1 \ + LDFLAGS="$(LDFLAGS)" \ + CPPFLAGS="$(CPPFLAGS)" \ + $(empty) + make -C debian/extra/lv2-ttl-generator/ + help2man -N \ + --version-string="Projucer $(DEB_UPSTREAM_VERSION)" \ + -n "the JUCE project-management tool" \ + debian/scripts/Projucer-help2man \ + > $(DEBIAN_BUILD_ARTIFACTS)/Projucer.1 + +override_dh_auto_build-indep: + make -C doxygen + +override_dh_auto_install-arch: + install -d debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/juce/lv2-ttl-generator + install debian/extra/lv2-ttl-generator/lv2_ttl_generator debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/juce/lv2-ttl-generator/lv2_ttl_generator + install debian/extra/lv2-ttl-generator/generate-ttl.sh debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/juce/lv2-ttl-generator/generate-ttl.sh + +override_dh_auto_install-indep: + -dh_doxygen doxygen/doc/ + +override_dh_install-indep: + dh_install --indep -X.tag + -find $(CURDIR)/debian/juce-modules-source/usr/share/juce \ + -type f -executable \ + '(' -name "*.h" -or -name "*.cpp" ')' \ + -exec chmod -c 0644 {} + + +override_dh_installchangelogs: + dh_installchangelogs ChangeList.txt + +override_dh_clean: + dh_clean + make -C doxygen/ clean + make -C debian/extra/lv2-ttl-generator/ clean + rm -rf build $(DEB_SRCDIR)/build + rm -f $(DEBIAN_BUILD_ARTIFACTS)/* + + +licensecheck: + licensecheck -i "^\./($(DEB_COPYRIGHT_CHECK_IGNORE_REGEX))$$" --deb-machine -r . \ + > debian/copyright_newhints + cmp debian/copyright_hints debian/copyright_newhints \ + && rm debian/copyright_newhints diff --git a/scripts/Projucer-help2man b/scripts/Projucer-help2man new file mode 100755 index 00000000..6e955d04 --- /dev/null +++ b/scripts/Projucer-help2man @@ -0,0 +1,38 @@ +#!/bin/sh +PROJUCER=$(pwd)/extras/Projucer/Builds/Linux/build/Projucer +LIBJUCE_PATH=$(pwd)/debian/libbuilder/build + +if [ -d "${LIBJUCE_PATH}" ]; then + LD_LIBRARY_PATH=${LIBJUCE_PATH}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} + export LD_LIBRARY_PATH +fi + +#PROJUCER=Projucer + +case "$1" in + -h|--help) + #${PROJUCER} -h 2>/dev/null | sed -e 's|^ Projucer --| --|' + cat <