* Link with libatomic on armhf too.
[dgit import unpatched juce 5.4.4~repack0-3+rpi1]
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++[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++
--- /dev/null
--- /dev/null
++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=""
--- /dev/null
--- /dev/null
++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
++
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++
++# 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
--- /dev/null
--- /dev/null
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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.
--- /dev/null
--- /dev/null
++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.
--- /dev/null
--- /dev/null
++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
++
--- /dev/null
--- /dev/null
++/*
++ 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 */
--- /dev/null
--- /dev/null
++/*
++ 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 */
--- /dev/null
--- /dev/null
++/*
++ ==============================================================================
++
++ 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
--- /dev/null
--- /dev/null
++/*\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
--- /dev/null
--- /dev/null
++/*
++ ==============================================================================
++
++ 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
--- /dev/null
--- /dev/null
++#!/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
--- /dev/null
--- /dev/null
++#!/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}" \;
++
--- /dev/null
--- /dev/null
++/*
++ * 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;
++}
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++# Configuration file for git-buildpackage and friends
++
++[DEFAULT]
++pristine-tar = True
++sign-tags = True
++compression = xz
--- /dev/null
--- /dev/null
++#!/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/")
--- /dev/null
--- /dev/null
++BREAKING-CHANGES.txt
--- /dev/null
--- /dev/null
++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/
--- /dev/null
--- /dev/null
++extras/Projucer/Builds/LinuxMakefile/build/Projucer usr/bin
++debian/artifacts/juce.png usr/share/pixmaps/
++debian/Projucer.desktop usr/share/applications/
++usr/lib
--- /dev/null
--- /dev/null
++debian/artifacts/Projucer.1
--- /dev/null
--- /dev/null
++application/x-juce; Projucer '%s'; edit=Projucer '%s'; test=test "$DISPLAY" != ""; priority=2
--- /dev/null
--- /dev/null
++<?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>
--- /dev/null
--- /dev/null
++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
++
--- /dev/null
--- /dev/null
++doxygen/doc/* /usr/share/doc/juce-modules-source/apiref
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++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
--- /dev/null
--- /dev/null
++#!/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
--- /dev/null
--- /dev/null
++#!/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
--- /dev/null
--- /dev/null
++3.0 (quilt)
--- /dev/null
--- /dev/null
++Tests: juce-unit-tests
++Depends: @, @builddeps@,
++ libjack-dev,
++ libogg-dev,
++ xvfb, xauth,
++Restrictions: allow-stderr
--- /dev/null
--- /dev/null
++#!/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
--- /dev/null
--- /dev/null
++# 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