Import juce_5.4.4~repack0-3+rpi1.debian.tar.xz
authorPeter Michael Green <plugwash@raspbian.org>
Sat, 30 Nov 2019 15:26:20 +0000 (15:26 +0000)
committerPeter Michael Green <plugwash@raspbian.org>
Sat, 30 Nov 2019 15:26:20 +0000 (15:26 +0000)
[dgit import tarball juce 5.4.4~repack0-3+rpi1 juce_5.4.4~repack0-3+rpi1.debian.tar.xz]

49 files changed:
NEWS [new file with mode: 0644]
Projucer.desktop [new file with mode: 0644]
README.Debian [new file with mode: 0644]
README.libjuce-doc [new file with mode: 0644]
README.source [new file with mode: 0644]
TODO.Debian [new file with mode: 0644]
artifacts/.empty [new file with mode: 0644]
changelog [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
copyright_hints [new file with mode: 0644]
extra/juce_audio_plugin_client/LV2/includes/lv2_external_ui.h [new file with mode: 0644]
extra/juce_audio_plugin_client/LV2/includes/lv2_programs.h [new file with mode: 0644]
extra/juce_audio_plugin_client/LV2/juce_LV2_Wrapper.cpp [new file with mode: 0644]
extra/juce_audio_plugin_client/juce_audio_plugin_client_LV2.cpp [new file with mode: 0644]
extra/juce_audio_processors/format_types/juce_VSTInterface.h [new file with mode: 0644]
extra/lv2-ttl-generator/GNUmakefile [new file with mode: 0644]
extra/lv2-ttl-generator/generate-ttl.sh [new file with mode: 0755]
extra/lv2-ttl-generator/lv2_ttl_generator.c [new file with mode: 0644]
extra/lv2-ttl-generator/readme.txt [new file with mode: 0644]
gbp.conf [new file with mode: 0644]
gbp/postclone.sh [new file with mode: 0755]
juce-modules-source.doc [new file with mode: 0644]
juce-modules-source.install [new file with mode: 0644]
juce-tools.install [new file with mode: 0644]
juce-tools.manpages [new file with mode: 0644]
juce-tools.mime [new file with mode: 0644]
juce-tools.sharedmimeinfo [new file with mode: 0644]
libjuce-doc.doc-base [new file with mode: 0644]
libjuce-doc.install [new file with mode: 0644]
patches/LV2-audioprocessor.patch [new file with mode: 0644]
patches/debian_fixed-defines.patch [new file with mode: 0644]
patches/debian_gpl_variant.patch [new file with mode: 0644]
patches/debian_link_systemlibs.patch [new file with mode: 0644]
patches/debian_no-update-check.patch [new file with mode: 0644]
patches/debian_no-usagedata.patch [new file with mode: 0644]
patches/debian_python3.patch [new file with mode: 0644]
patches/debian_system_modules.patch [new file with mode: 0644]
patches/debian_unittests_globalpaths.patch [new file with mode: 0644]
patches/debian_vst.patch [new file with mode: 0644]
patches/jack-client-name.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
patches/spelling.patch [new file with mode: 0644]
rules [new file with mode: 0755]
scripts/Projucer-help2man [new file with mode: 0755]
source/format [new file with mode: 0644]
tests/control [new file with mode: 0644]
tests/juce-unit-tests [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..56aceb7
--- /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) <umlaeute@debian.org>  Thu, 09 Nov 2017 13:46:52 +0100
diff --git a/Projucer.desktop b/Projucer.desktop
new file mode 100644 (file)
index 0000000..2b2a879
--- /dev/null
@@ -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 (file)
index 0000000..9406630
--- /dev/null
@@ -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 (= <<version>>)' to debian/control
+  (replace '<<version>>' 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 (file)
index 0000000..bd2012e
--- /dev/null
@@ -0,0 +1,5 @@
+the HTML documentation can be found in
+    /usr/share/doc/juce-modules-source/apiref/
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  Sun, 11 Feb 2018 10:42:03 +0100
+
diff --git a/README.source b/README.source
new file mode 100644 (file)
index 0000000..86a78e2
--- /dev/null
@@ -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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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 <<EOF
+    [clone]
+    postclone = ~/bin/gbphook-postclone
+    EOF
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  Mon, 1 Aug 2016 12:15:50 +0200
diff --git a/TODO.Debian b/TODO.Debian
new file mode 100644 (file)
index 0000000..efc9c4b
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..728cf49
--- /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 <plugwash@raspbian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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 <lamby@debian.org> for the last two
+  * Re-enabled LV2 support (Closes: #889969)
+    * Refreshed LV2 sources
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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 <pabs@debian.org> (Closes: 820653)
+  * Set BUILD_TIME from d/changelog
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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 <tobi@debian.org> (Closes: #819438)
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  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) <umlaeute@debian.org>  Fri, 12 Feb 2016 07:46:59 +0100
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..e7bf27f
--- /dev/null
+++ b/control
@@ -0,0 +1,109 @@
+Source: juce
+Section: devel
+Priority: optional
+Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
+Uploaders:
+ IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>,
+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 (file)
index 0000000..07be548
--- /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: <umlaeute@debian.org>
+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 <umlaeute@debian.org>
+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 <falkTX>
+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) <falktx@falktx.com>
+ 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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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. <http://fsf.org/>
+ 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.
+ .
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year>  <name of author>
+ .
+ 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
+ <http://www.gnu.org/licenses/>.
+ .
+ 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 <http://www.gnu.org/licenses/>.
+
+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 (file)
index 0000000..1f0c8d4
--- /dev/null
@@ -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.</string>
+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 (file)
index 0000000..789cd3f
--- /dev/null
@@ -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) <falktx@falktx.com>
+  or ask in #lad channel, FreeNode IRC network.
+*/
+
+/**
+   @file lv2_external_ui.h
+   C header for the LV2 External UI extension <http://kxstudio.sf.net/ns/lv2ext/external-ui>.
+*/
+
+#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 (file)
index 0000000..01e2877
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+  LV2 Programs Extension
+  Copyright 2012 Filipe Coelho <falktx@falktx.com>
+
+  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 <http://kxstudio.sf.net/ns/lv2ext/programs>.
+*/
+
+#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 (file)
index 0000000..1c1f616
--- /dev/null
@@ -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 <X11/Xlib.h>
+ #undef KeyPress
+#endif
+
+#include <fstream>
+#include <iostream>
+
+// LV2 includes..
+#include <lv2/lv2plug.in/ns/lv2core/lv2.h>
+#include <lv2/lv2plug.in/ns/ext/atom/atom.h>
+#include <lv2/lv2plug.in/ns/ext/atom/util.h>
+#include <lv2/lv2plug.in/ns/ext/buf-size/buf-size.h>
+#include <lv2/lv2plug.in/ns/ext/instance-access/instance-access.h>
+#include <lv2/lv2plug.in/ns/ext/midi/midi.h>
+#include <lv2/lv2plug.in/ns/ext/options/options.h>
+#include <lv2/lv2plug.in/ns/ext/port-props/port-props.h>
+#include <lv2/lv2plug.in/ns/ext/presets/presets.h>
+#include <lv2/lv2plug.in/ns/ext/state/state.h>
+#include <lv2/lv2plug.in/ns/ext/time/time.h>
+#include <lv2/lv2plug.in/ns/extensions/ui/ui.h>
+#include <lv2/lv2plug.in/ns/ext/urid/urid.h>
+#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<String> 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: <http://www.w3.org/2000/01/rdf-schema#> .\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 <presets.ttl> .\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: <http://usefulinc.com/ns/doap#> .\n";
+    text += "@prefix foaf: <http://xmlns.com/foaf/0.1/> .\n";
+    text += "@prefix lv2:  <" LV2_CORE_PREFIX "> .\n";
+    text += "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\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:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n";
+    text += "@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .\n";
+    text += "@prefix state: <" LV2_STATE_PREFIX "> .\n";
+    text += "@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .\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<AudioProcessor> 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<int> getLastPos()
+    {
+        return lastPos;
+    }
+
+    bool isClosed()
+    {
+        return closed;
+    }
+
+    void reset()
+    {
+        closed = false;
+    }
+
+private:
+    bool closed;
+    Point<int> 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<int> 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<AudioProcessorEditor> 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<JuceLv2ExternalUIWrapper> externalUI;
+    const LV2_External_UI_Host* externalUIHost;
+    Point<int> lastExternalUIPos;
+
+    ScopedPointer<JuceLv2ParentContainer> 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<const char*>(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<SharedMessageThread> msgThread;
+#else
+    SharedResourcePointer<ScopedJuceInitialiser_GUI> sharedJuceGUI;
+#endif
+
+    ScopedPointer<AudioProcessor> filter;
+#if ! JUCE_AUDIOPROCESSOR_NO_GUI
+    ScopedPointer<JuceLv2UIWrapper> ui;
+#endif
+    HeapBlock<float*> 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<float*> portControls;
+
+    uint32 bufferSize;
+    double sampleRate;
+    Array<float> 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 (file)
index 0000000..dc507e1
--- /dev/null
@@ -0,0 +1,27 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2017 - ROLI Ltd.\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 5 End-User License\r
+   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the\r
+   27th April 2017).\r
+\r
+   End User License Agreement: www.juce.com/juce-5-licence\r
+   Privacy Policy: www.juce.com/juce-5-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+#include "LV2/juce_LV2_Wrapper.cpp"\r
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 (file)
index 0000000..f531e63
--- /dev/null
@@ -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 (file)
index 0000000..024f2a1
--- /dev/null
@@ -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 (executable)
index 0000000..d5ef597
--- /dev/null
@@ -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 (file)
index 0000000..bd19f41
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * JUCE LV2 *.ttl generator
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef _WIN32
+ #include <windows.h>
+ #define TTL_GENERATOR_WINDOWS
+#else
+ #include <dlfcn.h>
+#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 (file)
index 0000000..0bd3ab5
--- /dev/null
@@ -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 (file)
index 0000000..cd3fa3d
--- /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 (executable)
index 0000000..5790ec6
--- /dev/null
@@ -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 (file)
index 0000000..ab3c330
--- /dev/null
@@ -0,0 +1 @@
+BREAKING-CHANGES.txt
diff --git a/juce-modules-source.install b/juce-modules-source.install
new file mode 100644 (file)
index 0000000..4899195
--- /dev/null
@@ -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 (file)
index 0000000..055151e
--- /dev/null
@@ -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 (file)
index 0000000..08dbe24
--- /dev/null
@@ -0,0 +1 @@
+debian/artifacts/Projucer.1
diff --git a/juce-tools.mime b/juce-tools.mime
new file mode 100644 (file)
index 0000000..643f3da
--- /dev/null
@@ -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 (file)
index 0000000..043dfa0
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/x-juce">
+    <sub-class-of type="text/xml"/>
+    <comment>JUCE project</comment>
+    <glob pattern="*.jucer"/>
+  </mime-type>
+</mime-info>
diff --git a/libjuce-doc.doc-base b/libjuce-doc.doc-base
new file mode 100644 (file)
index 0000000..6c987e3
--- /dev/null
@@ -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 (file)
index 0000000..49e157f
--- /dev/null
@@ -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 (file)
index 0000000..e8cf7b3
--- /dev/null
@@ -0,0 +1,73 @@
+From: Filipe Coelho <falkTX>
+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 @@
+     */\r
+     virtual void setNonRealtime (bool isNonRealtime) noexcept;\r
\r
++   #if ! JUCE_AUDIOPROCESSOR_NO_GUI\r
+     //==============================================================================\r
+     /** Creates the processor's GUI.\r
\r
+@@ -973,6 +974,7 @@
+         This may call createEditor() internally to create the component.\r
+     */\r
+     AudioProcessorEditor* createEditorIfNeeded();\r
++   #endif\r
\r
+     //==============================================================================\r
+     /** Returns the default number of steps for a parameter.\r
+@@ -1108,6 +1110,11 @@
+     virtual void processorLayoutsChanged();\r
\r
+     //==============================================================================\r
++    /** LV2 specific calls, saving/restore as string. */\r
++    virtual String getStateInformationString () { return String(); }\r
++    virtual void setStateInformationString (const String&) {}\r
++\r
++    //==============================================================================\r
+     /** Adds a listener that will be called when an aspect of this processor changes. */\r
+     virtual void addListener (AudioProcessorListener* newListener);\r
\r
+@@ -1177,9 +1184,11 @@
\r
+     virtual CurveData getResponseCurve (CurveData::Type /*curveType*/) const      { return {}; }\r
\r
++   #if ! JUCE_AUDIOPROCESSOR_NO_GUI\r
+     //==============================================================================\r
+     /** Not for public use - this is called before deleting an editor component. */\r
+     void editorBeingDeleted (AudioProcessorEditor*) noexcept;\r
++   #endif\r
\r
+     /** Flags to indicate the type of plugin context in which a processor is being used. */\r
+     enum WrapperType\r
+@@ -1193,6 +1202,7 @@
+         wrapperType_AAX,\r
+         wrapperType_Standalone,\r
+         wrapperType_Unity\r
++        , wrapperType_LV2\r
+     };\r
\r
+     /** When loaded by a plugin wrapper, this flag will be set to indicate the type\r
+@@ -1453,7 +1463,9 @@
\r
+     //==============================================================================\r
+     Array<AudioProcessorListener*> listeners;\r
++   #if ! JUCE_AUDIOPROCESSOR_NO_GUI\r
+     Component::SafePointer<AudioProcessorEditor> activeEditor;\r
++   #endif\r
+     double currentSampleRate = 0;\r
+     int blockSize = 0, latencySamples = 0;\r
+     bool suspended = false, nonRealtime = false;\r
diff --git a/patches/debian_fixed-defines.patch b/patches/debian_fixed-defines.patch
new file mode 100644 (file)
index 0000000..7486e10
--- /dev/null
@@ -0,0 +1,102 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 @@
+   ==============================================================================\r
+ */\r
\r
++/* Debian specific overrides */\r
++#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI)\r
++# warning JUCE/Debian using default LV2URI\r
++# define JucePlugin_LV2URI               JucePlugin_Name\r
++#endif\r
++\r
++#if JucePlugin_Build_AU\r
++# warning JUCE/Debian disabled AU support\r
++# undef JucePlugin_Build_AU\r
++# define JucePlugin_Build_AU 0\r
++#endif\r
++\r
++#if JucePlugin_Build_RTAS\r
++# warning JUCE/Debian disabled RTAS support\r
++# undef JucePlugin_Build_RTAS\r
++# define JucePlugin_Build_RTAS 0\r
++#endif\r
++\r
++#if JucePlugin_Build_AAX\r
++# warning JUCE/Debian disabled AAX support\r
++# undef JucePlugin_Build_AAX\r
++# define JucePlugin_Build_AAX 0\r
++#endif\r
++\r
+ // The following checks should cause a compile error if you've forgotten to\r
+ // define all your plugin settings properly..\r
\r
+@@ -40,6 +64,7 @@
+ #endif\r
+ #define JUCE_CHECKSETTINGMACROS_H\r
\r
++\r
+ #ifndef JucePlugin_IsSynth\r
+  #error "You need to define the JucePlugin_IsSynth value!"\r
+ #endif\r
+--- juce.orig/modules/juce_core/juce_core.h
++++ juce/modules/juce_core/juce_core.h
+@@ -64,6 +64,36 @@
\r
+ #include "system/juce_TargetPlatform.h"\r
\r
++/** Debian specific constants\r
++  - Debian, we don't use embedded libraries\r
++*/\r
++#ifdef JUCE_INCLUDE_ZLIB_CODE\r
++# undef JUCE_INCLUDE_ZLIB_CODE\r
++#endif\r
++#define JUCE_INCLUDE_ZLIB_CODE 0\r
++\r
++#ifdef JUCE_INCLUDE_FLAC_CODE\r
++# undef JUCE_INCLUDE_FLAC_CODE\r
++#endif\r
++#define JUCE_INCLUDE_FLAC_CODE 0\r
++\r
++#ifdef JUCE_INCLUDE_OGGVORBIS_CODE\r
++# undef JUCE_INCLUDE_OGGVORBIS_CODE\r
++#endif\r
++#define JUCE_INCLUDE_OGGVORBIS_CODE 0\r
++\r
++#ifdef JUCE_INCLUDE_JPEGLIB_CODE\r
++# undef JUCE_INCLUDE_JPEGLIB_CODE\r
++#endif\r
++#define JUCE_INCLUDE_JPEGLIB_CODE 0\r
++\r
++#ifdef JUCE_INCLUDE_PNGLIB_CODE\r
++# undef JUCE_INCLUDE_PNGLIB_CODE\r
++#endif\r
++#define JUCE_INCLUDE_PNGLIB_CODE 0\r
++/** Debian specifics END\r
++*/\r
++\r
+ //==============================================================================\r
+ /** Config: JUCE_FORCE_DEBUG\r
\r
+@@ -123,7 +153,7 @@
+     specify the path where your zlib headers live.\r
+ */\r
+ #ifndef JUCE_INCLUDE_ZLIB_CODE\r
+- #define JUCE_INCLUDE_ZLIB_CODE 1\r
++ #define JUCE_INCLUDE_ZLIB_CODE 0\r
+ #endif\r
\r
+ #ifndef JUCE_ZLIB_INCLUDE_PATH\r
diff --git a/patches/debian_gpl_variant.patch b/patches/debian_gpl_variant.patch
new file mode 100644 (file)
index 0000000..22499ff
--- /dev/null
@@ -0,0 +1,20 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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\r
\r
+ #ifndef JUCER_ENABLE_GPL_MODE\r
+- #define JUCER_ENABLE_GPL_MODE 0\r
++ #define JUCER_ENABLE_GPL_MODE 1\r
+ #endif\r
\r
+ // END SECTION A\r
diff --git a/patches/debian_link_systemlibs.patch b/patches/debian_link_systemlibs.patch
new file mode 100644 (file)
index 0000000..4be7166
--- /dev/null
@@ -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())\r
+             packages.add ("libcurl");\r
\r
++        // on Debian, a number of 3rd-party libs have been stripped away,\r
++        // so we need to link to the system libraries\r
++        if (project.getEnabledModules().isModuleEnabled ("juce_core"))\r
++        {\r
++            packages.add ("zlib");\r
++        }\r
++        if (project.getEnabledModules().isModuleEnabled ("juce_graphics"))\r
++        {\r
++            packages.add ("libjpeg");\r
++            packages.add ("libpng");\r
++        }\r
++        if (project.getEnabledModules().isModuleEnabled ("juce_audio_formats"))\r
++        {\r
++            if(project.isConfigFlagEnabled ("JUCE_USE_FLAC", true))\r
++            {\r
++                packages.add ("flac");\r
++            }\r
++\r
++            if(project.isConfigFlagEnabled ("JUCE_USE_OGGVORBIS", true))\r
++            {\r
++                packages.add ("vorbis");\r
++                packages.add ("vorbisfile");\r
++                packages.add ("vorbisenc");\r
++                packages.add ("ogg");\r
++            }\r
++        }\r
++        if (project.getEnabledModules().isModuleEnabled ("juce_audio_devices"))\r
++        {\r
++            if(project.isConfigFlagEnabled ("JUCE_JACK", true))\r
++            {\r
++                packages.add ("jack");\r
++            }\r
++        }\r
+         packages.removeDuplicates (false);\r
\r
+         return packages;\r
+@@ -563,6 +596,9 @@
+         StringArray result (linuxLibs);\r
\r
+         auto libraries = StringArray::fromTokens (getExternalLibrariesString(), ";", "\"'");\r
++#ifdef DEBIAN_JUCERPROJECT_LIBS\r
++        libraries.addArray(StringArray::fromTokens (DEBIAN_JUCERPROJECT_LIBS, ";", "\"'"));\r
++#endif\r
+         libraries.removeEmptyStrings();\r
\r
+         for (auto& lib : libraries)\r
diff --git a/patches/debian_no-update-check.patch b/patches/debian_no-update-check.patch
new file mode 100644 (file)
index 0000000..3cf2357
--- /dev/null
@@ -0,0 +1,21 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 @@
\r
+ void LatestVersionCheckerAndUpdater::checkForNewVersion (bool showAlerts)\r
+ {\r
++    return; // DONT check for new versions on Debian\r
+     if (! isThreadRunning())\r
+     {\r
+         showAlertWindows = showAlerts;\r
diff --git a/patches/debian_no-usagedata.patch b/patches/debian_no-usagedata.patch
new file mode 100644 (file)
index 0000000..c3ae490
--- /dev/null
@@ -0,0 +1,26 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 @@
\r
+             auto* controller = ProjucerApplication::getApp().licenseController.get();\r
\r
+-            if (controller != nullptr && controller->getState().applicationUsageDataState == LicenseState::ApplicationUsageData::disabled)\r
+-                shareApplicationUsageDataToggle->setToggleState (false, dontSendNotification);\r
+-            else\r
++            if (controller != nullptr && controller->getState().applicationUsageDataState == LicenseState::ApplicationUsageData::enabled)\r
+                 shareApplicationUsageDataToggle->setToggleState (true, dontSendNotification);\r
++            else\r
++                shareApplicationUsageDataToggle->setToggleState (false, dontSendNotification);\r
\r
+             addAndMakeVisible (shareApplicationUsageDataLabel);\r
+             shareApplicationUsageDataLabel.setFont (Font (14.0f));\r
diff --git a/patches/debian_python3.patch b/patches/debian_python3.patch
new file mode 100644 (file)
index 0000000..3136281
--- /dev/null
@@ -0,0 +1,21 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 (file)
index 0000000..38bfb38
--- /dev/null
@@ -0,0 +1,22 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 @@
+     }\r
+     else if (key == Ids::defaultJuceModulePath)\r
+     {\r
+-        return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "~/JUCE/modules");\r
++        return (os == TargetOS::windows ? "C:\\JUCE\\modules" : "/usr/share/juce/modules");\r
+     }\r
+     else if (key == Ids::defaultUserModulePath)\r
+     {\r
diff --git a/patches/debian_unittests_globalpaths.patch b/patches/debian_unittests_globalpaths.patch
new file mode 100644 (file)
index 0000000..fb6094d
--- /dev/null
@@ -0,0 +1,57 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 @@
+     </VS2019>\r
+   </EXPORTFORMATS>\r
+   <MODULES>\r
+-    <MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
+-    <MODULES id="juce_audio_basics" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_audio_devices" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_audio_formats" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_audio_processors" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
+-    <MODULE id="juce_blocks_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
+-    <MODULES id="juce_core" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_cryptography" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_data_structures" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULE id="juce_dsp" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>\r
+-    <MODULES id="juce_events" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_graphics" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_gui_basics" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_gui_extra" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_opengl" showAllCode="1" useLocalCopy="0"/>\r
+-    <MODULES id="juce_osc" showAllCode="1" useLocalCopy="0"/>\r
++    <MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_audio_processors" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULE id="juce_audio_utils" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULE id="juce_blocks_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_core" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_cryptography" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_data_structures" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULE id="juce_dsp" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_events" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_opengl" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
++    <MODULES id="juce_osc" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
+     <MODULE id="juce_product_unlocking" showAllCode="1" useLocalCopy="0"\r
+-            useGlobalPath="0"/>\r
+-    <MODULES id="juce_video" showAllCode="1" useLocalCopy="0"/>\r
++            useGlobalPath="1"/>\r
++    <MODULES id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="1"/>\r
+   </MODULES>\r
+   <JUCEOPTIONS JUCE_STRICT_REFCOUNTEDPOINTER="1"/>\r
+   <LIVE_SETTINGS>\r
diff --git a/patches/debian_vst.patch b/patches/debian_vst.patch
new file mode 100644 (file)
index 0000000..2ff02c5
--- /dev/null
@@ -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\r
+ // vstsdk3610_11_06_2018_build_37 (or older) VST3 SDK or JUCE version 5.3.2. You\r
+ // also need a VST2 license from Steinberg to distribute VST2 plug-ins.\r
+-#include "pluginterfaces/vst2.x/aeffect.h"\r
+-#include "pluginterfaces/vst2.x/aeffectx.h"\r
++#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
+ }\r
\r
+ using namespace juce;\r
+@@ -124,7 +123,6 @@
+  #pragma pack (push, 8)\r
+ #endif\r
\r
+-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
\r
+ #include "../utility/juce_IncludeModuleHeaders.h"\r
+ #include "../utility/juce_FakeMouseMoveGenerator.h"\r
+--- 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\r
\r
+ #define VST_FORCE_DEPRECATED 0\r
+-#define JUCE_VSTINTERFACE_H_INCLUDED 1\r
\r
+ namespace Vst2\r
+ {\r
+@@ -58,8 +57,7 @@
+ // paths or use the "VST (Legacy) SDK Folder" field in the Projucer. The VST2\r
+ // SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or older) VST3\r
+ // SDK or JUCE version 5.3.2.\r
+-#include <pluginterfaces/vst2.x/aeffect.h>\r
+-#include <pluginterfaces/vst2.x/aeffectx.h>\r
++#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"\r
+ }\r
\r
+ #include "juce_VSTCommon.h"\r
+@@ -81,6 +79,9 @@
\r
+ #include "juce_VSTMidiEventList.h"\r
\r
++#define resvd2 hostSpace2\r
++#define nanoSeconds systemTimeNanoseconds\r
++\r
+ #if JUCE_MINGW\r
+  #ifndef WM_APPCOMMAND\r
+   #define WM_APPCOMMAND 0x0319\r
diff --git a/patches/jack-client-name.patch b/patches/jack-client-name.patch
new file mode 100644 (file)
index 0000000..ab7c416
--- /dev/null
@@ -0,0 +1,28 @@
+From: =?utf-8?q?IOhannes_m_zm=C3=B6lnig?= <umlaeute@debian.org>
+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 <JucePlugin_Name>.
+
+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 @@
\r
+ //==============================================================================\r
+ #ifndef JUCE_JACK_CLIENT_NAME\r
+- #define JUCE_JACK_CLIENT_NAME "JUCEJack"\r
++ #ifdef JucePlugin_Name\r
++ # define JUCE_JACK_CLIENT_NAME JucePlugin_Name\r
++ #else\r
++ # define JUCE_JACK_CLIENT_NAME "JUCEJack"\r
++ #endif\r
+ #endif\r
\r
+ struct JackPortIterator\r
diff --git a/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..78e7008
--- /dev/null
@@ -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 (file)
index 0000000..ba5f005
--- /dev/null
@@ -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 @@
\r
+         props.add (new TextPropertyComponent (subprojectsValue, "Xcode Subprojects", 8192, true),\r
+                    "Paths to Xcode projects that should be added to the build (one per line). "\r
+-                   "The names of the required build products can be specified after a colon, comma seperated, "\r
++                   "The names of the required build products can be specified after a colon, comma separated, "\r
+                    "e.g. \"path/to/MySubProject.xcodeproj: MySubProject, OtherTarget\". "\r
+                    "If no build products are specified, all build products associated with a subproject will be added.");\r
\r
diff --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..79422be
--- /dev/null
+++ b/rules
@@ -0,0 +1,87 @@
+#!/usr/bin/make -f
+# -*- mode: makefile; coding: utf-8 -*-
+# Copyright © 2015 IOhannes m zmölnig <umlaeute@debian.org>
+# 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 (executable)
index 0000000..6e955d0
--- /dev/null
@@ -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 <<EOL
+Usage: Projucer [--help] [options]
+
+The Projucer is JUCE's own software project management workbench.
+It provides a Graphical User Interface to create your own JUCE based projects,
+and allows you to create various build systems (Makefiles, XCode projects,
+Visual Studio Projects,...).
+
+Generic Options:
+
+ --help
+    get a list of available cmdline arguments
+EOL
+    ;;
+  -v|-V|--version)
+    #${PROJUCER} -h
+cat <<EOL
+JUCE
+Copyright © ROLI Ltd.
+EOL
+    ;;
+  *)
+    ;;
+esac
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/tests/control b/tests/control
new file mode 100644 (file)
index 0000000..424f4c1
--- /dev/null
@@ -0,0 +1,6 @@
+Tests: juce-unit-tests
+Depends: @, @builddeps@,
+ libjack-dev,
+ libogg-dev,
+ xvfb, xauth,
+Restrictions: allow-stderr
diff --git a/tests/juce-unit-tests b/tests/juce-unit-tests
new file mode 100644 (file)
index 0000000..efc0d6b
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+set -e
+
+
+dpkg-source --before-build `pwd`
+PCDEPS="jack flac vorbis vorbisenc vorbisfile ogg libjpeg libpng zlib"
+
+# resave the project with the system module-paths
+xvfb-run -a Projucer --resave extras/UnitTestRunner/UnitTestRunner.jucer
+# build the UnitTests
+make -C extras/UnitTestRunner/Builds/LinuxMakefile \
+       CFLAGS="$(pkg-config --cflags ${PCDEPS})" \
+       LDFLAGS="$(pkg-config --libs ${PCDEPS})" \
+       CONFIG=Release \
+       V=1
+# run the UnitTests
+./extras/UnitTestRunner/Builds/LinuxMakefile/build/UnitTestRunner
diff --git a/watch b/watch
new file mode 100644 (file)
index 0000000..b04c177
--- /dev/null
+++ b/watch
@@ -0,0 +1,4 @@
+# Run the "uscan" command to check for upstream updates and more.
+version=3
+opts=dversionmangle=s/[~+](dfsg|repack|ds)(\.?[0-9]*)?$// \
+  https://github.com/julianstorer/JUCE/releases .*/v?(\d\S*)\.tar\.gz